web-dev-qa-db-fra.com

Comment créer une fenêtre cachée en C++

Comment créer une fenêtre cachée?

Le but de cette fenêtre est de recevoir des messages.

31
anand

Lorsque vous créez la fenêtre, omettez l'indicateur WS_VISIBLE et n'appelez pas ShowWindow.

20
Nathan Osman

Dans un environnement win32/mfc, vous devez créer une classe et hériter de CWnd comme ceci:

class HiddenMsgWindow : public CWnd
{
...
}

dans le constructeur de cette classe, vous instancieriez une fenêtre comme celle-ci:

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

Cela vous donne une fenêtre cachée avec une pompe de message presque prêt à basculer.

le reste de l'histoire consiste à établir le lien entre les messages de la fenêtre et les gestionnaires de ces messages.

Ceci est fait en ajoutant quelques macros et un gestionnaire de messages à votre fichier d'implémentation (.cpp) comme ceci:

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

Ensuite, vous devez remplir le reste de la colle dans le fichier d’en-tête comme ceci:

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

   DECLARE_MESSAGE_MAP()

}

Et comme par magie, vous avez une fenêtre cachée prête à diffuser vos messages.

Pour utiliser cette fenêtre de message, vous devez instancier la classe, récupérer son descripteur et envoyer ou poster des messages comme vous le souhaitez. Juste comme ça:

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

Vous appelez CreateWindow() ou CreateWindowEx() comme d'habitude, mais vous ne spécifiez pas le style de fenêtre WS_VISIBLE. Bien entendu, ShowWindow() ne devrait pas non plus être appelé.

3
Georg Fritzsche

Si vous n'avez pas besoin d'afficher la fenêtre, Comme certains suggèrent de la créer, omettez l'indicateur WS_VISIBLE et n'appelez pas ShowWindow.

Sinon, lorsque vous appelez showWindow () , ajoutez le paramètre SW_HIDE .

ShowWindow(hWnd, SW_HIDE);
1
Deadlock

Ahh, je viens de trouver un problème. Si vous ne parvenez pas à spécifier HWND_MESSAGE, des comportements inattendus peuvent se produire. J'ai utilisé NULL qui n'est pas correct. Dans mon cas, il a fallu 10 ou plus à MS Excel pour charger un fichier xls, alors que cela prend normalement moins d'une seconde lorsque mon application ne fonctionnait pas!

MSDN le dit comme quelqu'un mentionné auparavant.

0
user1228651