SendMessage function (winuser.h) 有意思的函数,不同窗口通信函数
SendMessage函数将程序消息发到Windows窗口管理器,然后转发给程序,让程序进行判断。同时可以转发字符串指针。
LRESULT SendMessage(
[in] HWND hWnd,
[in] UINT Msg,
[in] WPARAM wParam,
[in] LPARAM lParam
);
参数 [in] hWnd 类型。HWND 窗口的句柄,其窗口程序将接收该消息。如果这个参数是HWND_BROADCAST ((HWND)0xffff),消息将被发送到系统中的所有顶级窗口,包括禁用或不可见的无主窗口、重叠窗口和弹出窗口;
但消息不会被发送到子窗口。 消息发送受制于UIPI。一个进程的线程只能向完整性级别较低或相等的进程中的线程的消息队列发送消息。 [in] Msg 类型。UINT 要发送的消息。 关于系统提供的消息的列表,请参见系统定义的消息。 [in] wParam 类型。WPARAM 额外的消息特定信息。 [in] lParam 类型。LPARAM 额外的消息特定信息。
返回值 类型:LRESULT 返回值指定消息处理的结果;它取决于发送的消息。
当一个消息被UIPI封锁时,用GetLastError检索的最后一个错误被设置为5(拒绝访问)。
需要使用HWND_BROADCAST进行通信的应用程序应该使用RegisterWindowMessage函数来获得一个唯一的消息,用于应用程序之间的通信。
系统只对系统消息(那些在0到(WM_USER-1)范围内的消息)进行编组。要发送其他消息(那些>=WM_USER的消息)到另一个进程,你必须做自定义的marshalling。
如果指定的窗口是由调用线程创建的,那么窗口过程将作为一个子程序被立即调用。如果指定的窗口是由不同的线程创建的,系统会切换到该线程并调用相应的窗口过程。线程之间发送的消息只有在接收线程执行消息检索代码时才会被处理。发送线程被阻塞,直到接收线程处理该消息。然而,发送线程在等待其消息被处理时,会处理传入的非队列消息。为了防止这种情况,在设置SMTO_BLOCK的情况下使用SendMessageTimeout。关于非队列消息的更多信息,请参见非队列消息。
一个可访问性应用程序可以使用SendMessage向shell发送WM_APPCOMMAND消息以启动应用程序。这个功能不能保证对其他类型的应用程序有效。
WM_QUIT消息不与窗口相关联,因此永远不会通过窗口的窗口过程收到。
参考:
https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-sendmessage
https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-quit