Comment créer une fenêtre cachée?
Le but de cette fenêtre est de recevoir des messages.
Lorsque vous créez la fenêtre, omettez l'indicateur WS_VISIBLE et n'appelez pas ShowWindow.
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);
Vous pouvez suivre les instructions ici: https://docs.Microsoft.com/en-us/windows/desktop/winmsg/window-features#message-only-windows
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é.
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);
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.