Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Tastatureingaben an ein Control weitergeben (https://www.delphipraxis.net/50158-tastatureingaben-ein-control-weitergeben.html)

MasterEvil 21. Jul 2005 10:39


Tastatureingaben an ein Control weitergeben
 
Hi leutz,

hab ein kleines Problem.
Und zwar fange ich zwangsweise Tastatureingaben von einem ActiveX Control ab, ich ich zum navigieren brauche.
Navigieren tut bei mir eine Art Panel mit Buttons drauf, die sonst alle Tastatureingaben abfängt (nur halt nicht vom ActiveX Control, da dieses die Eingaben verschluckt).

So, nun möchte ich gerne die Tastatureingaben, die ich abgefangen habe, an mein Navigationspanel schicken.
Ist das möglich?
Und wie? Zur Not mach ichs auch gerne über die WinAPI wenn mir einer sagt wie.

Es wäre sehr schwierig für mich das Verhalten des Panels nochmal doppelt zu machen.
Da das Panel dynamisch aufgebaut ist und sich leicht etwas ändert.

Ich hoffe jemand hat eine Idee.

Danke schonmal,
Steffen

Flocke 21. Jul 2005 10:41

Re: Tastatureingaben an ein Control weitergeben
 
Wie fängst du die Tastureingaben denn überhaupt ab?

MasterEvil 21. Jul 2005 10:42

Re: Tastatureingaben an ein Control weitergeben
 
Mit einer extra dll und nem Tastatur Hook.
Krieg also nur den Tastencode und will den weiterreichen.

Flocke 21. Jul 2005 10:45

Re: Tastatureingaben an ein Control weitergeben
 
Wenn du die DLL selbst geschrieben hast, dann kannst du das ja ggf. dort abfangen.

Ansonsten kannst du natürlich einfach das folgende machen:
1. Hook ausschalten
2. WM_KEYDOWN/WM_KEYUP an das Fensterhandle des Controls schicken
3. Hook wieder einschalten

Kann natürlich sein, dass du dann eine Benutzereingabe verpasst.

MasterEvil 21. Jul 2005 10:52

Re: Tastatureingaben an ein Control weitergeben
 
das problem ist, dass das Fensterhandle beim ActiveX Control das selbe ist wie beim Form (eigentlich ja auch logisch).
Es ist nur so, dass das ActiveX Control, solang es den Focus hat, alle Eingaben verschluckt und es nicht zum eigentlichen Form kommt (wie auch immer das passiert). Sprich: ich müsste nach jeder Eingabe den Fokus vom Control nehmen, mir den Kram nochmal schicken und dann den Fokus wieder aufs Control tun, damit alle wieder so ist wie vorher.
Das geht aber wiederrum auch nicht, da ich damit die Logik des Panels kaputt machen würde, da dieses den Fokus eventuell ebenfalls verschiebt und ich ihn dann wieder zurück schieben würde.

Sehr kompliziert ^^

Und Hook kann ich nicht bei jeder eingabe Deinstallieren und wieder Installieren, das is zuviel Ressourcen verschwendung.
Vorallem da unser Programm auch auf sehr alten Rechnern noch laufen muss.

Flocke 21. Jul 2005 11:28

Re: Tastatureingaben an ein Control weitergeben
 
Kannst du das ActiveX-Control in ein TPanel packen (oder ein anderes TWinControl). Dann nimmt es ggf. das Fensterhandle von diesem Fenster.

Alternativ:

Kannst du den Hook nicht mit einem Flag versehen, ob er aktiv ist oder nicht (einfache Abfrage in der DLL).

Dann kannst du im Hauptprogramm das machen:

1. HookActive := false;
2. SendMessage(ActiveXControl.Handle, WM_KEYDOWN/WM_KEYUP, ..., ...);
3. HookActive := true;

MasterEvil 21. Jul 2005 11:56

Re: Tastatureingaben an ein Control weitergeben
 
Das mit dem senden ans handle von dem Navigationspanel klappt so sehr gut:
PostMessage(Panel.Handle,WM_KEYDOWN,VK_ESCAPE,0);
Klappt wunderbar bei allen Tasten nur bei den Pfeiltasten nicht ... ich dreh noch durch ;)

Jetzt weiss ich nicht wohin die verschwinden.

Meine dll schickt ja alle tastatureingaben eh weiter dahin wo sie eigentlich hin sollen.
Deswegen seh ich jetzt grad das Problem nicht mehr.
Ich verarbeite ja nur die weiter wo der aktive Focus auf dem ActiveX Control liegt, den Rest verwerf ich wieder.
Deswegen sollte jetzt auch nichts doppelt passieren oder etwas fehlen.
Es klappt ja auch alles, nur Vk_Left, Right, Up und Down werden irgendwie nicht verarbeitet, wenn ich sie so schicke ^^

Deine Idee mit dem panel wäre schön, nur wie krieg ich den das aktive Handle in der dll raus?
Mit GetActiveWindow haben ActiveX Control und Form das selbe Handle.

Flocke 21. Jul 2005 12:21

Re: Tastatureingaben an ein Control weitergeben
 
Also noch mal langsam...

Zitat:

Meine dll schickt ja alle tastatureingaben eh weiter dahin wo sie eigentlich hin sollen.
Du hast in deiner DLL einen Code wie diesen:
Delphi-Quellcode:
function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  if nCode = HC_ACTION then
    SendMessage(<MeinEigenesFensterHandle>, <MeineEigeneFensterMeldung>, wParam, lParam);

  Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
end;
... und dein Hauptformular reagiert auf <MeineEigeneFensterMeldung>, oder wie machst du es?

Dann verstehe ich nicht, wieso du die noch einmal an das Active-X Control schicken willst?

MasterEvil 21. Jul 2005 12:52

Re: Tastatureingaben an ein Control weitergeben
 
oh da hast du mich wohl falsch verstanden ;)

Ich wills nicht noch einmal an das ActiveX Control schicken, sondern ich will die Tastatureingaben die gemacht werden solang das ActiveX Control den Fokus hat an ein anderes Control schicken, welches die Tastatureingaben zur Navigation braucht.
Das ActiveX Control schluckt ja blöderweise alle Tastatureingaben wenn es den Fokus hat und es hat auch kein Ereignis welches ich benutzen könnte.

Also lasse ich einen Hook diese Befehle abfangen (ja, der sieht so ähnlich aus wie dein Beispiel) und schicke sie an mein Formular weiter (und auch weiter an das ActiveX Control).
Das Formular gibt diese jetzt mit SendMessage weiter an mein Navigationspanel (die Pfeiltasten gehen mit SendMessage, nur mit PostMessage nicht, warum auch immer).

Und ich hab es jetzt auch scheinbar tatsächlich alles so hinbekommen wie ich es wollte.
Ich werd jetzt noch ne Weile rumtesten und verfeinern, aber ich denke das es alles klappt.

Vielen dank erstmal.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:21 Uhr.

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