2012-04-04 13 views
1

Hallo, ich bin neu in Windows32 Programmierung und ich habe ein paar Fragen-:Anzeigen von Win32-Nachrichten

Wenn ich den folgenden Code in einem Programm verwenden, es funktioniert -:

while(GetMessage(&msg,NULL,0,0)) 
    { 
    TranslateMessage(&msg);         
    DispatchMessage(&msg); 
} 

Aber wenn Ich ersetze null von GetMessage zu hwnd (das Handle des gerade erstellten Fensters) das scheint nicht zu schließen, es bleibt immer noch im Hintergrund laufen. Warum passiert das, wenn ich NULL durch hwnd ersetze, bedeutet das, dass ich Nachrichten für nur ein Fenster empfange, warum funktioniert das dann nicht ????

while(GetMessage(&msg,hwnd,0,0)) 
    { 
    TranslateMessage(&msg);         
    DispatchMessage(&msg); 
} 

Durch die Art und Weise der Fenster-Funktion ist-:

LRESULT CALLBACK WinProc(HWND hWnd, UINT message, 
           WPARAM wparam, LPARAM lparam){ 

    switch(message){ 
       case WM_DESTROY: 
        PostQuitMessage(0); 
        break; 
       default: 
       return DefWindowProc(hWnd, message, wparam, lparam); 
       } 
    return 0; 
} 

Secondly-:

Gibt es eine Möglichkeit, alle Nachrichten zu einem bestimmten Fenster gesendet sehen ????

Thirdly-:

Was ist der Grund für Schreiben __stdcall (WINAPI), wenn meine Windows-Programme kompilieren ????

Eine schnelle Antwort würde geschätzt werden. Danke.

+1

Im Hinblick auf den zweiten Teil Ihrer Frage, [Spy ++] (http://msdn.microsoft.com/en-us/library/dd460726.aspx) können Sie die Meldungen zeigen an bestimmte Fenster gesendet werden . –

Antwort

1

PostQuitMessage generiert WM_QUIT, die von der Nachrichtenwarteschlange verarbeitet wird, aber nicht mit einem bestimmten Fenster verknüpft ist. Wenn Sie nur hwnd Nachrichten in Ihrem Anruf an GetMessage filtern, verarbeiten Sie WM_QUIT nicht.

alle Nachrichten Bezug zu sehen ist, um ein Fenster/Thread/Prozess gesendet, siehe https://stackoverflow.com/questions/4038730/i-am-looking-for-a-windows-spy-application

Schließlich bezüglich __stdcall, What does "WINAPI" in main function mean?

+0

Gibt es eine Nachricht, die gesendet wird, sobald ein Fenster vollständig initialisiert ist, wenn die gesamte Anzeige auf den Bildschirm gezeichnet wurde? – Sreyan

+0

Zu welchem ​​Zweck? Nicht alle Fenster werden angezeigt. Es gibt 'WM_PAINT' oder' WM_CREATE' - beides könnte für Sie funktionieren. – tenfour

+0

wann wird wm_create gesendet ???? – Sreyan

3
  1. GetMessage kehrt 0 (Herstellung des Schleifenende) sehen nur, wenn es empfängt eine WM_QUIT, aber eine WM_QUIT ist keinem bestimmten Fenster zugeordnet, so dass es nie empfangen wird, wenn Sie eine GetMessage haben, die nur Nachrichten für eine bestimmtefragt 0.

  2. Wenn es ein Fenster von Ihnen ist, sehen Sie sie bereits in ihrem Fenster-Verfahren; Wenn Sie sie filtern möchten, bevor Sie sie an ihre Fensterprozedur senden, können Sie die Struktur msg überprüfen, die von GetMessage aufgefüllt wird, bevor Sie DispatchMessage aufrufen.

  3. Das gesamte Windows-API verwendet die stdcall Aufrufkonvention (ich glaube, weil es etwas schneller ist/produziert weniger Standardcode als die üblichen cdecl), so dass Ihre Rückrufe muss auch, dass die Aufrufkonvention folgen. Beachten Sie, dass Sie WINAPI (d. H. stdcall) nur für Funktionen verwenden müssen, die von Windows-API-Funktionen aufgerufen werden. Für die anderen können Sie die von Ihnen gewünschte Aufrufkonvention verwenden.

+0

Ungefähr 2), kommen nicht alle Nachrichten von GetMessage: Nachrichten, die (synchron) als Teil der anderen Nachrichtenverarbeitung gesendet werden, werden als verschachtelter Aufruf an die Fensterprozedur übergeben, jetzt von der Schleife. Und übrigens, WM_QUIT ist einer von diesen, da es normalerweise eine * Antwort * zu etwas anderem ist, wie ein Klick auf den Schließen-Knopf oder eine Antwort auf einen "Schließen" -Befehl und dergleichen. –

+0

@Emilio: alles korrekt, in Fakten, da er die Fensterprozeduren besitzt, ist der korrekte Weg, alle Nachrichten, die auf ein Fenster von ihm gerichtet sind, zu sehen, sie einfach in dem entsprechenden wndproc zu überprüfen. –

+0

Gibt es eine Nachricht, die gesendet wird, sobald ein Fenster vollständig initialisiert ist, wenn die gesamte Anzeige auf den Bildschirm gezeichnet wurde ??? – Sreyan