![]() |
AW: registerHotKey funktioniert nicht
Deine DLL kommt so nicht an das Formular heran. Was du da versuchst anzusprechen ist ein zweites Formular, das in der DLL existieren würde. Da das aber nie erzeugt wurde, geht das ganz schief.
Die DLL hat einen ganz anderen Speichermanager usw., deshalb kommst du an die Objekte deiones hauptprogramms nicht heran. Du kannst nur Callbackfunktionen definieren und der DLL übergeben, die du dann dort aufrufen kannst oder Messages an das Fenster schicken, wenn du das Handle dafür an die DLL übergibst. Du brauchst für einen Keyboard-Hook aber gar keine DLL, das ist ein Mythos... das kannst du auch direkt in deinem Programm implementieren. Der Vorteil der DLL-Lösung ist nur, dass dann nur diese als Virus bzw. verdächtiges Programm erkannt wird und nicht das ganze Programm. |
AW: registerHotKey funktioniert nicht
Zitat:
Und d.h. ich kann einfach den Code meiner DLL in meine eigentliche Form übertragen? |
AW: registerHotKey funktioniert nicht
Nicht alle systemweiten Hooks müssen in einer DLL implementiert sein.
|
AW: registerHotKey funktioniert nicht
Zitat:
Und wenn ich den DLL Source Code jetzt in meine Main Unit einfüge, also praktisch direkt ins Programm wo auch die Buttons sind, funktioniert es nicht (natürlich^^). Was genau muss ich denn jetzt noch für Anpassungen vornehmen, weil so langsam verliere ich den Überblick bei den ganzen neuen Sachen. Source: Steht nicht alles drin, nur das wichtigste halt!
Delphi-Quellcode:
unit Main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, sSkinManager, ExtCtrls, mmSystem; type TForm1 = class(TForm) ... <- Hier die ganzen Objekte procedure Button1Click(Sender: TObject); procedure TimerBlueOwnTimer(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure TimerRedOwnTimer(Sender: TObject); procedure TimerBlueEnemyTimer(Sender: TObject); procedure TimerRedEnemyTimer(Sender: TObject); procedure TimerDragonTimer(Sender: TObject); procedure TimerBaronTimer(Sender: TObject); procedure Button8Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; HookHandle: Cardinal = 0; WindowHandle: Cardinal = 0; implementation uses Unit2; // Nur ein Info Fenster {$R *.dfm} function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin Result := CallNextHookEx(HookHandle, nCode, wParam, lParam); case nCode < 0 of TRUE: exit; FALSE: if (wParam = VK_NUMPAD7) then ShowMessage('TEST'); end; end; function InstallHook(Hwnd: Cardinal): Boolean; stdcall; begin Result := False; if HookHandle = 0 then begin HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0); WindowHandle := Hwnd; Result := TRUE; end; end; function UninstallHook: Boolean; stdcall; begin Result := UnhookWindowsHookEx(HookHandle); HookHandle := 0; end; procedure TForm1.FormCreate(Sender: TObject); begin InstallHook(Handle); end; procedure TForm1.FormDestroy(Sender: TObject); begin UninstallHook; end; |
AW: registerHotKey funktioniert nicht
In dem man in der Hilfe nachguck:
![]() |
AW: registerHotKey funktioniert nicht
Also das installieren des Hooks scheint auf jedenfall zu funktionieren, das hab ich ganz einfach so überprüft:
Delphi-Quellcode:
Und er zeigt mir die Message auch an, also muss der Fehler doch praktisch, das mein HotKey nicht funktioniert, in diesem Teil
procedure TForm1.FormCreate(Sender: TObject);
begin InstallHook(Handle); if (InstallHook(Handle) = True) then ShowMessage('Hook ist drin!'); end;
Delphi-Quellcode:
liegen oder?
function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin Result := CallNextHookEx(HookHandle, nCode, wParam, lParam); case nCode < 0 of TRUE: exit; FALSE: if (wParam = VK_NUMPAD7) then ShowMessage('TEST'); end; end; |
AW: registerHotKey funktioniert nicht
Was ist denn das
Delphi-Quellcode:
für ein Unsinn? Warum rufst du InstallHook zwei mal auf? Außerdem ist das etwas sinnfrei eine Meldung auszugeben, wenn es funktioniert hat. Sinnvoller wäre es, eine Meldung auszugeben, wenn es zu einem Fehler gekommen ist und die Fehlermeldung auszugeben, damit man weiß, warum es zu einem Fehler gekommen ist.
InstallHook(Handle);
if (InstallHook(Handle) = True) then ShowMessage('Hook ist drin!');
Delphi-Quellcode:
if not InstallHook(Handle) then
ShowMessage(SysErrorMessage(GetLastError)); |
AW: registerHotKey funktioniert nicht
Mit deiner Variante wird aber kein Fehler angezeigt, also muss es ja eigentlich an der KeyboardHookProc Funktion liegen.
|
AW: registerHotKey funktioniert nicht
Zitat:
Das Problem ist hier ganz einfach: Du benutzt WH_KEYBOARD statt WH_KEYBOARD_LL. Damit würdest du die Daten, die per WM_KEYDOWN und WM_KEYUP weitergegeben werden sollen abfangen. Da das aber im Fenstermanager passiert, brauchst du dafür in der Tat eine DLL. Du willst aber die direkten Tastatureingaben. Und dafür brauchst du einen LowLevel-Hook. Der braucht auch keine DLL. Du musst also nur WH_KEYBOARD durch WH_KEYBOARD_LL ersetzen. |
AW: registerHotKey funktioniert nicht
Zitat:
Zum anderen versteht mich nicht falsch, wenn ich
Delphi-Quellcode:
verwende bekomme ich eine Meldung, allerdings nur "Der Vorgang wurde erfolgreich beendet", halt als ShowMessage und dann startet mein Programm.
if not InstallHook(Handle) then
ShowMessage(SysErrorMessage(GetLastError)); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:21 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