2

Win7 を実行している古いコンピューターに基づいてマルチメディア コンソールを構築しています。

数字キーボードでプレイヤーを操作したい。一般的なメディア コントロール デバイスは、Windows Media Player にしか応答しないため、使用できません。KVM Player、Winamp などを使用します。そのため、それぞれに、再生、一時停止、進む、音量などのための独自のキーボード ショートカット セットがあります。

そのために、フォアグラウンド アプリケーションを検出し、このアプリケーションが使用するショートカットをデータベースから取得する Delphi アプリケーションを構築することを考えています。

Winamp を使用している場合、または Media Player Classicを使用している場合は、数値キーボード (通常のリモコンのサイズ) を使用し5て再生のために押すと、アプリケーションがそれを検出して OS にキーを送信できます。PSpace

最初に押されたキーを取得してから別のキーを送信するには、どの関数を使用すればよいですか?

4

1 に答える 1

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.

この種のフックを使用する前に、ドキュメント、特に備考セクションを読んでください。

于 2012-12-18T21:18:29.960 に答える