これは罰金私の仕事:
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の一部である特定の作業を行うことを期待しているため、あなたのアプリを嫌うだろう。 –