2017-08-08 2 views
0

私はSetWindowsHookEx()WH_KEYBOARD_LLを使用します。私のスタートメニューを表示するためにDelphi - キーボードのWINキーをキックする

は、私は自分のアプリケーションを開くことWINキーをフックしたいが、私は、このショートカットキーが動作しないなど、WIN + R押した場合、問題があります。

私のソースは、このコードに触発さ:

https://github.com/MasterOfChaos/Chaoslauncher/blob/master/Source/Plugins/Chaosplugin/Hotkeys.pas

私を助けてください。どのように私は、キーボード上のWINキーで自分のアプリケーションを開くことができ、そしてまだWIN + RWIN + EなどWIN +のL、で動作しますか?

+0

WINキーは、Windowsの使用のために予約されています。なぜそれらを再マッピングしたいのですか?ユーザーはその動作を期待しません。少なくとも、['RegisterHotKey()'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms646309.aspx)経由のホットキーの使用を検討してください。現代のキーボードの多くは、利用可能なユーザー定義のショートカットキーを持っていますので、使用可能なものを使用してください(['WM_APPCOMMAND'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms646275.aspx) )。私はキーボードフックを使用する代わりに、隠れた 'HWND'を使ってバックグラウンドプロセスを実行して、この種のイベントを処理することをお勧めします。 –

+0

あなたは(おそらく)そのWINキーを食べているので、動作しません。あなたはキーアップイベントであなたが望むことをすることができます。 – Victoria

+0

WindowsキーはWindowsでのみ使用できます。それがWindowsキーと呼ばれる理由です。ユーザーは、WindowsのキーがWindowsの一部である特定の作業を行うことを期待しているため、あなたのアプリを嫌うだろう。 –

答えて

0

これは罰金私の仕事:

const 
WH_KEYBOARD_LL = 13; 
LLKHF_ALTDOWN = $00000020; 
LLKHF_INJECTED = $00000010; 
KEYEVENTF_KEYDOWN = 0; 

type 
tagKBDLLHOOKSTRUCT = record 
    vkCode: DWORD; 
    scanCode: DWORD; 
    flags: DWORD; 
    time: DWORD; 
    dwExtraInfo: DWORD; 
    end; 
KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT; 
LPKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT; 
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT; 

var 
hhkLowLevelKybd: HHOOK; 
prev:PKBDLLHOOKSTRUCT; 
KeysPressed: tstringlist; 



function LowLevelKeyBoardProc(nCode: Integer; awParam: WPARAM; 
alParam: LPARAM): LRESULT; stdcall; 
var 
fEatKeyStroke: Boolean; 
act: PKBDLLHOOKSTRUCT; 

begin 
fEatKeystroke := False; 


if (nCode = HC_ACTION) then 
begin 
    case awParam of 
     WM_KEYDOWN, 
     WM_SYSKEYDOWN, 
     WM_KEYUP, 
     WM_SYSKEYUP: 
      begin 
      act := PKBDLLHOOKSTRUCT(alParam); 

      // start sezereme jen pokud je zmacnute jen jedno tlacitko a je to Win 
      if KeysPressed.Count=1 then begin if act^.vkCode = VK_LWIN then fEatKeystroke := True; end; 

      // pokud zmacnke tlacitko pridame do listboxu, v kombinaci at tam jsou dva stisky 
      if awParam=WM_KEYDOWN then 
       if KeysPressed.IndexOf(char(act^.vkCode))=-1 then KeysPressed.Add(char(act^.vkCode)); // prida do listboxu 

      // pokud uz neni zmacknute smazeme 
      if awParam=WM_KEYUP then 
       KeysPressed.Clear; 


      end; // case 
      end;//case 
end;//nCode 




if fEatKeyStroke then 
    Result := 1 
else 
    Result := CallNextHookEx(hhkLowLevelKybd, nCode, awParam, alParam); 




end; 





procedure InstallHook; 
begin 
KeysPressed := tstringlist.Create; 
if hhkLowLevelKybd <> 0 then exit; 
hhkLowLevelKybd := SetWindowsHookEx(WH_KEYBOARD_LL, @LowLevelKeyboardProc, 
hInstance, 0); 
end; 

procedure UninstallHook; 
begin 
KeysPressed.Free; 
if hhkLowLevelKybd = 0 then exit; 
UnhookWindowsHookEx(hhkLowLevelKybd); 
hhkLowLevelKybd := 0; 
end; 




procedure TFrmMain.FormCreate(Sender: TObject); 
begin 
InstallHook; 
end; 



procedure TFrmMain.FormDestroy(Sender: TObject); 
begin 
UninstallHook; 
end; 
関連する問題