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.