Announcement

Collapse
No announcement yet.

KeyboardHook Problem

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • KeyboardHook Problem

    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>

  • #2
    Ein globaler Hook MUSS in einer DLL implementiert werden

    Comment


    • #3
      Habs jetzt gelöst... die prozedur fand die ini file nicht immer...
      lese die einträge jetzt einfach aus der registrierung aus..

      Comment


      • #4
        PS: Warum muss eigentlich ein globaler Hook in eine DLL? Wo ist da der unterschied

        Comment


        • #5
          Damit der Hook funktionieren kann muss sein Code in den Adressraum aller Applikationen eingeblendet werden. Das geht nur mit einer DLL, denn das ist genau das wofuer eine DLL da ist

          Comment

          Working...
          X