Hallo,
ich versuche durch ein Keyboard Hook alle Tastenereignisse abzufangen
und daraufhin ein Ton abzuspielen.
Allerdings geht es merkwürdigerweise nur innerhalb meines Programms
und nicht (wie es eigentlich sein sollte) global wenn ich mich auch in anderen Fenstern befinde. Wo ist der Fehler?
Hier mal der Source...
---------------------------------<br>
library KeyboardHook;<br>
<br>
uses<br>
Windows,Messages,mmsystem,IniFiles,SysUtils,Forms, Dialogs;<br>
<br>
var<br>
HookHandle: Cardinal = 0;<br>
WindowHandle: Cardinal = 0;<br>
<br>
procedure PlaySound(KeyCode: Integer);<br>
var<br>
IniHnd: TIniFile;<br>
FileStr: String;<br>
begin<br>
try<br>
IniHnd := TIniFile.Create(ExtractFilePath(Application.ExeNam e)<br>+'settings.ini');<br>
FileStr := IniHnd.ReadString('Key'+IntToStr(KeyCode),'File',' ');<br>
If FileExists(FileStr) then<br>
sndPlaySound(PChar(FileStr),SND_ASYNC);<br>
except<br>
MessageDlg('Fehler beim ausführen des Tastaturereignisses!',mtError,<br>[mbOK],0);<br>
end;<br>
end;<br>
<br>
function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;<br>
begin<br>
Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);<br>
case nCode < 0 of<br>
TRUE: exit;<br>
FALSE:<br>
begin<br>
If lParam > 0 then<br>
PlaySound(wParam);<br>
end;<br>
end;<br>
end;<br>
<br>
function InstallHook(Hwnd: Cardinal): Boolean; stdcall;<br>
begin<br>
Result := False;<br>
if HookHandle = 0 then begin<br>
HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0);<br>
WindowHandle := Hwnd;<br>
Result := TRUE;<br>
end;<br>
end;<br>
<br>
function UninstallHook: Boolean; stdcall;<br>
begin<br>
Result := UnhookWindowsHookEx(HookHandle);<br>
HookHandle := 0;<br>
end;<br>
<br>
exports<br>
InstallHook,<br>
UninstallHook;<br>
end.<br>
ich versuche durch ein Keyboard Hook alle Tastenereignisse abzufangen
und daraufhin ein Ton abzuspielen.
Allerdings geht es merkwürdigerweise nur innerhalb meines Programms
und nicht (wie es eigentlich sein sollte) global wenn ich mich auch in anderen Fenstern befinde. Wo ist der Fehler?
Hier mal der Source...
---------------------------------<br>
library KeyboardHook;<br>
<br>
uses<br>
Windows,Messages,mmsystem,IniFiles,SysUtils,Forms, Dialogs;<br>
<br>
var<br>
HookHandle: Cardinal = 0;<br>
WindowHandle: Cardinal = 0;<br>
<br>
procedure PlaySound(KeyCode: Integer);<br>
var<br>
IniHnd: TIniFile;<br>
FileStr: String;<br>
begin<br>
try<br>
IniHnd := TIniFile.Create(ExtractFilePath(Application.ExeNam e)<br>+'settings.ini');<br>
FileStr := IniHnd.ReadString('Key'+IntToStr(KeyCode),'File',' ');<br>
If FileExists(FileStr) then<br>
sndPlaySound(PChar(FileStr),SND_ASYNC);<br>
except<br>
MessageDlg('Fehler beim ausführen des Tastaturereignisses!',mtError,<br>[mbOK],0);<br>
end;<br>
end;<br>
<br>
function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;<br>
begin<br>
Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);<br>
case nCode < 0 of<br>
TRUE: exit;<br>
FALSE:<br>
begin<br>
If lParam > 0 then<br>
PlaySound(wParam);<br>
end;<br>
end;<br>
end;<br>
<br>
function InstallHook(Hwnd: Cardinal): Boolean; stdcall;<br>
begin<br>
Result := False;<br>
if HookHandle = 0 then begin<br>
HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0);<br>
WindowHandle := Hwnd;<br>
Result := TRUE;<br>
end;<br>
end;<br>
<br>
function UninstallHook: Boolean; stdcall;<br>
begin<br>
Result := UnhookWindowsHookEx(HookHandle);<br>
HookHandle := 0;<br>
end;<br>
<br>
exports<br>
InstallHook,<br>
UninstallHook;<br>
end.<br>
Comment