钩子建立失败,SetWindowsHookEx总是返回值0!!

dsgreutrjgfjfgjfg dsgreutrjgfjfgjfg 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我是照着例子模仿做的,目的是注入记事本, F10呼出,键盘钩子。

程序没有提示任何错误或者警告, 但是就是卡在SetWindowsHookEx不动了,加上printf才输出错误值0,太奇怪了,大伙帮帮忙吧,谢谢了!

Dll Def部分:Output.def
LIBRARY "Dll_Functions"
EXPORTS
SetHook

Dll部分:Dll_Functions.dll.cpp

#include <windows.h>
#include <winuser.h>
#include <tchar.h>
#include <stdio.h>

#pragma data_seg("MySec")
HHOOK G_KeyHook = NULL;
HWND G_hWnd;
#pragma data_seg()

LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam); //不加这句提示keyboardproc未声明

DWORD G_ThreadID = 0;
HANDLE G_hUIThread;

HHOOK SetHook(HWND hwnd, DWORD ThreadID)
{
G_hWnd = hwnd;
if(G_ThreadID != ThreadID)
{
G_KeyHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, GetModuleHandle(TEXT("Dll_Functions.dll")), ThreadID);
printf("SetHook return : %ld\n",GetLastError()); //程序始终卡在这里,返回值输出为0!!!
if(G_KeyHook == 0)
{
printf("Hook attached error!\n %ld",GetLastError());
}
else
{
G_ThreadID = ThreadID;
return G_KeyHook;
}
}
else
{
printf("Hook had already been attached before!");
return 0;
}
return 0;
}

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(VK_F10 == wParam && ((DWORD)lParam & 0x40000000))
{
printf("F10 pressed, hook_KeyboardProc\n");
}
return CallNextHookEx(G_KeyHook, nCode, wParam, lParam);
}


测试部分:

头文件:TestExcute.h

#pragma comment(lib,"..\\Debug\\Dll_Functions.lib")
_declspec(dllimport) HHOOK SetHook(HWND hWnd,DWORD ThreadID);


执行:HookExecute.cpp

#include<windows.h>
#include <tchar.h> //UNICODE SUPPORT
#include <stdio.h>
#include"TestExcute.h"

void main()
{
HHOOK ExcuteHook;
HWND hwnd = ::FindWindow(TEXT("notepad"),NULL);
if( hwnd == NULL)
{
printf ("Not Run\n");
return;
}
DWORD ProcessID = 0;
DWORD ThreadID = GetWindowThreadProcessId(hwnd,&ProcessID);
ExcuteHook = SetHook(hwnd, ThreadID);
}

...全文

相关推荐

SetWindowsHookEx消息钩子机制与VC++工程实现

Windows消息钩子是操作系统消息分发路径上的关键拦截机制,它允许开发者在消息抵达窗口过程前进行观察、修改或拦截。核心API SetWindowsHookEx 注册一个回调插槽,其触发依赖于安装线程的消息循环,这也是许多初学者调试失败的根本原因。理解钩子类型(如 WH_GETMESSAGE、WH_KEYBOARD_LL)的回调签名、返回值语义及 DLL 注入机制,是构建可靠消息采集与自动化输入方案的基础。技术价值方面,消息钩子广泛用于键盘监听、鼠标行为统计、窗口调试和跨进程消息监控。本文基于一个完整的 V

黄泓毅

VC局部钩子[HOOK]的实现

我发现我写的都是超短的代码来着.....闲话少说,今天说一下VC中局部钩子的实现.先看看MSDN中对于设置钩子这个函数的说明HHOOK SetWindowsHookEx(  int idHook,        // type of hook to install  即钩子类型  HOOKPROC lpfn,     // address of hook procedure  指向钩子

Sugar_Tiger

MFC全局键鼠钩子实战:SetWindowsHookEx原理与完整实现

在Windows桌面应用开发中,全局键盘鼠标监听是很多工具类软件的核心需求,比如全局快捷键、键鼠操作录制与回放。系统级输入事件的捕获依赖一套底层消息钩子机制,其中SetWindowsHookEx是最关键的API,它允许开发者将自定义回调函数挂入输入事件链,从而在应用失去焦点时依然能够感知和拦截键鼠行为。这种低层钩子(WH_KEYBOARD_LL/WH_MOUSE_LL)无需DLL注入,直接在进程内执行回调,兼具易用性与实时性,广泛用于自动化测试、远程协助和演示录制等场景。本文围绕MFC框架,深入讲解全局钩子

路科

vc 局部钩子HOOK(线程钩子)

HHOOK SetWindowsHookEx(   int idHook,        // type of hook to install  即钩子类型   HOOKPROC lpfn,     // address of hook procedure  指向钩子的指针,即钩子处理过程   HINSTANCE hMod,    // handle to application insta

wuqiyinglang

SetWindowsHookEx全局钩子实战:原理、代码与避坑指南

Windows系统编程中,钩子(Hook)机制是一项强大的事件拦截技术,允许应用程序在消息流经系统时插入自定义逻辑。SetWindowsHookEx作为核心接口,被广泛用于键盘鼠标监控、UI自动化测试、输入统计等场景。许多开发者初学时只关注API签名,却容易忽略钩子链的传递机制、回调执行上下文以及32/64位进程差异等关键细节。本文通过一个基于Python ctypes的完整可运行demo,深入剖析低级键盘钩子(WH_KEYBOARD_LL)的安装、回调与卸载全流程,并对比常见钩子类型的适用场景。重点解析全

珍喜欢点灯啊
评论 3
收藏 已收藏
分享
返回顶部