Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem bei KeyHook (https://www.delphipraxis.net/61168-problem-bei-keyhook.html)

MCQ 17. Jan 2006 19:03


Problem bei KeyHook
 
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.

MCQ 18. Jan 2006 02:05

Re: Problem bei KeyHook
 
OK, hab es nun hingekriegt das es mit dem globalem Hook funktioniert. Ich nutze dazu statt WH_KEYBOARD einfach WH_KEYBOARD_LL, aber wie kann ich nun die Eingaben ändern bevor die das Programm erreichen?

[PUSHBEITRAG]
Kann mir wirklich keiner helfen?
Kann man eigendlich aum glauben :(
[/PUSHBEITRAG]

[edit=Christian Seehase]Pushen von Threads frühestens nach 24 Stunden :!: Pushbeitrag gelöscht. Mfg, Christian Seehase[/edit]

MCQ 21. Jan 2006 23:03

Re: Problem bei KeyHook
 
*push*Das Problem besteht noch immer, ich hoffe mir kann bald jemannd helfen :(


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:49 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