建立接收消息的windows窗口

我以爲應該花點時間熟悉一下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相關的顯示。線程

相關文章
相關標籤/搜索