it-swarm.dev

So erstellen Sie ein verstecktes Fenster in C++

Wie erstelle ich ein verstecktes Fenster?

Der Zweck dieses Fensters besteht darin, einige Nachrichten zu empfangen.

31
anand

Lassen Sie das WS_VISIBLE-Flag weg, und rufen Sie ShowWindow nicht auf, wenn Sie das Fenster erstellen.

20
Nathan Osman

In einer win32/mfc-Umgebung müssen Sie eine Klasse erstellen und von CWnd wie folgt erben:

class HiddenMsgWindow : public CWnd
{
...
}

im Konstruktor dieser Klasse würden Sie ein Fenster wie folgt instanziieren:

HiddenMsgWindow::HiddenMsgWindow()
{
   CString wcn = ::AfxRegisterWndClass(NULL);
   BOOL created = this->CreateEx(0, wcn, _T("YourExcellentWindowClass"), 0, 0, 0, 0, 0, HWND_MESSAGE, 0);
}

Dadurch erhalten Sie ein verstecktes Fenster mit einer Nachrichtenpumpe, die fast zum Wackeln bereit ist.

der Rest der Geschichte besteht darin, die Verbindung zwischen den Fensternachrichten und den Handlern für diese Nachrichten bereitzustellen.

Dazu fügen Sie Ihrer Implementierungsdatei (.cpp) einige Makros und einen Message-Handler hinzu:

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);
}

Dann müssen Sie den Rest des Klebers wie folgt in die Kopfdatei einfügen:

class HiddenMsgWindow : public CWnd
{
public:
   HiddenMsgWindow();
protected:
   afx_msg LRESULT DoNOOP(WPARAM wParam, LPARAM lParam);

   DECLARE_MESSAGE_MAP()

}

Und wie bei Zauberei haben Sie ein verstecktes Fenster, um Ihre Nachrichten zu pushen.

Um dieses Nachrichtenfenster zu verwenden, würden Sie die Klasse instanziieren, ihr Handle abrufen und Nachrichten wie gewünscht senden oder posten. Genau wie dieser:

HiddenMsgWindow *hmw = new HiddenMsgWindow();
SendMessage(hmw->m_hWnd, WM_USER + 1, 0, 0);
14
Slaftos
9
ta.speot.is

Sie rufen wie üblich CreateWindow() oder CreateWindowEx() auf, geben jedoch nicht den WS_VISIBLE-Fensterstil an. Natürlich sollte auch ShowWindow() nicht aufgerufen werden.

3
Georg Fritzsche

Wenn Sie das Fenster nicht anzeigen müssen, . Einige schlagen vor, das Fenster zu erstellen, lassen Sie das WS_VISIBLE-Flag weg und rufen Sie nicht ShowWindow auf.

Falls nicht, wenn Sie showWindow () aufrufen, fügen Sie den Parameter SW_HIDE hinzu.

ShowWindow(hWnd, SW_HIDE);
1
Deadlock

Ahh, bin gerade auf ein Problem gestoßen. Wenn Sie HWND_MESSAGE nicht angeben, können unerwartete Verhaltensweisen auftreten. Ich habe NULL verwendet, was NICHT korrekt ist. In meinem Fall hat MS Excel 10 Sekunden oder mehr benötigt, um eine XLS-Datei zu laden, während es normalerweise weniger als eine Sekunde dauert, wenn meine App nicht ausgeführt wird!

MSDN sagt dies als jemand, der zuvor erwähnt wurde.

0
user1228651