ソリューションの一部として、キーボード フック ( WH_KEYBOARD_LL ) を使用して特別なキーの組み合わせまたは単一のキーをキャプチャし、次にkeybd_event関数を使用して別のキーストロークを送信 (置換) することができます。
VK_UP
キーをインターセプトして送信するこのサンプル コードを試してください 。S
var
hhk: HHOOK;
function CBT_FUNC(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
type
PKBDLLHOOKSTRUCT = ^TKBDLLHOOKSTRUCT;
TKBDLLHOOKSTRUCT = record
vkCode: cardinal;
scanCode: cardinal;
flags: cardinal;
time: cardinal;
dwExtraInfo: Cardinal;
end;
PKeyboardLowLevelHookStruct = ^TKeyboardLowLevelHookStruct;
TKeyboardLowLevelHookStruct = TKBDLLHOOKSTRUCT;
var
LKBDLLHOOKSTRUCT: PKeyboardLowLevelHookStruct;
begin
case nCode of
HC_ACTION:
begin
LKBDLLHOOKSTRUCT := PKeyboardLowLevelHookStruct(lParam);
if (LKBDLLHOOKSTRUCT^.vkCode = VK_UP) then
begin
if (wParam=WM_KEYUP) or (wParam=WM_SYSKEYUP)then
keybd_event( Ord('S'), 0, KEYEVENTF_KEYUP, 0)
else
keybd_event( Ord('S'), 0, 0, 0);
Exit(1); //eat the key
end;
end;
end;
Result := CallNextHookEx(hhk, nCode, wParam, lParam);
end;
Procedure InitHook();
begin
hhk := SetWindowsHookEx(WH_KEYBOARD_LL, @CBT_FUNC, 0, 0);
if hhk=0 then RaiseLastOSError;
end;
Procedure KillHook();
begin
if (hhk <> 0) then
UnhookWindowsHookEx(hhk);
end;
initialization
InitHook();
finalization
KillHook();
end.
この種のフックを使用する前に、ドキュメント、特に備考セクションを読んでください。