AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

registerHotKey funktioniert nicht

Ein Thema von dYnAm1c · begonnen am 26. Jun 2011 · letzter Beitrag vom 30. Jun 2011
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: registerHotKey funktioniert nicht

  Alt 28. Jun 2011, 19:23
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
dYnAm1c

Registriert seit: 26. Jun 2011
23 Beiträge
 
#12

AW: registerHotKey funktioniert nicht

  Alt 28. Jun 2011, 19:31
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?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#13

AW: registerHotKey funktioniert nicht

  Alt 28. Jun 2011, 19:50
Nicht alle systemweiten Hooks müssen in einer DLL implementiert sein.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
dYnAm1c

Registriert seit: 26. Jun 2011
23 Beiträge
 
#14

AW: registerHotKey funktioniert nicht

  Alt 28. Jun 2011, 20:03
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;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#15

AW: registerHotKey funktioniert nicht

  Alt 28. Jun 2011, 20:05
In dem man in der Hilfe nachguck: MSDN-Library durchsuchenSetWindowsHookEx.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
dYnAm1c

Registriert seit: 26. Jun 2011
23 Beiträge
 
#16

AW: registerHotKey funktioniert nicht

  Alt 28. Jun 2011, 20:25
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?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#17

AW: registerHotKey funktioniert nicht

  Alt 28. Jun 2011, 20:28
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));
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
dYnAm1c

Registriert seit: 26. Jun 2011
23 Beiträge
 
#18

AW: registerHotKey funktioniert nicht

  Alt 28. Jun 2011, 20:31
Mit deiner Variante wird aber kein Fehler angezeigt, also muss es ja eigentlich an der KeyboardHookProc Funktion liegen.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: registerHotKey funktioniert nicht

  Alt 28. Jun 2011, 21:09
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?

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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
dYnAm1c

Registriert seit: 26. Jun 2011
23 Beiträge
 
#20

AW: registerHotKey funktioniert nicht

  Alt 28. Jun 2011, 21:25
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:06 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