PostMessage(hwnd,WM_SETTEXT,..)在PostMessage(hwnd,WM_QUIT,..)不起作用时不起作用

use*_*599 6 winapi visual-c++

我有2个应用程序,一个是隐藏窗口("hW"),另一个是控制台应用程序("CA"),我想从中发送命令到hW.在控制台应用程序中我得到了hW句柄,这是一个问题:如果我正在运行:

PostMessage(hwnd, WM_QUIT, NULL, NULL);
Run Code Online (Sandbox Code Playgroud)

一切正常,消息变为hW并将其关闭.但如果我正在发送

PostMessage(hwnd, WM_SETTEXT, NULL, (LPARAM)"texttext");
Run Code Online (Sandbox Code Playgroud)

消息根本没有.间谍++也表明消息没有达到hW.有什么特定的WM_SETTEXT,这可以防止它吗?提前致谢.

好.在这里找到答案http://cboard.cprogramming.com/windows-programming/72589-wm_settext-postmessage.html

Turns out the API tries to protect me against scope issues; PostMessage() 
always fails with WM_SETTEXT, or any other system-defined message that has
a pointer as a parameter.Which gets me to SendMessage(), which is not good,
because i wanted asynchronous messaging....


PPS
另外,看起来像

SendMessage(hwnd, WM_QUIT, NULL, NULL);
Run Code Online (Sandbox Code Playgroud)

没有做任何事情来瞄准app.Even在简单的测试应用程序,如

 HWND hNote;
 if (!(hNote=FindWindow(L"Notepad",NULL)))
        exit(1);
 SendMessage(hNote, WM_QUIT, NULL, NULL);
Run Code Online (Sandbox Code Playgroud)

PostMessage(hNote, WM_QUIT, NULL, NULL);
Run Code Online (Sandbox Code Playgroud)

作品.
所有这些对我来说都不合乎逻辑......是否有一些通用功能适用于任何类型的消息?

Dav*_*nan 8

不同的消息有不同的要求.有些需要发布到队列中.有些需要同步交付.因此,该系统旨在需要两种交付机制.

在这种情况下WM_SETTEXT,它总是需要同步传递.那是因为窗口管理器需要能够管理文本数据的生命周期.Raymond Chen谈到了这个问题:为什么我不能PostMessage WM_COPYDATA消息,但我可以用一个微小的超时SendMessageTimeout吗?

SendMessage当窗口处于另一个进程时,调用会有危险.如果其他进程挂起,那么您的进程也不会挂起.因为SendMessage是同步的.

解决方案是打电话SendMessageTimeout.这会将您的字符串数据封送到其他进程中.并且您可以设置超时以确保在其他进程挂起的情况下,您的进程可以避免这种命运.


小智 0

您想要做的是传达两个独立的进程,常规消息不起作用,但有一个可以解决问题:消息WM_COPYDATA可以在这里找到相关问题