我以爲應該花點時間熟悉一下windows編程了,否則項目的代碼無法看啊。今天在家,實現了一個簡單的接收消息的windows窗口,能夠接收其餘進程發送過來的消息。ios
《windows程序設計》開頭就講了一個windows程序的基本框架,該例程建立了一個可視的窗口,步驟還挺多的。若是建立的窗口僅用於接收消息,那就簡單得多,不須要咱們註冊一個自定義的WNDCLASS,也不須要將界面顯示出來。編程
先看一下CreateWindow的幫助文檔:windows
http://msdn.microsoft.com/en-us/library/ms632679.aspx 框架
lpClassName能夠本身註冊,也能夠用系統預約義的,我在程序中用的是STATIC,若是這個參數填一個不存在的classname,那麼CreateWindow會返回NULL。用戶能夠自定義消息,須要從WM_USER開始定義,並且處理消息和發送消息的進程都須要知道這份定義。WndProc是窗口處理函數,是經過SetWindowLong向窗口註冊的。我寫的WndProc只處理了WM_USER + 100和WM_USER + 200消息,其餘的消息委託給DefWindowProc處理。函數
#include <tchar.h> #include <windows.h> #include <iostream> using namespace std; LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { TCHAR szText[MAX_PATH] = {0}; _stprintf(szText, _T("wParam=%d lParam=%d"), wParam, lParam); switch(message) { case WM_USER + 100: OutputDebugString(_T("WM_USER + 100")); OutputDebugString(szText); return 0; case WM_USER + 200: OutputDebugString(_T("WM_USER + 200")); OutputDebugString(szText); PostQuitMessage(0); return 0; default: OutputDebugString(_T("default")); OutputDebugString(szText); break; } return DefWindowProc (hwnd, message, wParam, lParam); } int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND hWnd = CreateWindow( _T("static"), _T("MsgRecv"), WS_OVERLAPPEDWINDOW,, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, NULL, NULL); if(hWnd != NULL && IsWindow(hWnd)) { SetWindowLong(hWnd, GWL_WNDPROC, (LONG) WndProc); } MSG msg; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; }
發送消息的進程實現比較簡單,先FindWindow找到窗口句柄,而後在SendMessage便可。在以下代碼中,我每隔10ms發送一個WM_USER + 100消息,發送100次後,我發送一個WM_USER + 200讓接收消息的窗口退出。ui
#include<windows.h> #include<tchar.h> #include<iostream> using namespace std; int main() { HWND hWnd = ::FindWindow(_T("static"), _T("MsgRecv")); if (hWnd) { for (int i = 1; i <= 100; i++) { ::SendMessage(hWnd, WM_USER + 100, WPARAM(i), NULL); Sleep(10); } ::SendMessage(hWnd, WM_USER + 200, NULL, NULL); cout << "finish send" << endl; } else { cout << "hwnd is null" << endl; } return 0; }
這樣一個接收消息的窗口程序就完成了。先運行建立窗口的進程,再運行發送消息的進程,在DebugView中就可以看到效果啦。spa
這個例子有不少應用場景,好比在客戶端UI中,須要顯示一個掃描線程的進度,其中,掃描進程用SendMessage上報進度,UI線程建立一個窗口接收進度信息,並在WndProc中作UI相關的顯示。線程