Подтвердить что ты не робот

Как создать скрытое окно в С++

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 4

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

Ответ 5

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

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

ShowWindow(hWnd, SW_HIDE);

Ответ 6

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

MSDN говорит это как кто-то, упомянутый раньше.