Как создать скрытое окно?
Цель этого окна - получить некоторые сообщения.
Как создать скрытое окно?
Цель этого окна - получить некоторые сообщения.
Когда вы создаете окно, опустите флаг WS_VISIBLE и не вызывайте ShowWindow.
В среде 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);
Вы можете выполнить следующие инструкции: http://msdn.microsoft.com/en-us/library/ms632599(VS.85).aspx#message_only
Вы вызываете CreateWindow()
или CreateWindowEx()
как обычно, но не указываете стиль окна WS_VISIBLE
. Конечно, ShowWindow()
также не следует вызывать.
Если вам не нужно показывать окно, поскольку некоторые предлагают создать окно, опустить флаг WS_VISIBLE и не вызывать ShowWindow.
Если нет, когда вы вызываете showWindow(), добавьте параметр SW_HIDE.
ShowWindow(hWnd, SW_HIDE);
А, просто наткнулся на проблему. Если u не указал HWND_MESSAGE, может возникнуть непредвиденное поведение. Я использовал NULL, который НЕ является правильным. В моем случае это вызвало то, что MS Excel занял 10 или более человек, чтобы загрузить файл xls, в то время как обычно мое приложение не работает, но не больше секунды.
MSDN говорит это как кто-то, упомянутый раньше.