![]() |
KeyHook Irreführend
Habe mal für mein Piano eine KeyHook.dll eingebunden.
Mein Problem vorher Wenn ich ohne Keyhook arbeite und die Tastatur für die Klaviertasten freigebe kann ich alle meine Button nicht mehr bedienen da diese innerhalb der SuperClass nach If WinHandle = GetFocus then abfragen. Wenn ich bedingt durch die Tastaturzuweisung den Focus auf das MainHandle lege schlägt diese Abfrage natürlich fehl. Jetzt habe ich den Keyhook eingebaut aber das problem bleibt bestehn da ich als Hook Handle ja auch wieder das Handle der MainForm angegeben habe. Zitat:
Welchen Sinn macht dann ein Hook? Wenn er die Anwendung genauso blockt wie vorher. Bei bedarf sende ich mal den Quelltext vom Hook. PS: Wie kann ich SetFocus behandeln das nicht die anderen Controls geblockt werden. gruss |
AW: KeyHook Irreführend
Irgendwie verwirrt mich der ganze Beitrag etwas.
Zitat:
Normalerweise wird so eine DLL im System registriert, so dass diese beim Start jeder Anwendung mitgeladen wird und so alle Tastatureingaben verarbeiten kann, egal welche Anwendung den Focus hat. Der Name der DLL ist eigentlich unwichtig. Kompliziert wirds wenn 64- und 32-Bit-Anwendungen gemischt auftreten. Zitat:
Von was für einer SuperClass ist hier die Rede, aus welcher Komponentensammlung stammt diese und was machen diese Klassen, ist Quellcode vorhanden, kann dieser gepatcht werden? Zitat:
diese verarbeitet, oder auch nicht und damit an die Anwendung weitergibt, die derzeit den Focus hat. Zitat:
aber nicht unbedingt über WM_KEYDOWN und WM_KEYUP. Zitat:
Zitat:
Zitat:
Der Begriff scheint mir in Zusammenhang mit SetFocus nicht sinnvoll. |
AW: KeyHook Irreführend
Zitat:
Wird bei mir dynamisch über loadlibrary iniziiert. Und NUR! für meine Anwendung gedacht. Zitat:
Verwaltet alle meine Controls "Button und Image" in einer einzigen WinProc. Also alle Controls/Komponente oder wie auch immer die über meine DLL in der HauptAnwendung erstellt werden. Zitat:
MMSystem dürfte für meine zwecke reichen. Wenn man es genau benennen will "winmm.dll" Dafür muss ich keine Midi Schnittstelle (Siehe Midi Componente) verwenden. Ausgenommen jetzt beim konvertieren von meinem Format nach MIDI da benötige ich zumindest den Header um die Daten Ordnungsgemäß konvertieren und abspeichern zu können. Zitat:
Delphi-Quellcode:
procedure InitKeyHook;
begin lpHookRec := nil; LibLoadSuccess := FALSE; @GetHookRecPointer := nil; @StartKeyBoardHook := nil; @StopKeyBoardHook := nil; // Hook DLL laden hHookLib := LoadLibrary('KeyHook.DLL'); // Laden erfolgreich? if hHookLib <> 0 then begin // Functions adressen einlesen @GetHookRecPointer := GetProcAddress(hHookLib, 'GETHOOKRECPOINTER'); @StartKeyBoardHook := GetProcAddress(hHookLib, 'STARTKEYBOARDHOOK'); @StopKeyBoardHook := GetProcAddress(hHookLib, 'STOPKEYBOARDHOOK'); // Alle Functionen vorhanden? if ((@GetHookRecPointer <> nil) and (@StartKeyBoardHook <> nil) and (@StopKeyBoardHook <> nil)) then begin LibLoadSuccess := TRUE; // Hole den Zeiger vom Hook Record lpHookRec := GetHookRecPointer; // Erfolgreich? if (lpHookRec <> nil) then begin // Record füllen lpHookRec^.TheHookHandle := 0; lpHookRec^.TheCtrlWinHandle := MainHandle; // Angemeldetes FensterHandle (Sollte OK sein) lpHookRec^.TheKeyCount := 0; // Keyboard Hook starten StartKeyBoardHook; end; end else begin // Wenn nicht alle Functionen gefunden wurden. FreeLibrary(hHookLib); hHookLib := 0; @GetHookRecPointer := nil; @StartKeyBoardHook := nil; @StopKeyBoardHook := nil; end; end; end; Zitat:
Zitat:
Zitat:
gruss |
AW: KeyHook Irreführend
Zitat:
Eine DLL ist dafür nicht erforderlich, einen Hook innerhalb deiner Anwendung kannst du jederzeit setzen. Zitat:
Wenn tatsächlich alle Nachrichten in einer WinProc landen, wird eigentlich überhaupt kein Hook benötigt. Du bekommst alle Tastaturereignisse und entscheidest selbst ob diese an die jeweils orginale WindProc weitergegeben oder anderweitig verarbeitet werden. Zitat:
Der gepostete Code bezieht sich nur darauf, wie die DLL geladen wird. Wichtig wäre aber, was macht die DLL wenn ein Ereignis eintritt, bzw. wie gibt diese das Ereignis an die Anwendung weiter. Wie reagiert deine Anwendung auf das Ereignis, das von der DLL an die Anwendung weiter gereicht wird. Zitat:
Hier wäre auch etwas Code angebracht, insbesondere: - Wenn eine Nachricht selbst verarbeitet wird, stimmt der Rückgabewert, werden zusammengehörige Nachrichten auch auf die selbe Weise verarbeitet (Stichwort KeyDown, KeyUp). - Wie wird sichergestellt, dass die richtige orginale WindProc des Steuerelements aufgerufen wird, zu dem das Handle der Nachricht gehört. - Warum wird der Focus verändert und für was dient dieses "GetFocus" in deiner SuperClass überhaupt? Häng am besten mal das Projekt an deinen Beitrag. |
AW: KeyHook Irreführend
Zitat:
So wie ich hier teilweise wegen meinem programmierstil runtergemacht wurde werde ich den source mal nicht veröffentlichen. Denke das da eh niemand so richtig durchblickt. (Nur eine Annahme) Muss mein projekt halt nochmal durchkramen denke irgendwo werde ich das problem schon lokalisieren. Zitat:
Und nur dann wenn ich die Funktion über Keyboard freischalte dann reagiert das Instrument auf die Tastatur eingabe weil dieses als Child auf der MainForm aufgesetzt ist. Die DLL benötige ich schon weil ich ansonsten erst auf die KeyTasten klicken muss damit diese den Focus erhalten. Zitat:
Nicht mehr nicht weniger. google mal nach "Superclassing" Ist sehe nichts verkehrtes daran diese zu verwenden und einzusetzen. Soweit diese Richtig verwaltet wird.. ( denke da ist noch ein Problem bei mir) Zitat:
gruss |
AW: KeyHook Irreführend
Zitat:
Aber was ich nicht verstehe, was hat ein Hook mit dem nicht reagieren der Anwendung zu tun? Und wozu soll der Hook letztendlich gut sein? Wenn deine Anwendung mit der Berechnung der Weltherrschaft zu tun hat, wird sie auch nicht auf Nachrichten von dem Hook reagieren können. Also was versprichst du dir von dem Hook? |
AW: KeyHook Irreführend
Zitat:
Hast du schon mal eine Fehlerfreie Anwendung geschrieben ? Denke mal nicht. Ansonsten würde ich dir den Nobelpreis verleihen. Um so weiter eine Anwendung fortschreitet um so eher schleichen sich Fehler ein das ist nun mal so. Aber was schreibe ich noch. Zitat:
Habe es doch schon beschrieben das ich ohne, zuerst den Focus auf meine Tasten des Pianos setzen muss indem ich sie vorher anklicke. Mit Hook ist das nicht nötig da sind sie sofort aktiv und können verwendet werden. Zitat:
Nur wenn man sich an die Normen von Delphi hält und ansonsten alles andere vergessen soll ? Ich brauche keine Tausend Records, Classen und sonst was es geht auch ohne. PS: Aber Kopf hoch Habe das problem bereits gefunden Wenn du wissen möchtest was es war.. Da dieser Schalter
Delphi-Quellcode:
WM_LBUTTONUP:
begin if not (SKAERO_GetCheckButtonStatus(SKAERO_GetMainItem(MainHandle, ID_USEKEY)) = True) then immer true ist wenn der Checkbutton aktiv ist habe ich mich quasi selbst aus WM_LBUTTONUP ausgesperrt. Andere Messagen wurden daher nicht weitergeleitet. (Geblockt) gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz