(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
进程间消息通信的时候,在window下我们可以通过在主窗口上注册消息回调函数,来响应消息的处理:首先是定义一个唯一标识的消息id,然后定义并注册窗口消息回调函数来响应这个消息。
1. 注册消息ID:RegisterWindowMessage
UINT g_myMsgID = 0; // global data g_myMsgID = RegisterWindowMessage(“myWindows”); //推荐使用guid作为参数 |
2. 定义回调函数处理消息:LRESULT (CALLBACK *WinProc)(HWNDhWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
typedef LRESULT (CALLBACK *WinProc)(HWNDhWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); WinProc g_preProc = nullptr; // global data LRESULT CALLBACK newProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == g_myMsgID) { // 自定义的处理 } else { // 调用原处理 if (g_preProc != nullptr) { return g_preProc(hWnd, uMsg, wParam, lParam); } } return 0; } |
3. 设置回调函数:SetWindowLongPtr,类型GWLP_WNDPROC
HWND g_hWnd = nullptr; // global data g_hWnd = reinterpret_cast<HWND>(myWind.winId()); g_preProc=reinterpret_cast<WinProc>(::SetWindowLongPtr(g_hWnd, GWLP_WNDPROC, reinterpret_cast<__int64>(&newProc))); |
4. 发送注册类型的消息SendMessage
WPARAM wParam = 0; LPARAM lParam = 0; SendMessage(g_hWnd, g_myMsgID,wParam,lParam); |
5. 进程间消息通知
SendMessage可以用作进程间的通信,前提需要知道窗口的HWND,并且是进行一对一的通信;
BroadcastSystemMessage也可以用作进程间通信,以广播形式,实现1对多的消息通信,所有的进程都会收到该消息
一对一通信
g_myMsgID = RegisterWindowMessage(“myWindows”); SendMessage(g_hWnd, g_myMsgID,wParam,lParam); |
一对多通信
g_myMsgID = RegisterWindowMessage(“myWindows”); DWORD dwRecipients = BSM_APPLICATIONS; BroadcastSystemMessage(BSF_IGNORECURRENTTASK|BSF_POSTMESSAGE, &dwRecipients,g_myMsgID, wParam, lParam); |
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)