HWND und Message Problem
-
geeky schrieb:
Lässt sich das überhaupt kompilieren ? - Mir scheint als würde bei CreateWindow z.B. nen Parameter fehlen...
Ich probiere das nicht aus, ich liebe mein Computer

Edit: stimmt, CreateWindow erwartet 11 Parameter, da sind nur 10.
-
OK, des mit CreatWindow() funzt jetzt aber er macht jetzt das unsichtbare Fenster unsichtbar, bzw. sichtbar obwohl es hwnd1 hat und nicht hwnd

-
Für WM_HOTKEY Nachrichten brauchst du kein Fenster erstellen. Da diese gepostet werden kannst du sie in der Nachrichtenschleife behandeln.
MSG message; while(GetMessage(&message, NULL, 0, 0)) { if(message.message == WM_HOTKEY) { // deine Aktion } TranslateMessage(&message); DispatchMessage(&message); }
-
Ich glaub ich verstehe jetzt was du vorhast!
Du machst einen kleinen Fehler:
Wenn dein unsichtbares Fenster die HT_CTRL Nachricht erhält, wird ja die WndProc() des unsichtbaren Fensters aufgerufen.
Nun ist deine WndProc() ja so aufgebaut:
LRESULT CALLBACK WndProc (HWND hwnd (<-!!), UINT message, WPARAM wParam, LPARAM lParam)
Wenn du in der WndProc jetzt ShowWindow(hwnd, SW_HIDE); aufrufst - ist dein hwnd nicht dasselbe wie in der WinMain!!!
Deine WndProc kennt das hwnd aus der WinMain überhaupt nicht!Du müsste also dein "hwnd" als globale Variable anlegen, die du z.B.
controlWnd oder so nennst...
-
Steht ja auch beim hWnd Parameter:
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.
-
++C++ schrieb:
OK, des mit CreatWindow() funzt jetzt aber er macht jetzt das unsichtbare Fenster unsichtbar, bzw. sichtbar obwohl es hwnd1 hat und nicht hwnd

Sag mal niemmst du Drogen?

@Ungetest
nimmst du auch welche?
Für HotKeyRegistrierung brauch ich ein HWND, und für die MesageLoop auch.@++c++
schmeiß den Code über bord und fummel da drinn nicht mehr rum, das bringt nichts, mach das vernünftig von vorn, wir helfen dann auch, aber nicht mit diesem Code als Grundlage.@geeky
Hilfst du mit, wenn er den Code weg schmeißt?
Obwohl, wo für eigentlich? Das machen wir Samstagnacht wenn wir vom Saufen kommen.
-
MiC++ha: dumm? Das steht in der MSDN das es kein HWND brauch.
-
ungetestet schrieb:
MiC++ha: dumm? Das steht in der MSDN das es kein HWND brauch.
Was braucht kein HWND?
Die Nachrichten abfrage? ja
HotKey setzten, nein
Mit MessageLoop meinte ich die "WndProc"
war unglücklich ausgedrückt
und dafür brauch ich wieder ein HWND.Mal anders gefragt, was pasiert bei Windows wenn ich kein Window erstelle?
-
Mal anders gefragt, was pasiert bei Windows wenn ich kein Window erstelle?
Sag mal nimmst du Drogen?

-
++FU++ schrieb:
Mal anders gefragt, was pasiert bei Windows wenn ich kein Window erstelle?
Sag mal nimmst du Drogen?

Die Frage war schon ernst gemeint, btw. darauf bezogen zu vermeiden das ein Konsolenfenster aufgeht. Viele wissen es nicht, aber wie auch immer, ich liebe ja diese Gegensprüche von Unregistrierten, die dann bei konkreten Fragen nicht mehr Antworten können.
-
Stell mal deine Frage vernünftig.
-
Marita schrieb:
Stell mal deine Frage vernünftig.
Wenn meinst du jetzt damit?
-
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