工程中想通过窗口进行IPC,而不需要可视化的窗口,于是创建如下窗口类型,其中调用CreateWindow 时父窗口传入了HWND_MESSAGE 以表示这是一个message-only 的窗口。
工程中想通过窗口进行IPC
#include <windows.h>
#include <stdio.h>
#define WINDOW_CLASS_NAME TEXT("DemoClass")
#define WINDOW_CAPTION_NAME TEXT("DemoCaption")
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
printf("hWnd:%x\tMssage:%x\twParam:%x\tlParam:%x\n", hWnd, message, wParam, lParam);
return ::DefWindowProc(hWnd, message, wParam, lParam);
}
BOOL CreateDemoWindow()
{
WNDCLASSEX wc = { 0 };
ATOM ret;
HWND hwnd;
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.hInstance = GetModuleHandle(NULL);
wc.lpszClassName = WINDOW_CLASS_NAME;
ret = RegisterClassEx(&wc);
if (ret == NULL && GetLastError() != ERROR_CLASS_ALREADY_EXISTS)
{
printf("RegisterClassEx Fail:%d\r\n", GetLastError());
return FALSE;
}
hwnd = CreateWindow(WINDOW_CLASS_NAME, WINDOW_CAPTION_NAME, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, GetModuleHandle(NULL), 0);
printf("hwnd:%x\r\n", hwnd);
if (!::IsWindow(hwnd))
return FALSE;
::UpdateWindow(hwnd);
return TRUE;
}
int main()
{
MSG msg;
printf("CreateDemoWindow:%s", CreateDemoWindow() ? "TRUE" : "FALSE");
while (::GetMessage(&msg, NULL, 0, 0))
{
// 转化键盘消息
::TranslateMessage(&msg);
// 将消息发送到相应的窗口函数
::DispatchMessage(&msg);
}
getchar();
getchar();
return 0;
}
关键点说明:
WndProc 消息处理函数中,对于我们不处理的消息一定要调用:DefWindowProc 否则CreateWindow 失败,且返回:126
通过上图我们可以看到,其实在调用CreateWindow 的时候,已经开始调用我们的WndProc 函数了,只是因为我们没有正确处理一些窗口消息,因此调用失败,当我们增加DefWindowProc 函数的调用后,CreateWindow 返回成功如何找到我们的窗口
刚开始窗口这个窗口后,通过FindWindow 函数以及spy++均找不到我们的窗口标题以及类,但是通过指定的句柄却可以收发消息。
后来看到如下网址:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms632599(v=vs.85).aspx#message_only
由此可得到查询message-obly 类型的窗口的方法:
FindWindowExA(HWND_MESSAGE, NULL, "类名", "窗口名");
至此我们可以通过窗口消息正常通信了
不要忘了main 函数中的消息循环,什么都不是凭空而来的,Windows 消息机制的核心也就是这一个循环了
以上