我正在构建一个基于运行Win7的旧计算机的多媒体控制台。
我想用数字键盘控制玩家。 我无法使用常见的媒体控制设备,因为它们只响应Windows媒体播放器。我将使用KVM播放器,Winamp等。所以每个人都有自己的一套键盘快捷键,用于播放,暂停,前进,音量等。
为此,我正在考虑构建一个检测前台应用程序的Delphi应用程序,并从数据库中获取此应用程序使用的快捷方式。
当我使用数字键盘(常规遥控器的大小)并按5
进行播放时,如果我使用Winamp,我的应用程序可以检测到它并向操作系统发送P
键或Space
如果我使用的是Media Player Classic。
我应该使用哪些功能先抓住按下的键然后发送另一个键?
答案 0 :(得分:3)
部分解决方案可以使用键盘挂钩(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.
在使用这种钩子之前,请记住阅读文档,特别是remarks部分。