這項工作我的罰款:
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;
的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'運行後臺進程來處理這些類型的事件,而不是使用鍵盤鉤子。 –
不工作,因爲你(最有可能)吃WIN鍵。你可以做你想要的關鍵事件。 – Victoria
Windows鍵僅供Windows使用。這就是爲什麼它被稱爲Windows密鑰。用戶會討厭你的應用程序,因爲他們希望Windows鍵能夠完成屬於Windows的特定功能。 –