winapi - PostMessage(hwnd, WM_SETTEXT,..) 不起作用,而 PostMessage(hwnd, WM_QUIT,..) 起作用

标签 winapi visual-c++

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

PostMessage(hwnd, WM_QUIT, NULL, NULL);

一切正常,消息到达硬件并将其关闭。但是如果我正在发送

PostMessage(hwnd, WM_SETTEXT, NULL, (LPARAM)"texttext");

消息根本没有到达硬件。 Spy++ 还显示消息未到达硬件。 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....


P.P.S.
Also, looks like

SendMessage(hwnd, WM_QUIT, NULL, NULL);

不会对目标应用程序执行任何操作。即使在像

这样的简单测试应用程序中也是如此
 HWND hNote;
 if (!(hNote=FindWindow(L"Notepad",NULL)))
        exit(1);
 SendMessage(hNote, WM_QUIT, NULL, NULL);

同时

PostMessage(hNote, WM_QUIT, NULL, NULL);

有效。
所有这些对我来说看起来都不合逻辑...是否有一些通用函数可以正确处理任何类型的消息?

最佳答案

不同的消息有不同的要求。有些需要发布到队列中。还有一些需要同步交付。因此系统被设计为需要两种交付机制。

对于WM_SETTEXT,它始终需要同步传递。这是因为窗口管理器需要能够管理文本数据的生命周期。 Raymond Chen谈过这个问题:Why can't I PostMessage the WM_COPYDATA message, but I can SendMessageTimeout it with a tiny timeout?

当窗口位于另一个进程中时,调用 SendMessage 存在危险。如果其他进程挂起,您的进程也不会挂起。因为 SendMessage 是同步的。

解决办法是调用SendMessageTimeout 。这会将您的字符串数据编码到其他进程中。您可以设置超时,以确保在其他进程被挂起的情况下,您的进程可以避免这种命运。

关于winapi - PostMessage(hwnd, WM_SETTEXT,..) 不起作用,而 PostMessage(hwnd, WM_QUIT,..) 起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13366175/

相关文章:

c++ - 使用自定义字符串参数捕获抛出异常

c++ - 我如何在 VC++7 及更早版本中模拟 _set_abort_behavior?

c++ - 使用/RTC1 编译时有时会抑制警告 C4701

c++ - WinAPI 编辑控件不显示换行符

windows - 启用存储空间时获取物理磁盘的信息

windows - 获取正在运行的进程的分配内存区域

c++ - 如何使用没有运行时库的 VC++ 内部函数

C++ WINAPI 通过 GetProcAddress 调用导出函数

c++ - 如何避免 VS 中 unique_ptr 检查的性能警告?

visual-c++ - 何时使用调用约定