Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   registerHotKey funktioniert nicht (https://www.delphipraxis.net/161282-registerhotkey-funktioniert-nicht.html)

jaenicke 28. Jun 2011 18:23

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.

dYnAm1c 28. Jun 2011 18:31

AW: registerHotKey funktioniert nicht
 
Zitat:

Zitat von jaenicke (Beitrag 1108669)
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.

Ich meine gelesen zu haben das der Hook nur Systemweit ist wenn man eine DLL benutzt?
Und d.h. ich kann einfach den Code meiner DLL in meine eigentliche Form übertragen?

Luckie 28. Jun 2011 18:50

AW: registerHotKey funktioniert nicht
 
Nicht alle systemweiten Hooks müssen in einer DLL implementiert sein.

dYnAm1c 28. Jun 2011 19:03

AW: registerHotKey funktioniert nicht
 
Zitat:

Zitat von Luckie (Beitrag 1108672)
Nicht alle systemweiten Hooks müssen in einer DLL implementiert sein.

Woher weiß ich welche in eine DLL implementiert werden müssen?

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;

Luckie 28. Jun 2011 19:05

AW: registerHotKey funktioniert nicht
 
In dem man in der Hilfe nachguck: MSDN-Library durchsuchenSetWindowsHookEx.

dYnAm1c 28. Jun 2011 19:25

AW: registerHotKey funktioniert nicht
 
Also das installieren des Hooks scheint auf jedenfall zu funktionieren, das hab ich ganz einfach so überprüft:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
InstallHook(Handle);
if (InstallHook(Handle) = True) then
    ShowMessage('Hook ist drin!');
end;
Und er zeigt mir die Message auch an, also muss der Fehler doch praktisch, das mein HotKey nicht funktioniert, in diesem Teil

Delphi-Quellcode:
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;
liegen oder?

Luckie 28. Jun 2011 19:28

AW: registerHotKey funktioniert nicht
 
Was ist denn das
Delphi-Quellcode:
InstallHook(Handle);
if (InstallHook(Handle) = True) then
    ShowMessage('Hook ist drin!');
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.

Delphi-Quellcode:
if not InstallHook(Handle) then
  ShowMessage(SysErrorMessage(GetLastError));

dYnAm1c 28. Jun 2011 19:31

AW: registerHotKey funktioniert nicht
 
Mit deiner Variante wird aber kein Fehler angezeigt, also muss es ja eigentlich an der KeyboardHookProc Funktion liegen.

jaenicke 28. Jun 2011 20:09

AW: registerHotKey funktioniert nicht
 
Zitat:

Zitat von dYnAm1c (Beitrag 1108679)
Mit deiner Variante wird aber kein Fehler angezeigt, also muss es ja eigentlich an der KeyboardHookProc Funktion liegen.

Wenn du immer True zurückgibst, egal ob es geklappt hat oder nicht, wie soll dann jemals ein Fehler angezeigt werden? :roll:

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.

dYnAm1c 28. Jun 2011 20:25

AW: registerHotKey funktioniert nicht
 
Zitat:

Zitat von jaenicke (Beitrag 1108686)
Du musst also nur WH_KEYBOARD durch WH_KEYBOARD_LL ersetzen.

Du wirst es mir vielleicht nicht glauben aber das habe ich vorher schon versucht, aber auch dann scheint mein Tastendruck nichts zu bewirken, allerdings bekomme ich manchmal eine Access Violation aber halt wirklich nur manchmal oder wenn ich die Taste oft hintereinander drücke, das passierte aber auch bei WH_KEYBOARD.

Zum anderen versteht mich nicht falsch, wenn ich
Delphi-Quellcode:
if not InstallHook(Handle) then
  ShowMessage(SysErrorMessage(GetLastError));
verwende bekomme ich eine Meldung, allerdings nur "Der Vorgang wurde erfolgreich beendet", halt als ShowMessage und dann startet mein Programm.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:12 Uhr.
Seite 2 von 5     12 34     Letzte »    

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