Autor |
Beitrag |
mischer
Hält's aus hier
Beiträge: 11
|
Verfasst: Di 08.06.04 12:09
Hi,
ich habe einen Tastaturhook programmiert, der nun bestimmte Tastatureingaben an ein Delphi-Programm weiterleiten soll. Das funktioniert soweit wunderbar, allerdings empfängt das Fenster die Nachrichten nur dann, wenn es auch aktiviert ist.
Ich hab versucht das Fenster mit Hilfe von Befehlen wie: Quelltext 1: 2: 3:
| SetForeGroundWindow(...); SetFocus(...); ShowWindow(...); |
usw. von der DLL aus zu aktivieren bevor ich die SendMessage(...) schicke. Leider sind ihm all diese Befehle offenbar vollkommen Suppe  , kann mir jemand erklären woran das liegt, oder noch besser wie ich das Fenster trotzdem aktivieren kann?
Danke!
MfG mischer
|
|
jaenicke
      
Beiträge: 19313
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 08.06.04 12:17
Mit Nachrichten meinst du sicherlich Windows-Botschaften, und die werden aber immer empfangen, egal, ob das Fenster den Fokus hat oder nicht. (Klar ist, dass eine Tastatureingabe nur an das Fenster weitegeleitet wird, das den Fokus hat.) Wenn Du aber selbst ne Botschaft an ein Fenster schickst, muss es nicht den Fokus haben.
Du solltest vielleicht mal zeigen, wie du diese Botschaften sendest (ok steht angedeutet da) und empfängst, ich nehme an, das ist dein Problem.
Ansonsten: Das mit dem Fokus hat mich auch manches Haar gekostet (das ich mir ausgerissen habe beim Haareraufen). Du könntest mal versuchen den Applikation den Fokus zu geben und dann dem Fenster oder so, das hat bei mir geklappt...
MfG,
Sebastian
|
|
mischer 
Hält's aus hier
Beiträge: 11
|
Verfasst: Di 08.06.04 12:27
Danke für die schnelle Antwort,
also der Hook macht jeweils folgendes: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| Result := CallNextHookEx(HookHandle, nCode, wParam, lParam); case nCode < 0 of TRUE: exit; FALSE: begin if (wparam = 112) and (lparam < 0) then begin end; if (wparam = 113) and (lparam < 0) then begin showwindow(HilfeHandle,sw_shownormal); sendmessage(HilfeHandle, ncode, wparam, lparam); end; if (wparam = 114) and (lparam < 0) then begin showwindow(HilfeHandle,sw_shownormal); sendmessage(HilfeHandle, ncode, wparam, lparam); end; if (wparam = 115) and (lparam < 0) then begin showwindow(HilfeHandle,sw_shownormal); sendmessage(HilfeHandle, ncode, wparam, lparam); end; |
Und im Programm fange ich dann einfach das Ereignis KeyDown ab. Wie gesagt das funktioniert auch alles wunderbar (solange das Programm den Fokus hat  )
Wenn ich das ShowWindow(...) weglasse hat es exakt den gleichen Effekt
MfG mischer
Moderiert von Motzi: Code- durch Delphi-Tags ersetzt.
|
|
jaenicke
      
Beiträge: 19313
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 08.06.04 12:41
Du verwendest also den Code:
Delphi-Quelltext 1:
| procedure WM_XY(var message: TMessage); message WM_XY; |
um die Botschaften abzufangen?
Wie wärs, wenn du die WindowProc überschreibst und darüber die Botschaften abfängst? Die bekommt die Botschaften auf jeden Fall immer (Auch, wenn du die Botschaften per BroadcastSystemMessage, bzw SendMessage(HWND_BROADCAST,...) sendest.)
|
|
mischer 
Hält's aus hier
Beiträge: 11
|
Verfasst: Mi 09.06.04 14:30
Hi,
erstmal Danke für die Antwort!
Ich verwende jetzt die Methode
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TDorSylv.WndProc(var Message : TMessage); begin if ((Message.Msg = WM_KeyUP) or (Message.Msg = WM_KeyDown)) then setcursorpos(200,200); inherited WndProc(Message); end; |
um die Botschaft abzufangen.
Aber: Auch die funktioniert nur wenn das Fenster aktiv ist.
Zur Erklärung: das SetCursorPos ist nur ein Test und nicht für voll zu nehmen.
Was mir dabei komisch vorkommt ist, daß die Tastaturkommandos im aktivierten Fenster ankommen. Sollten die nicht eingentlich im Hook verschwinden?
Ich bin langsam mit meinen Nerven am Ende mit diesem Ding
MfG mischer
Moderiert von Peter Lustig: Code- durch Delphi-Tags ersetzt.
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Mi 16.06.04 18:49
bist du denn sicher, dass der hook auch alle Tastaturanschläge "mitbekommt"?
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
raziel
      
Beiträge: 2453
Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
|
Verfasst: Mi 16.06.04 20:31
Hallo!
Spontan würden mir zwei Dinge einfallen:
- Ist Dein Hook wirklich Global? (das was MrSaint schon angesprochen hat) und
- Wie ermittelst Du das Fensterhandle, an das die Nachricht geschickt werden soll?
raziel
_________________ JSXGraph
|
|
|