Kann während der Schleife Hotkey nicht abrufen
-
Hallo Leute,
ich beschäftige mich seit ein paar Tagen mit C++. Ich möchte hier ein Programm schreiben das man durch Hotkey steuern kann.
Als Beispiel soll mit ALT + F2 die Schleife gestartet, bzw. mit ALT + F3 beendet werden. Mir ist wichtig das ich die Hotkeys auch funktionieren, sofern das Programm minimiert ist.Jedoch funktioniert das Beenden durch ALT + F3 nicht.
Danke schon mal!
MfG Moritz
#include <iostream> #include <windows.h> using namespace std; int main() { cout << "Welcome\n"; cout << "Press ALT + F2 to start the loop.\n"; cout << "Press ALT + F3 to stop the loop.\n"; Sleep(2000); RegisterHotKey(NULL, 1, MOD_ALT, 0x71); RegisterHotKey(NULL, 2, MOD_ALT, 0x72); MSG msg = { 0 }; while (GetMessage(&msg, NULL, MOD_ALT, 0) != 0) { if (msg.message == WM_HOTKEY) { if (msg.wParam == 1){ cout << "Hot Key activated : ALT + F2" << endl; while (msg.wParam != 2){ cout << "Loop is running! Press ALT + F3 to stop." << endl; Sleep(1000); } } return msg.wParam; } } }
-
Du holst in Deiner Schleife zw. Zeile 22 und 25 keine neuen Nachrichten ab. Wie soll Dir dann Windows mitteilen, daß Alt+F3 gedrückt wurde? Außerdem bist Du im falschen Forum.
-
Doch hier: while (msg.wParam != 2)
Dann sollte doch die Schleife so lange laufen bis ALF + F3 gedrückt wird. Da Hotkey 2 ALT + F3 ist.
-
Goast334 schrieb:
Doch hier: while (msg.wParam != 2)
Dann sollte doch die Schleife so lange laufen bis ALF + F3 gedrückt wird. Da Hotkey 2 ALT + F3 ist.
Und wer oder was verändert Deiner Meinung nach das msg.wParam?
Heiliger Geist?
Ich glaube der interessiert sich nicht für Deine IT.
-
hm ok. Wie soll ich dann die while schilfe machen?
Sie soll solange laufen bis der hotkey gedrückt wird
-
Goast334 schrieb:
hm ok. Wie soll ich dann die while schilfe machen?
Sie soll solange laufen bis der hotkey gedrückt wirdWas spricht dagegen GetMessage aufzurufen? Genau dafür wurde die Funktion gemacht. BTW: Dein Aufruf von GetMessage ist nicht korrekt, Du solltest statt MOD_ALT 0 übergeben.
-
Ich habs jetzt so gemacht:
Aber ich wollte ja das man für die Schleife den Hotkey nicht gedrückt halten muss, sondern sie soll dadurch abbrechen/anfangen.while (GetMessage(&msg, NULL, 0, 0) != 0) { if (msg.message == WM_HOTKEY) { if (msg.wParam == 1){ cout << "Hot Key activated : ALT + F2" << endl; while ((GetMessage(&msg, NULL, 0, 0) != 0)){ cout << "Loop is running! Press ALT + F3 to stop." << endl; Sleep(1000); } } return msg.wParam; } }
-
Die einzige Nachricht, wofür sich Deine innere Schleife interessiert, ist WM_POSTQUITMESSAGE, weil Du den Rückgabewert von GetMessage überprüfst. Ansonsten sind Dir die Nachrichten, die Deiner Anwendung geschickt werden, völlig wurscht. Und jetzt wunderst Du Dich, daß Dein Programm nicht das macht, was Du erwartest?
Sag Doch gleich, daß Du nicht nur mit C++ neu angefangen hast, sondern mit dem Programmieren ganz allgemein.
Lerne die Grundlagen der Programmierung.- Was sind Variablen
- Was sind Kontrollstrukturen
- Was ist der Unterschied zw. Parameter By Value und Parameter by Reference
Um nur die wichtigsten zu nennen.
Wenn Du Funktionen fremder Entwickler aufruifst, lerne die Doku dazu zu lesen und zu verstehen, damit Du erst gar nicht auf die Idee kommst, der Funktion völlig falsche Werte zu übergeben.
mfg Martin
-
Ich habe mir jetzt Dein Problem nochmal etwas genauer angeschaut. Mein Hinweis, in dr inneren Schleife GetMessage aufzurufen ist leider nicht optimal gewesen, weil GetMessage erst dann zurückkehrt, wenn eine Nachricht angekommen ist. Das war wohl der Grund, weshalb Du Alt+F2 festhalten musstest.
GetMessage kann man zwar auch benutzen, aber dann müsstest Du das eigentliche Doing der inneren Schleife in einen anderen Thread auslagern. Besser ist daher PeekMessage. Hier mal eine Variante, die funktioniert:#include <iostream> #include <windows.h> using namespace std; int main() { cout << "Welcome\n"; cout << "Press ALT + F2 to start the loop.\n"; cout << "Press ALT + F3 to stop the loop.\n"; Sleep(2000); RegisterHotKey(NULL, 1, MOD_ALT, 0x71); RegisterHotKey(NULL, 2, MOD_ALT, 0x72); MSG msg = { 0 }; while (GetMessage(&msg, NULL, 0, 0) != 0) { if (msg.message == WM_HOTKEY) { if (msg.wParam == 1 ) { cout << "Hot Key activated : ALT + F2" << endl; while( true ) { if( PeekMessage(&msg, (HWND)-1, 0, 0, PM_REMOVE ) && msg.message == WM_HOTKEY && msg.wParam == 2 ) { return msg.wParam; } cout << "Loop is running! Press ALT + F3 to stop." << endl; Sleep(1000); } } } } }
mfg Martin
P.S.: Sorry wegen dem falschen Hinweis.
-
Danke, dann werde ich mich mal mit PeekMessage auseinandersetzen