【问题标题】:How to create a hidden window in C++如何在 C++ 中创建隐藏窗口
【发布时间】:2011-01-08 12:19:48
【问题描述】:

如何创建隐藏窗口?

这个窗口的目的是接收一些消息。

【问题讨论】:

    标签: c++ user-interface winapi window


    【解决方案1】:

    如果您不需要显示窗口, 正如一些人建议的那样创建窗口,省略 WS_VISIBLE 标志并且不要调用 ShowWindow。

    如果调用showWindow()时没有,添加SW_HIDE参数。

    ShowWindow(hWnd, SW_HIDE);
    

    【讨论】:

      【解决方案2】:

      啊,刚刚遇到一个问题。如果您未能指定 HWND_MESSAGE 可能会发生意外行为。我使用了不正确的 NULL。在我的情况下,它导致 MS Excel 需要 10 秒或更长时间来加载 xls 文件,而当我的应用程序未运行时,它通常需要不到一秒的时间!

      MSDN 之前有人提到过。

      【讨论】:

        【解决方案3】:

        在 win32/mfc 环境中,您需要做的是创建一个类并从 CWnd 继承,如下所示:

        class HiddenMsgWindow : public CWnd
        {
        ...
        }
        

        在该类的构造函数中,您将像这样实例化一个窗口:

        HiddenMsgWindow::HiddenMsgWindow()
        {
           CString wcn = ::AfxRegisterWndClass(NULL);
           BOOL created = this->CreateEx(0, wcn, _T("YourExcellentWindowClass"), 0, 0, 0, 0, 0, HWND_MESSAGE, 0);
        }
        

        这将为您提供一个隐藏的窗口,其中包含几乎准备好摇滚的消息泵。

        故事的其余部分是提供窗口消息和这些消息的处理程序之间的链接。

        这是通过向您的实现文件 (.cpp) 添加一些宏和消息处理程序来完成的,如下所示:

        BEGIN_MESSAGE_MAP(HiddenMsgWindow, CWnd)
           ON_MESSAGE(WM_USER + 1, DoNOOP)
        END_MESSAGE_MAP()
        
        LRESULT HiddenMsgWindow::DoNOOP(WPARAM wParam, LPARAM lParam)
        {
           AfxMessageBox(_T("Get Reaaady for a Ruuummmmmmmbllllle!"));
           return LRESULT(true);
        }
        

        然后你需要像这样在头文件中填写胶水的其余部分:

        class HiddenMsgWindow : public CWnd
        {
        public:
           HiddenMsgWindow();
        protected:
           afx_msg LRESULT DoNOOP(WPARAM wParam, LPARAM lParam);
        
           DECLARE_MESSAGE_MAP()
        
        }
        

        就像魔术一样,您有一个隐藏的窗口随时准备发送您的消息。

        为了使用此消息窗口,您将实例化类检索它的句柄并根据需要发送或发布消息。就像这样:

        HiddenMsgWindow *hmw = new HiddenMsgWindow();
        SendMessage(hmw->m_hWnd, WM_USER + 1, 0, 0);
        

        【讨论】:

        • 我为你编辑了它。查看源代码以了解如何格式化各种内容。 :] 代码应该缩进四个空格,你可以用反引号包围代码来做“内联代码”:`code`变成code
        【解决方案4】:

        创建窗口时,省略 WS_VISIBLE 标志,不要调用 ShowWindow。

        【讨论】:

        【解决方案5】:

        您照常调用CreateWindow()CreateWindowEx(),但不指定WS_VISIBLE 窗口样式。当然ShowWindow()也不应该被调用。

        【讨论】:

        • 伙计,你的答案和我一模一样 :)
        • 你们都忽略了你需要成为 HWND_MESSAGE 的孩子,msdn.microsoft.com/en-us/library/…
        • 你不需要 needmessage-only windows 并不意味着其他窗口类型不能做消息),但我猜想当您需要一个仅消息传递的窗口时它可以节省开销 - OP 没有指定。
        • “这个窗口的目的是接收一些消息。”
        • 是的,而不是“这个窗口的目的是只接收消息。”
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多