0

WH_KEYBOARD_LL および WH_MOUSE_LL フックを登録して、すべてのキー押下とマウス イベントを検出しようとしています。どうやら、これらの低レベルのフックでは、フック プロシージャが別の DLL に存在する必要はありません。

これは、次のサンプル アプリ (コンソール アプリケーション) で機能しています。

#include <iostream>
#include <Windows.h>
#include <Winuser.h>
#include <thread>
#include <chrono>
#include <sstream>
#include <atomic>
#include <cassert>

LRESULT CALLBACK wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  std::cout << std::endl << "EVENT: " << hWnd << ", " << message << ", " << wParam << ", " << lParam << std::endl;
  return 0;
}

LRESULT CALLBACK keyboardHook(
  _In_ int    nCode,
  _In_ WPARAM wParam,
  _In_ LPARAM lParam
)
{
  std::cout << "Keyboard: " << nCode << ", " << wParam << ", " << lParam << std::endl;
  return CallNextHookEx(NULL, nCode, wParam, lParam);
}

LRESULT CALLBACK mouseHook(
  _In_ int    nCode,
  _In_ WPARAM wParam,
  _In_ LPARAM lParam
)
{
  std::cout << "Mouse: " << nCode << ", " << wParam << ", " << lParam << std::endl;
  return CallNextHookEx(NULL, nCode, wParam, lParam);
}

int main()
{
  const wchar_t pszClassName[] = L"MyMessageWindow";
  auto hInstance = GetModuleHandle(NULL);

  WNDCLASSEXW wcl;
  ZeroMemory(&wcl, sizeof(WNDCLASSEXW));

  wcl.cbSize = sizeof(WNDCLASSEXW);
  wcl.hInstance = hInstance;
  wcl.lpszClassName = pszClassName;
  wcl.lpfnWndProc = wndProc;

  assert(RegisterClassExW(&wcl) != 0);

  auto hwnd = CreateWindowW(
    pszClassName,
    pszClassName,
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    HWND_MESSAGE,
    NULL,
    NULL,
    NULL
  );

  auto threadId = 0;

  std::thread t([hwnd, threadId]() {
    auto keyboardHookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, keyboardHook, NULL, threadId);
    auto mouseHookHandle = SetWindowsHookEx(WH_MOUSE_LL, mouseHook, NULL, threadId);

    while (true) {
      MSG msg;
      GetMessage(&msg, hwnd, 0, 0);
    }
  });

  t.join();

  return 0;
}

したがって、これは機能し、フォーカスされているアプリ (存在する場合) に関係なく、キーボードとマウスのイベントがコンソールに出力されるのを確認できます。これは素晴らしいことです。

ただし、UMDF ドライバー内でこれを行うと、メッセージが届きません。SetWindowsHookEx への呼び出しは、エラーなしで成功したように見えます。

可能かどうかをテストするために最小限の UMDF ドライバーを作成することを考えていますが、誰かが可能かどうかを教えてくれる場合は、まずここで質問したいと思います。そうでない場合は、他のいくつかのアプローチを念頭に置いています。

ありがとう

4

0 に答える 0