【发布时间】:2011-01-08 12:19:48
【问题描述】:
如何创建隐藏窗口?
这个窗口的目的是接收一些消息。
【问题讨论】:
标签: c++ user-interface winapi window
如何创建隐藏窗口?
这个窗口的目的是接收一些消息。
【问题讨论】:
标签: c++ user-interface winapi window
如果您不需要显示窗口, 正如一些人建议的那样创建窗口,省略 WS_VISIBLE 标志并且不要调用 ShowWindow。
如果调用showWindow()时没有,添加SW_HIDE参数。
ShowWindow(hWnd, SW_HIDE);
【讨论】:
啊,刚刚遇到一个问题。如果您未能指定 HWND_MESSAGE 可能会发生意外行为。我使用了不正确的 NULL。在我的情况下,它导致 MS Excel 需要 10 秒或更长时间来加载 xls 文件,而当我的应用程序未运行时,它通常需要不到一秒的时间!
MSDN 之前有人提到过。
【讨论】:
在 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。
创建窗口时,省略 WS_VISIBLE 标志,不要调用 ShowWindow。
【讨论】:
您照常调用CreateWindow() 或CreateWindowEx(),但不指定WS_VISIBLE 窗口样式。当然ShowWindow()也不应该被调用。
【讨论】: