【问题标题】:Why does SetWindowsHookEx return 0?为什么 SetWindowsHookEx 返回 0?
【发布时间】:2010-12-08 14:24:40
【问题描述】:

我正在尝试设置一个WH_CBT 钩子,它总是返回 0。 我检查了错误,得到了错误 1428。我进行了一些研究,发现 hMod 参数有问题,但我看不出应该放什么而不是 null。有谁知道我做错了什么?

这是我的代码:

#include "stdafx.h"
#include "Windows.h"
#include <iostream>
using namespace std;

HHOOK hookHandle;

LRESULT CALLBACK CBTProc( int nCode,  WPARAM wParam,  LPARAM lParam);

int _tmain(int argc, _TCHAR* argv[]) 
{
hookHandle = SetWindowsHookEx(WH_CBT,CBTProc,NULL,0);

 if(hookHandle == NULL) 
 {
  cout << "ERROR CREATING HOOK: ";
  cout << GetLastError() << endl;
  getchar();
  return 0;
 }

 MSG message;

 while(GetMessage(&message, NULL, 0, 0) != 0) 
 {
  TranslateMessage( &message );
  DispatchMessage( &message );
 }



 cout << "Press any key to quit...";
 getchar();

 UnhookWindowsHookEx(hookHandle);

 return 0;
}

LRESULT CALLBACK CBTProc( int nCode,WPARAM wParam, LPARAM lParam)
{
cout << "hello" << endl;
    return CallNextHookEx(hookHandle, nCode, 
            wParam, lParam);
}

附:如果代码中包含愚蠢的元素,我深表歉意。我不是编程新手,只是 C++。

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    如果您为 threadid 指定 0,则将挂钩指定为全局。为此,需要将钩子注入其他进程。这意味着钩子需要从 DLL 中公开。您需要将钩子程序移动到 dll 中,或者在您的进程中指定一个线程。

    【讨论】:

    • 嘿,只是一个问题,是否可以在 .dll 中进行挂钩安装(挂钩 proc 所在的位置)?
    【解决方案2】:

    使用GetModuleHandle(NULL) 和GetCurrentThreadId() 获取您需要传递给该函数的句柄和线程ID。

    示例:

    hookHandle = SetWindowsHookEx(WH_CBT,CBTProc,
                                  GetModuleHandle(NULL),  
                                  GetCurrentThreadId());
    

    正如 Logan 所说,这只会挂钩当前进程。您需要将代码放入dll中以开发系统挂钩。

    【讨论】:

    • 怎么样?可以举个例子吗?
    • 检查传递当前线程 ID,如 Cody 所说。但请记住,这个钩子只会为其同一进程捕获消息......我已经更新了答案。
    • 谢谢,但是我要如何为当前正在运行的所有进程捕获消息?
    • GetModuleHandle(NULL) 不能在这里工作,这是一个 EXE。将代码放入 DLL 是非常必要的。
    猜你喜欢
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2022-01-23
    • 1970-01-01
    • 2011-03-01
    • 2011-07-01
    相关资源
    最近更新 更多