如何在所有其他应用程序上方监视键盘,然后将其他键发送给它们

时间:2012-12-18 20:02:13

标签: delphi keyboard-events delphi-2006

我正在构建一个基于运行Win7的旧计算机的多媒体控制台。

我想用数字键盘控制玩家。 我无法使用常见的媒体控制设备,因为它们只响应Windows媒体播放器。我将使用KVM播放器,Winamp等。所以每个人都有自己的一套键盘快捷键,用于播放,暂停,前进,音量等。

为此,我正在考虑构建一个检测前台应用程序的Delphi应用程序,并从数据库中获取此应用程序使用的快捷方式。

当我使用数字键盘(常规遥控器的大小)并按5进行播放时,如果我使用Winamp,我的应用程序可以检测到它并向操作系统发送P键或Space如果我使用的是Media Player Classic。

我应该使用哪些功能先抓住按下的键然后发送另一个键?

1 个答案:

答案 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部分。