这项工作我的罚款:
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的特定功能。 –