HWND und Message Problem



  • Deine Micha.

    was pasiert bei Windows wenn ich kein Window erstelle?



  • Platform SDK schrieb:

    The system automatically creates a message queue for each thread. If the thread creates one or more windows, a message loop must be provided; this message loop retrieves messages from the thread's message queue and dispatches them to the appropriate window procedures.

    Because the system directs messages to individual windows in an application, a thread must create at least one window before starting its message loop. Most applications contain a single thread that creates windows. A typical application registers the window class for its main window, creates and shows the main window, and then starts its message loop — all in the WinMain function.

    You create a message loop by using the GetMessage and DispatchMessage functions. If your application must obtain character input from the user, include the TranslateMessage function in the loop. TranslateMessage translates virtual-key messages into character messages. The following example shows the message loop in the WinMain function of a simple Windows-based application.

    Hmm, nu bin ich nich schlüssig 😉
    Man kann also ne Hotkey-Nachricht kriegen ohne ein Fenster erzeugt zu haben ?
    Was laut Doku von RegisterHotKey() einleuchtend klingt, aber wieder irgendwie widersprüchlich mit "a thread must create at least one window before starting its message loop." klingt...
    Naja, ich vermute mal DispatchMessage() in der message-loop wird dann eben die WndProc() gar nicht aufrufen, aber was steht dann in der MSG-Struktur als HWND ? - NULL ?



  • Marita schrieb:

    Deine Micha.

    was pasiert bei Windows wenn ich kein Window erstelle?

    Diese Frage ist doch vernünftig gestellt, und auch als solche zu 100% zu sehen.
    Was passiert?
    A - Es öfnet sich ein Konsolenfenster
    B - Es passiert gar nichts, aber mein Prog ist im Taskmanager zu sehen
    C - Ich bekomme Fehlermeldungen von Windows
    D - garnichts, aber ich kann Windows auch nicht verwenden, bzw. seine Funktionen die sich auf ein Fenster-Handle beziehen.

    Ungetestet hat es doch schon vorgegeben:

    If this parameter is NULL, WM_HOTKEY messages are posted to the message queue of the calling thread and must be processed in the message loop.

    Das geht auch, aber nur wenn ich einen WndProc habe die das verarbeitet und dazu brauch ich ein Fenster.
    @Marita, die Frage war mehr als Ironie zu sehen.



  • @geeky
    genau das mein ich bei diesem ganzen "Mediamarkt"-Spiel hier 👍



  • #include <windows.h>
    
    int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
    	RegisterHotKey(NULL, 1000, MOD_ALT, 'S');
    
    	MSG message;
    	while(GetMessage(&message, NULL, 0, 0))
    	{
    		if(message.message == WM_HOTKEY)
    		{
    			MessageBox(NULL, TEXT("Beende Anwendung..."), TEXT("Info"), MB_OK);
    			PostQuitMessage(0);
    		}
    
    		DispatchMessage(&message);
    	}
    
    	return message.wParam;
    }
    


  • ALT + S schrieb:

    #include <windows.h>
    
    int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
    	RegisterHotKey(NULL, 1000, MOD_ALT, 'S');
    	
    	MSG message;
    	while(GetMessage(&message, NULL, 0, 0))
    	{
    		if(message.message == WM_HOTKEY)
    		{
    			MessageBox(NULL, TEXT("Beende Anwendung..."), TEXT("Info"), MB_OK);
    			PostQuitMessage(0);
    		}
    		
    		DispatchMessage(&message);
    	}
    	
    	return message.wParam;
    }
    

    Jetzt mal erlich, das kennt doch jede sau, nur deine MesaggeBox will nen Handle und da giebst du den Desktop an, da aber dein Prog aktive ist siehst du die Messagebox nur als Button in der Taskleiste.
    Um alle vorzüge nutzen zu können wäre ein HWND immer zum vorteil.



  • Ist schon ok so. 🕶



  • Mit GetForegroundWindow() als Handle kommt es dann auch in den Vordergrund



  • Also nochmal, für RegisterHotKey(HWND,...) brauche ich ein HWND für die Message Abfrage nicht, das ist richtig, aber
    RegisterHotKey(NULL,...) schiebt den Hotkey dem Desktop unter, auch für alles andere wo ein HWND erwartet wird, bleibt nur noch NULL, also desktop.

    Findet ihr das nicht recht unsauber?
    Wenn, so wie der Fragende ja vorhat, ein Dialog erzeugt werden soll, bekommt er doch eh wieder ein HWND, also warum sollte er dann nicht von anfang an ein Fenster erstellen?



  • Das stimmt doch gar nicht was du da mit deinem Desktop erzählst.

    If this parameter is NULL, WM_HOTKEY messages are posted to the message queue of the calling thread and must be processed in the message loop.

    Da es sogar dokumentiert ist, wird es wohl nicht sehr unsauber sein.



  • Stimmt, hast recht das habe ich übersehen.

    Man das ganze hat mich sowieso verwirrt ("Fenstersüchtigichbin").

    Meine Frage war ja was passiert ohne Window?
    Wie geeky schon schrieb das es wiedersprüchlich sei, gut, in der Doku steht das man eine Messageloop erstellen kann:

    You create a message loop by using the GetMessage and DispatchMessage functions

    Das machen wir ja sonst auch, nur ruft Windows unsere WndProc auf die hier nicht vorhanden ist.
    Was steht in message.hwnd ? Die hInstance oder NULL, ok kann man testen, aber ich finde das seltsam.

    Windows sagt: ... mußt haben Fenster zum starten der Message loop...
    sagt aber auch: ...sendet an die Applikation....erstelle Message Loop mit GetMessage...

    Dem nach sind einige SDK aussagen falsch, zu einem sagt es das die Message an das Fenster gesendet wird, und zum anderen das die message an den Thread gesendet wird. Demnach erhält immer meine Applikation die Message beim aufruf von GetMessage() und erst mit DispatchMessage() sende ich es dem Fenster, bzw. der WndProc.

    in dem Beispiel wird die Message auch mit DispatchMessage weiter gegeben, aber wohin? also ist das doch da unötig, oder?
    Genau so ist es auch, keine WndProc vorhanden, also warum die Message ins leere schicken, so lassen wir es weg.

    Fazit, egal was ich habe ob Konsolenanwendung oder sonst was, mit GetMessage kann und werde ich Nachrichten erhalten, aber welche?

    ::: Da das Forum mal wieder ausgefallen war beim schreiben, habe ich mal getestet:::
    message.hwnd ist NULL.

    Auf der Art kann ich mir eine HotKey Palette erstellen, z.B. mit ALT+I den IE starten, mit Strg+E windows runter fahren etc.
    Das Prog lege ich im Autostart und gut ist. Also warum Fenster verstecken, wenn man keins brauch?
    Wäre die Doku da schlüssiger, hätten sicherlich einige ihre Progs so aufgelegt ohne Fenster verstecken.
    Und wenn man jetzt noch nen Hook setzt und den Prozess versteckt, hat man nen guten Spion!

    The MSG structure contains message information from a thread's message queue.

    Da steht Thread und nicht Window!

    Because Windows directs messages to individual windows in an application, a thread must create at least one window before starting its message loop.

    Hier steht wieder muß Window, bevor die Schleife beginnt!
    muß, muß gar nichts wie man sieht.

    Vor ewigkeiten hatte ich in einem Buch von nem "Profi" gelesen:
    "Um Windows Nachrichten bearbeiten zu können, benötigen wir ein Fenster..."
    Der wußte es auch nicht anders.

    Ich finde das Irreführend.


Anmelden zum Antworten