Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Merkwürdiges Problem mit Kbd Hook (https://www.delphipraxis.net/54680-merkwuerdiges-problem-mit-kbd-hook.html)

T3rm1n4T0r 9. Okt 2005 17:23


Merkwürdiges Problem mit Kbd Hook
 
Hi,
ich hab mir einen KeyboardHook geschrieben, der eine Message and das Hauptprogramm sendet, damit ich dort alles auswerten kann.
Das Ganze sieht so aus:
Delphi-Quellcode:
function KbdHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  Result := CallNextHookEx(Keyboard_HookHandle, nCode, wParam, lParam);
  case nCode < 0 of
    True: exit; // nicht anrühren wenns negativ ist
    False:
      begin
        case ((lParam and $80000000) = 0) of
          True: ; // WM_KEYDOWN
        else // WM_KEYUP
          SendMessage(HWND_BROADCAST,myMsg3,wParam,lParam);
        end;
      end;
  end;
end;
Mein Problem ist jetzt, dass wenn ich in einem Spiel (in meinem Fall Warcraft III) eine Taste drücke, dann wird die Message zweimal gesendet. In Windows passiert dies auch manchmal. Undzwar wenn ich in einem Edit das auf der Form liegt eine Taste drücke. Hat das Edit keinen Focus, dann kommt die Message einmal an, so wie es sein soll?
Hat jemand eine Idee, was da los ist und wie ich das in den Griff bekommen kann?

Rastaman 9. Okt 2005 17:24

Re: Merkwürdiges Problem mit Kbd Hook
 
Das liegt daran weil sie auch wirklich 2 mal gesendet wird.
Einmal für KeyDown und einmal für KeyUp.
Guck mal in der Forensuche da findest du 100%ig was.

//Edit: Moment, irgendwas verwechsel ich da...Vergiss es :mrgreen:

T3rm1n4T0r 10. Okt 2005 17:40

Re: Merkwürdiges Problem mit Kbd Hook
 
Keiner ne Idee, was das falsch läuft?

T3rm1n4T0r 11. Okt 2005 15:14

Re: Merkwürdiges Problem mit Kbd Hook
 
Also, erklären kann ich es mir immer noch nicht, warum das so ist. Allerdings lässt sich das Problem lösen indem man zusätzlich noch überprüft ob GetAsyncKeyState(vkc) = 0 ist. Das müsste zawr immer 0 sein, da ich ja das 32 Bit prüfe ob es gesetzt ist, aber irgendwie is da alles komisch :P

Flocke 11. Okt 2005 15:27

Re: Merkwürdiges Problem mit Kbd Hook
 
Tipp: schreib in deiner Hook-Routine ein OutputDebugString mit nCode, wParam und lParam hinzu. Das kannst du in Delphi unten in der Meldungsliste sehen wenn du die eigentliche Anwendung debuggst (oder mit diesem Programm). Überprüfe dann an den Werten, ob sich die zweite (doppelte) Taste irgendwie von der ersten unterscheidet...

T3rm1n4T0r 11. Okt 2005 19:23

Re: Merkwürdiges Problem mit Kbd Hook
 
Also hab das mal mit lparam gemacht und wenn ich keine Taste loslassen, dann erscheinen da unten bei Delphi 4 gleiche Nachrichten. Was bedeutet das jetzt?

LoRd-MuldeR 11. Okt 2005 19:29

Re: Merkwürdiges Problem mit Kbd Hook
 
Zitat:

Zitat von T3rm1n4T0r
Wie wandel ich denn wParam und lParam in nen string um?

IntToStr :zwinker:

Flocke 11. Okt 2005 21:09

Re: Merkwürdiges Problem mit Kbd Hook
 
Zitat:

Zitat von T3rm1n4T0r
... und wenn ich keine Taste loslassen ...

??? Wie meinst du das ???

Probier mal alle Parameter auszugeben:
Delphi-Quellcode:
OutputDebugString(PChar(Format('KbdHookProc($%8.8x, $%8.8x, $%8.8x)', [nCode, wParam, lParam])));
... und dann solltest du das natürlich insbesondere für die Fälle ausprobieren, wo du zweimal dieselbe Taste bekommst.

T3rm1n4T0r 11. Okt 2005 22:36

Re: Merkwürdiges Problem mit Kbd Hook
 
Irgendwie hab ich da Mist geschrieben. Also interessant ist nur lParam, da wParam sich nur von Taste zu Taste unterscheidet.
OutputDebugString hab ich direkt unter SendMessage eingebaut, also in KeyUp Case! Wenn nun dieses Ereignis eintritt ( ich lasse eine Taste los :)), dann erscheinen bei Delphi 4 gleiche nachrichten mit dem gleichen lParam Wert.
Was das nun bedeutet weiß ich nicht. Ich denk man, dass das Ereignis dann sogar 4 Mal aufgerufen wurde?!

ripper8472 11. Okt 2005 22:56

Re: Merkwürdiges Problem mit Kbd Hook
 
"code" kann 4 werte enthalten. scheinbar wird fuer jeden dieser die nachricht einzeln abgearbeitet.

code = HC_ACTION ist was du willst.

gibts nen grund, wieso du mit diesen ungewoehnlichen cases arbeitest? einfaches "if" wuerde viel besser passen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:50 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz