В среде 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);