C++ 无法截获右键单击事件

C++ 无法截获右键单击事件,c++,windows,winapi,C++,Windows,Winapi,我需要截取windows中具有特定标题的窗口中的右键单击事件,因此我决定使用SetWindowsHookExA函数和WH\u MOUSE参数,如下所示: 因此启动流程的应用程序 #include <Windows.h> #include <cstdlib> #include <iostream> int main() { HMODULE hook_dll_handle = LoadLibraryA("hook_dll.dll"); if (hook

我需要截取windows中具有特定标题的窗口中的右键单击事件,因此我决定使用
SetWindowsHookExA
函数和
WH\u MOUSE
参数,如下所示:

因此启动流程的应用程序

#include <Windows.h>

#include <cstdlib>
#include <iostream>

int main()
{
  HMODULE hook_dll_handle = LoadLibraryA("hook_dll.dll");
  if (hook_dll_handle == NULL)
  {
    std::cerr << "Unable to load \"hook_dll.dll\". Error code: " << GetLastError() << std::endl;
    return EXIT_FAILURE;
  }

  auto mouse_hook = (HOOKPROC)GetProcAddress(hook_dll_handle, "mouse_hook");
  if (mouse_hook == NULL)
  {
    std::cerr << "Unable to get \"mouse_hook\" function's address. Error code: " << GetLastError() << std::endl;
    return EXIT_FAILURE;
  }

  HHOOK hook = SetWindowsHookExA(WH_MOUSE, mouse_hook, hook_dll_handle, 0);
  if (hook == NULL)
  {
    std::cerr << "Unable to set hook. Error code: " << GetLastError() << std::endl;
    return EXIT_FAILURE;
  }

  std::cin.get();

  if (UnhookWindowsHookEx(hook) == 0)
  {
    std::cerr << "Unable to unhook mouse_hook. Error code: " << GetLastError() << std::endl;
    return EXIT_FAILURE;
  }
}
不幸的是,它没有像预期的那样工作。它挂起整个explorer.exe或在不同的平台上执行其他类型的操作

我做错了什么?我怎样才能修好它


提前感谢。

您现在需要一个消息循环,其中包含
std::cin.get()

请参见以下表格中的备注:

这个钩子可以在安装它的线程的上下文中调用。调用是通过向安装钩子的线程发送消息来完成的因此,安装钩子的线程必须有一个消息循环。

哦,如果您不想使用dll,您可以使用
WH\u MOUSE\u LL
,它是在您自己的应用程序上下文中调用的


请参阅:

谢谢你的回答,但你最后说的话对我来说是新的。根据MSDN,“如果dwThreadId参数为零或指定由不同进程创建的线程的标识符,则lpfn参数必须指向DLL中的钩子过程”。我认为它会说“如果你的应用程序需要截取其他应用程序的消息,那么你需要使用DLL”。我错了吗?不是每种类型的钩子都有,但很遗憾,关于钩子的信息有点分散,一些信息在通用页面上,一些信息在HookProc页面上。另外,我发布了一个功能齐全的控制台应用程序,可以钩住键盘,把它改成鼠标应该很简单。@MarkJansen:更好,由于OP想要钩住一个特定的窗口,所以使用
GetWindowThreadProcessId()
获取该窗口所属的线程ID。然后,钩子将仅用于该线程,而不是系统上的所有线程。
#include "stdafx.h"

BOOL APIENTRY DllMain(
  HMODULE hModule,
  DWORD  ul_reason_for_call,
  LPVOID lpReserved
)
{
  switch (ul_reason_for_call)
  {
  case DLL_PROCESS_ATTACH:
  case DLL_PROCESS_DETACH:
  case DLL_THREAD_ATTACH:
  case DLL_THREAD_DETACH:
    break;
  }
  return TRUE;
}

extern "C"
{
  __declspec(dllexport) LRESULT CALLBACK mouse_hook(int code, WPARAM wParam, LPARAM lParam)
  {
    return CallNextHookEx(NULL, code, wParam, lParam);
  }
}