2009-03-06 5 views
3

En utilisant les API Win32, est-il possible de créer une fenêtre ou une boîte de dialogue dans un thread puis de collecter des événements pour un autre thread?Est-ce que le HWND de CreateWindow/CreateDialog peut être GetMessage'd d'un autre thread?

Les HWND sont-ils liés aux threads?

En essayant l'exemple artificiel ci-dessous, je ne vois jamais GetMessage() fire.

 
HWND g_hWnd; 

DWORD WINAPI myThreadProc(LPVOID lpParam) 
{ 
    while(GetMessage(&msg, hWnd, 0, 0) > 0) 
    { 
     ... 
    } 

} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
    hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_MYDIALOG), 0, myDlgProc); 
    CreateThread(NULL, 0 myThreadProc, NULL, 0, NULL); 
    ... 
} 

Mais ici, je fais.

 
HWND g_hWnd; 
HINSTANCE g_hInstance; 

DWORD WINAPI myThreadProc(LPVOID lpParam) 
{ 
    hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_MYDIALOG), 0, myDlgProc); 

    while(GetMessage(&msg, hWnd, 0, 0) > 0) 
    { 
     ... 
    } 

} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
    g_hInstance = hInstance; 
    CreateThread(NULL, 0 myThreadProc, NULL, 0, NULL); 
    ... 
} 

Quelqu'un peut-il expliquer ce que je vois?

Répondre

5

No.

GetMessage renvoie les messages sur la file d'attente d'entrée de fil en cours. Le paramètre HWND est un filtre, de sorte que GetMessage ne renvoie que des messages dans la file d'attente d'entrée du thread en cours destinée à cette fenêtre.

Windows a une affinité de thread - les messages destinés à une fenêtre sont traités sur le thread créé et donc propriétaire de la fenêtre.

2

De l'MSDN:

La fonction GetMessage récupère un message de la file d'attente de messages de thread appelant

Donc non, ce que vous décrivez est pas directement possible.

2

Dans votre premier exemple, le dialogue et GetMessage se trouvent dans des unités d'exécution séparées. Et la documentation dit:

La fonction GetMessage récupère un message de la file d'attente de messages du thread appelant.

Le second exemple fonctionne depuis le thread appelant (pour GetMessage) est également propriétaire de la Dialog.

0

Dans votre exemple, le programme se termine après la création de la fenêtre.

Mais de toute façon, dans win32, tous les threads ont leur propre file d'attente.

Et toutes les files d'attente de messages reçoivent des messages pour les fenêtres créées dans ce thread.

voir:

http://msdn.microsoft.com/en-us/library/ms644928(VS.85).aspx (Utilisation des messages et message) Queues

http://msdn.microsoft.com/en-us/library/ms644936(VS.85).aspx (GetMessage Fonction)

0

Vous pouvez bien sûr changer la procédure de fenêtre qui gère les messages pour une fenêtre. Vérifiez la fonction SetWindowLong - http://msdn.microsoft.com/en-us/library/ms633591(VS.85).aspx - il existe certaines règles quant à l'espace d'adressage du nouveau proc. Je suggère d'utiliser un DLL. Une autre façon consiste à sous-classer la file d'attente des messages de la fenêtre.

-3

Bien sûr, vous pouvez!Utilisez simplement l'injection de code à distance! (Très classique!)

(noobs toujours répondre "non", car tout est toujours possible ...)

+1

HA! Si vous définissez «possible», «en faisant autre chose entièrement», alors oui, tout est possible. – Shog9

1

Utilisez AttachThreadInput.

+0

Impossible sur Windows CE/Mobile. –

+0

Recommander l'utilisation d'une API dangereuse, sans même mentionner les conséquences, est grossièrement négligent. **-1**. – IInspectable

Questions connexes