message-only 窗口及其操作

工程中想通过窗口进行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
    message-only 窗口及其操作_第1张图片
    通过上图我们可以看到,其实在调用CreateWindow 的时候,已经开始调用我们的WndProc 函数了,只是因为我们没有正确处理一些窗口消息,因此调用失败,当我们增加DefWindowProc 函数的调用后,CreateWindow 返回成功

  • 如何找到我们的窗口
    刚开始窗口这个窗口后,通过FindWindow 函数以及spy++均找不到我们的窗口标题以及类,但是通过指定的句柄却可以收发消息。
    后来看到如下网址:
    https://msdn.microsoft.com/en-us/library/windows/desktop/ms632599(v=vs.85).aspx#message_only
    message-only 窗口及其操作_第2张图片
    由此可得到查询message-obly 类型的窗口的方法:

FindWindowExA(HWND_MESSAGE, NULL, "类名", "窗口名");

至此我们可以通过窗口消息正常通信了

  • 不要忘了main 函数中的消息循环,什么都不是凭空而来的,Windows 消息机制的核心也就是这一个循环了

  • 以上

你可能感兴趣的:(学习笔记)