windows进程间通信的方式很多,通过获取窗口句柄,就可以用消息机制进行进程间的通信。
控制台程序不使用窗口,但可以通过创建不可见的窗口来使用消息机制进行进程间通信。
需要接受消息的进程,使用CreateWindow创建一个不可见的窗口,比如
HWND hWnd = CreateWindow(_T("STATIC"), _T("receiver"), 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
然后就可以悠然自得的WaitMessage了。
需要发送消息的进程,使用FindWindow来找接受消息进程创建的窗口: HWND hWndFind = FindWindow(_T("STATIC"), _T("receiver")); —— 不同的进程需要用不同的窗口名称,如果重复,窗口都可以创建,但是用FindWindow就只能找到最近创建的一个(关闭后,找次近创建的一个)
然后再获取创建窗口的线程id: DWORD threadid = GetWindowThreadProcessId(hWndFind, NULL);
就可以发送消息了:::PostThreadMessage(threadid, 0, NULL, NULL);
::PostThreadMessage(threadid, 10, NULL, NULL);
::PostThreadMessage(threadid, 30, NULL, NULL);
::PostThreadMessage(threadid, WM_QUIT, NULL, NULL);
通过线程id,只能用PostThreadMessage,处理是异步的。
虽然也有窗口句柄,可以通过SendMessage来进行同步处理,但这样的话,接收进程中创建的窗口还需要处理消息,这就不是想要的了。