65.9K
CodeProject 正在变化。 阅读更多。
Home

如何创建仅消息窗口

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (16投票s)

2004年8月13日

2分钟阅读

viewsIcon

165799

downloadIcon

2733

一篇关于如何创建一个仅消息窗口的文章。

引言

一篇关于创建一个仅消息窗口类以及为什么这样做有用的文章。

背景

根据微软的说法

仅消息窗口 允许您发送和接收消息。 它不可见,没有 z 顺序,无法枚举,并且不接收广播消息。 该窗口只是分派消息。

简单来说:您可以向其发送消息 (PostMessageSendMessage)。 如果您有一个从它派生的类,您可以让它以类似于普通窗口的方式对来自代码其他区域的消息做出反应。

使用仅消息窗口的好处

  • 免费的消息队列。

    你是什么意思?

    如果您的系统是基于某种外部 IO 的消息系统,并且您需要一个排队工具,那么您的应用程序可以使用 PostMessage 将消息发布到隐藏窗口。 这些消息将在正常的 Windows 消息队列中排队。

  • 进程间/进程内通信

    你是什么意思?

    您的应用程序的另一部分(或外部应用程序)可以处理这些消息的到达。

我该如何创建一个?

实际上非常容易。

在处理消息的类中,按照以下步骤操作

  1. 让它继承自 CWnd,即使这意味着您要多重继承。
    //
    class CMyMessageOnlyWindowClass : public CWnd
    //
  2. 在构造函数或其他一些有用的初始化类型函数中,使用以下代码(根据需要进行更改)。
    //
    CString wnd_class_name = ::AfxRegisterWndClass(NULL);
    BOOL created = this->CreateEx(0,wnd_class_name, 
        "CMyMessageOnlyWindowClass",0 ,0 ,0 ,0 ,0 ,HWND_MESSAGE,0);
    //
  3. 要么注册您自己的 Windows 消息
    const CString THIS_IS_MY_MESSAGE_STRING = "THIS_IS_MY_MESSAGE_STRING";
    const UINT MY_REGISTERED_MESSAGE = 
                            ::RegisterWindowMessage(THIS_IS_MY_MESSAGE_STRING);
  4. 要么使用更简单的方法,例如
    const UINT MY__MESSAGE = WM_USER+14;
  5. 在您的 .h.cpp 文件中创建您的消息处理函数。

    首先是 .h

    afx_msg LRESULT DealWithMyRegisteredMsg(WPARAM wParam, LPARAM lParam);

    afx_msg LRESULT DealWithMyMsg(WPARAM wParam, LPARAM lParam);

    现在,是 cpp 文件

    LRESULT CMyMessageOnlyWindowClass::DealWithMyRegisteredMsg(WPARAM wParam, 
                                                                LPARAM lParam)
    { 
         AfxMessageBox("Chris is ready for a beer"); 
         return LRESULT(true); 
    }

    LRESULT CMyMessageOnlyWindowClass::DealWithMyMsg(WPARAM wParam, 
                                                          LPARAM lParam)
    { 
         AfxMessageBox("Chris is ready for a beer"); 
         return LRESULT(true); 
    }
  6. 添加消息映射
    BEGIN_MESSAGE_MAP(CMyMessageOnlyWindowClass, CWnd) 
         ON_REGISTERED_MESSAGE(MY_REGISTERED_MESSAGE, DealWithMyRegisteredMsg) 
         // or ON_MESSAGE(BLAH_MESSAGE,DealWithMyRegisteredMsg)
    END_MESSAGE_MAP()
  7. 现在,回到您的 .h 文件,在您的类的末尾 - 在所有函数和变量等等之后(但在“};”之前) – 粘贴

    DECLARE_MESSAGE_MAP()

    这表示“我将在我的类中使用消息映射”(好吧,我们刚刚定义了它)。

  8. 现在,当您想要发布到此窗口时,您只需要它的句柄……或者指向它的指针,您会发现它的行为应该像一个普通的窗口,只是您看不到它等等。

我还需要知道什么?

  1. FindWindow:如果您想使用 FindWindow,您需要注意 MSDN 中的说明……“要查找仅消息窗口,请在 FindWindowEx 函数的 hwndParent 参数中指定 HWND_MESSAGE。 此外,如果 hwndParenthwndChildAfter 参数都为 NULL,则 FindWindowEx 会搜索仅消息窗口以及顶级窗口。”
  2. 多重继承:当进行多重继承时,CWnd 需要放在第一位,例如;
    class CMyMessageOnlyWindowClass : public CWnd, public COtherClass
  3. 差不多就是这样,记住:你无法查看(看到)这个窗口!
© . All rights reserved.