2017-08-08 100 views
0

我使用SetWindowsHookEx()WH_KEYBOARD_LL德爾福 - 鉤鍵盤WIN鍵顯示我的開始菜單

我想鉤WIN鑰匙打開我的應用程序,但問題是,如果我按WIN + R,等等,那麼這個快捷鍵不起作用。

我的源通過這段代碼的啓發:

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

請幫助我。我怎樣可以打開我的鍵盤上的WIN鍵的應用,並與WIN + RWIN + EWIN + 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;