Как создать скрытое окно в C ++ - PullRequest
35 голосов
/ 23 января 2010

Как создать скрытое окно?

Цель этого окна - получать некоторые сообщения.

Ответы [ 6 ]

21 голосов
/ 23 января 2010

Когда вы создаете окно, опустите флаг WS_VISIBLE и не вызывайте ShowWindow.

14 голосов
/ 23 января 2010

В среде 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);
10 голосов
/ 23 января 2010

Вы можете следовать инструкциям здесь: https://docs.microsoft.com/en-us/windows/desktop/winmsg/window-features#message-only-windows

3 голосов
/ 23 января 2010

Вы звоните CreateWindow() или CreateWindowEx() как обычно, но не указываете стиль окна WS_VISIBLE. Конечно, ShowWindow() также не следует называть.

1 голос
/ 27 июля 2015

Если вам не нужно показывать окно, поскольку некоторые предлагают создать окно, опустите флаг WS_VISIBLE и не вызывайте ShowWindow.

Если нет при вызове showWindow () , добавьте параметр SW_HIDE .

ShowWindow(hWnd, SW_HIDE);
0 голосов
/ 14 августа 2012

Ааа, только что столкнулся с проблемой. Если вы не можете указать HWND_MESSAGE, может возникнуть непредвиденное поведение. Я использовал NULL, что НЕ правильно. В моем случае это вызвало то, что MS Excel потребовалось 10 или более секунд для загрузки файла xls, в то время как обычно это занимает менее секунды, когда мое приложение не запускалось!

MSDN говорит это, как кто-то упоминал ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...