Entwickler-Ecke
Windows API - Fenster aktivieren aus DLL (Hook)
mischer - Di 08.06.04 12:09
Titel: Fenster aktivieren aus DLL (Hook)
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 :roll: , kann mir jemand erklären woran das liegt, oder noch besser wie ich das Fenster trotzdem aktivieren kann? :?:
Danke!
MfG mischer
jaenicke - 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 - 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 :roll:
MfG mischer
Moderiert von
Motzi: Code- durch Delphi-Tags ersetzt.
jaenicke - 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 - 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. :evil:
Zur Erklärung: das SetCursorPos ist nur ein Test und nicht für voll zu nehmen. 8)
Was mir dabei komisch vorkommt ist, daß die Tastaturkommandos im aktivierten Fenster ankommen. Sollten die nicht eingentlich im Hook verschwinden? :roll:
Ich bin langsam mit meinen Nerven am Ende mit diesem Ding :?: :?: :?:
MfG mischer
Moderiert von
Peter Lustig: Code- durch Delphi-Tags ersetzt.
MrSaint - Mi 16.06.04 18:49
bist du denn sicher, dass der hook auch alle Tastaturanschläge "mitbekommt"?
MrSaint
raziel - 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!