RegisterHotKey frage
-
sorry irgendwas ist mit meinem compiler nicht in ordnung...!? erst gehts nicht... dann spiel ich etwas damit rum und jetzt gehts doch...
echt krank!
also ich hatte zwischendurch mal aus BYTE int gemacht oder aus GetHotKey GetAsyncHotKey und DANN WIEDER SO WIE ES VORHER WAR!
und jetzt gehts... naja vielen dank @WebFritzi
-
Du meintest wohl GetKeyState und GetAsyncKeyState
-
genau
ist mir auch noch aufgefallen... war aber dann zu spät... wollte dann nicht nochmal nerven *g* hast recht: hatte mit GetKeyState und GetAsyncKeyState rumgespielt...
aber ich habe noch ne frage...
case WM_HOTKEY: { BYTE b = HIBYTE (GetAsyncKeyState('B')); BYTE c = HIBYTE (GetAsyncKeyState('C')); if(b && c) MessageBox(NULL, TEXT("HALLO"), TEXT("HotKey"), MB_OK | MB_ICONINFORMATION); SendMessage (hwnd, WM_DESTROY, wParam, lParam); return 0; }
^^ so hab ich es jetzt gemacht... kann ich noch abfangen, dass wirklich NUR wenn die tasten b, c und meine HOTKEY kombi ( RegisterHotKey(hwnd, ID_HOTKEY1, MOD_CONTROL | MOD_ALT | MOD_SHIFT, 'A'); ) gedrückt wurden die aktion beginnt sprich: wenn jemand noch 'D' oder 'F' gleichzeitig dazu drückt, dass dann nichts passiert??
also natürlich nicht nur für 'D' und 'F' sondern für alle anderen "unbeteiligten" Tasten...
-
einfacher ausgedrückt: es soll nicht gehen, wenn man einfach ALLE tasten gleichzeitig drückt
muss doch auch einfacher gehen, als alle tasten einzeln abzufragen ;)))
-
Wozu? Ist doch sonst auch nicht üblich
-
nö... also wenn niemand ne bessere lösund weiß, werde ich einfach ein paar tasten abfangen, die nicht zusätzlich gedrückt werden können
-
Schau mal unter GetKeyboardState() nach. Das sollte klappen.
-
@ WebFritzi: kannst du mir ein code beispiel geben? ich habe das mit der funktion auch schon versucht, aber es funktioniert nich...
so wie ich es jetzt habe, muss ja die hotkeytaste als letzes gedrückt werden, denn dann wird ja getestet, ob die anderen auch gedrückt SIND... irgendwie liefert mir die GetKeyboardState() funktion keine aktuellen werte... das klappt bei mir nur mit dem HIBYTE, den GetKeyState zurückgibt...
-
floppy schrieb:
irgendwie liefert mir die GetKeyboardState() funktion keine aktuellen werte...
Dann zeig mal Code her!
-
Du solltest hier auf jeden Fall angeben, ob du auch auf die Tastenkombi reagieren willst, wenn gerade eine andere Anwendung im Vordergrund ist. Wenn das so ist, dann musst du nach dem Empfangen von WM_HOTKEY noch AttachThreadInput() aufrufen. Um in dieser Funktion die Parameter anzugeben, schau dir mal die Funktionen GetCurrentThreadId() und GetWindowThreadProcessId() an.
-
ja genau... hatte ich das nicht gesagt? also wenn das fenster focusiert ist, ginge das auch mit GetKeyboardState... so hatte ich das ja auch vorher...neenee das prog soll auch reagieren, wenn die kombi sonstwo aufgerufen wird, dass ist ja das komplizierte
-
OK, dann ist dein Problem folgendes:
MSDN schrieb:
An application can call this function to retrieve the current status of all the virtual keys. The status changes as a thread removes keyboard messages from its message queue. The status does not change as keyboard messages are posted to the message queue.
D.h., wenn keines deiner Fenster aktiviert ist, ändert sich der/die/das KeyboardState nicht, wenn eine Taste gedrückt wird. Um das zu umgehen, benutzt du AttachThreadInput(), wie ich es dir oben beschrieben habe. Und vergiss am Ende nicht AttachThreadInput() nochmals aufzurufen mit FALSE im letzten Parameter!
-
kurze frage:
ich hatte das ja bis her so gemacht:
case WM_HOTKEY: { //müssen gedrückt sein: BYTE b = HIBYTE (GetAsyncKeyState('B')); BYTE c = HIBYTE (GetAsyncKeyState('C')); //dürfen nicht gedrückt sein: BYTE d = HIBYTE (GetAsyncKeyState('D')); BYTE e = HIBYTE (GetAsyncKeyState('E')); BYTE f = HIBYTE (GetAsyncKeyState('F')); if(b && c && !d && !e && !f) MessageBox(NULL, TEXT("HALLO"), TEXT("HotKey"), 0); return 0; }
(hotkey ist beispielsweise 'STRG' + 'A')
und es funktioniert... ist zwar lästig so viele tasten abzufragen und zu schauen, ob die nun gedrückt sind oder nicht, aber es geht.
das gleiche gilt doch auch für die funktion: GetKeyboardState() oder? da muss ich doch auch noch einzeln abfragen was NICHT gedrückt wurde!?!?
läuft das dann sicherer? schneller? weniger code? oder wieso ist diese funktion der anderen gegenüber vorzuziehen?
-
BYTE cBuf[256]; GetKeyboardState(cBuf); if(cBuf['B']&0x80 && cBuf['C']&0x80)
so frisst es die laptop tastatur wenigstens
also den vorteil hab ich... dass er auch reagiert, wenn ich ein anderes prog focusiert habe guck ich mir morgen an... ich geh erstmal pennen
-
floppy schrieb:
so frisst es die laptop tastatur wenigstens
also den vorteil hab ich...
Na, das hört sich ja schonmal gut an...
-
HWND currentTop; currentTop = GetForegroundWindow(); AttachThreadInput (GetWindowThreadProcessId (currentTop, NULL), GetCurrentThreadId(), TRUE); //AttachThreadInput (GetWindowThreadProcessId (hwnd, NULL), GetCurrentThreadId(), TRUE); BYTE cBuf[256]; GetKeyboardState (cBuf); //AttachThreadInput (GetWindowThreadProcessId (hwnd, NULL), GetCurrentThreadId(), FALSE); AttachThreadInput (GetWindowThreadProcessId (currentTop, NULL), GetCurrentThreadId(), FALSE); if (cBuf['B']&0x80 && cBuf['C']&0x80) { MessageBox oder sonst ne aktion }
so geht es eingermaßen..., aber leider nur bei jedem 2. mal (also es geht immer einmal, dann wieder einmal nicht
)
ob tasten gedrückt wurden, die nicht dazugehören müsste ich hier auch noch extra. und auf dem laptop gehts auch nicht
was tun? ich könnte es wieder mit GetKeyState() machen, dann geht es wenigstens jedes mal und nicht jedes zweite...
-
ich habe das mittlerweile mal ganz anders versucht. ganz ohne HOTKEY... einfach mit PeekMessage() und dann alles in eine funktion
aber das ist noch verbugter *lol* also funktioniert schon in der regel, aber ich glaub ich mach das einfach wieder mit GetKeyState und frag die alle ab, wenn WM_HOTKEY gesendet wurde, dass war noch am zuverlässigsten