Thema: Delphi Problem bei KeyHook

Einzelnen Beitrag anzeigen

MCQ

Registriert seit: 14. Jan 2004
Ort: Dessau
80 Beiträge
 
#1

Problem bei KeyHook

  Alt 17. Jan 2006, 20:03
Ich wollte ein Programm schreiben welches mit erlaubt tastenergebnisse umzuwandeln. Soll heißen das Prigramm registriert beispielsweise das [ENTER] gedrück wurde und wandelt es in [LEERTASTE] um bevor ess beim programm ankommt. Sinn der Sache ist es die Tasten die die PC-Fernbedienung emuliert umzuwandeln in die Tasten welche Winamp, PowerDVD usw. als ShortCuts erwarten

Also habe ich angefangen eine Tastatur-Hook zu programmieren, was auch sehr gut funktioniert. Allerdings ist der Hook nur Lokal und nicht Global. Die Hook-Prozeduren stecken in einer DLL welche von einer EXE geladen werden. den DLL-Source poste ich hier:

Delphi-Quellcode:
library hook;

{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muss sich in der
  ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden (Projekt-
  Quelltext anzeigen), falls die DLL Prozeduren oder Funktionen exportiert, die
  Strings als Parameter oder Funktionsergebnisse übergeben. Das gilt für alle
  Strings, die von oder an die DLL übergeben werden -- sogar für diejenigen, die
  sich in Records und Klassen befinden. Sharemem ist die Schnittstellen-Unit zur
  Verwaltungs-DLL für gemeinsame Speicherzugriffe, BORLNDMM.DLL.
  Um die Verwendung von BORLNDMM.DLL zu vermeiden, können Sie String-
  Informationen als PChar- oder ShortString-Parameter übergeben. }



uses
  windows,
  StdCtrls,
  comCtrls,
  Forms,
  SysUtils,
  Messages,
  dialogs;

var OrgVar : TEdit;
    ChgVar : TEdit;
    Form : TForm;
    ValList : TListView;
    hLocalHook : Cardinal;
    hGlobalHook : Cardinal;
{$R *.res}


function LocalHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  Result := CallNextHookEx(hLocalHook, nCode, wParam, lParam);
  if wParam=9 then exit;
  if GetForegroundWindow()<>Form.Handle then exit;
  if OrgVar.Focused then OrgVar.Text:=IntToStr(wParam);
  if ChgVar.Focused then ChgVar.Text:=IntToStr(wParam);
end;

function GlobalHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var i : integer;
begin
  wParam:=65;
  Result := CallNextHookEx(hGlobalHook, nCode, wParam, lParam);
end;


procedure setLocalHook;stdcall
begin
 if hLocalHook = 0 then
 hLocalHook:=SetWindowsHookEx(WH_KEYBOARD, @LocalHook, hInstance, 0);
end;

procedure unsetLocalHook;stdcall;
begin
 If hLocalHook<>0 then
 UnhookWindowsHookEx(hLocalHook);
end;

procedure setGlobalHook;stdcall
begin
 if hGlobalHook = 0 then
 hGlobalHook:=SetWindowsHookEx(WH_KEYBOARD, @GlobalHook, hInstance, 0);
end;

procedure unsetGlobalHook;stdcall;
begin
 If hGlobalHook<>0 then
 UnhookWindowsHookEx(hGlobalHook);
end;


procedure setVars(OrgVarEdit,ChVarEdit:TEdit;MainForm:TForm;ValListView:TListView);
begin
 OrgVar:=OrgVarEdit;
 ChgVar:=ChVarEdit;
 Form:=MainForm;
 ValList:=ValListView;
end;

exports
    setLocalHook,
    unsetLocalHook,
    setGlobalHook,
    unsetGlobalHook,
    setVars;
begin
end.
//Edit:
Was dazu vielleicht noch gesagt werden sollt, der lokale Hook wird genutzt um die Einstellunen der Tastatur-Changes zu tätigen, dieser wird abgeschaltet kurz bevor der gobale Hook gestartet wird. Welcher welcher ist, geht aus den Prozedur-namen eindeutig hervor.
  Mit Zitat antworten Zitat