2017-08-08 36 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;