2

PCで実行されているすべてのアプリケーションで、キーボードイベント(実際には、ユーザーが入力したいくつかのフレーズを「キャッチ」したい)を処理するC++アプリケーションを作成しようとしています。私が作ろうとしているもののまさに基盤はこれです:

#define _WIN32_WINNT 0x0500

#include <iostream>
#include <windows.h>
using namespace std;

HHOOK hHook;

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    printf("Activated\n"); 
    return CallNextHookEx(hHook, nCode, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
  MSG msg;
  while(GetMessage(&msg, NULL, 0, 0))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  return msg.wParam;
}

現在、これはグローバルですが、特定のアプリケーションを実行したときにキーボード入力が「聞こえない」ことがわかったため、スタックしました。私が見つけた問題は、目的のアプリケーションが私のアプリケーションと同じデスクトップに属していないことであるに違いありません(このコールバック関数は私のアプリケーションのデスクトップに対してグローバルであるため)。デスクトップ切り替えのトリックをいくつか実装しようとしましたが、Windows APIに精通しておらず、すぐにすべての努力が失敗しました。チュートリアルには、MSDNの紹介だけでは不十分です。アプリケーションがコンピューターのどこからでもキーボード入力をキャッチできるようにする方法はありますか?

ヘルプ/ヒントを事前に感謝します!

4

1 に答える 1

2

グローバルフックはDLLに実装する必要があるため、複数のプロセスにフックできます。また、64ビットシステムをサポートする場合は、32ビットバージョンと64ビットバージョンを別々に実装する必要があります。のドキュメントにも同じことがSetWindowsHookEx()書かれています。

グローバルフックを使用する代わりに、代わりにRawInputを使用してみてくださいRegisterRawInputDevices()キーボードへの関心を登録WM_INPUTし、キーストロークのメッセージを処理するために使用します。

于 2013-03-16T20:27:27.857 に答える