关于hook程序 WH_KEYBOARD_LL无用

一个程序员的修炼之路 2011-10-25 05:13:39
#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

HINSTANCE hInst;

#pragma data_seg("kbdata")
HHOOK keyhook = 0;
#pragma data_seg()

#pragma comment(linker, "/SECTION:kbdata,RWS")

#define DLLExport extern "C" __declspec(dllexport)

BOOL WINAPI DllMain(HINSTANCE hInstance, ULONG What, LPVOID NotUsed)
{
switch(What)
{
case DLL_PROCESS_ATTACH:
hInst = hInstance;
break;
default: break;
}
return TRUE;
}

DLLExport LRESULT CALLBACK KBProc(int nCode, WPARAM wParam, LPARAM lParam)
{
FILE *fp;
//if (lParam & 0x80000000)
//if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)
{
fp = fopen("C:\\key.txt", "a");
fprintf(fp, " Code:%d %4d\n", nCode, wParam);
fclose(fp);
}
return CallNextHookEx(keyhook, nCode, wParam, lParam);
}

DLLExport void InstallHook()
{
keyhook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KBProc, hInst, 0);
}
DLLExport void EndHook(void)
{
UnhookWindowsHookEx(keyhook);
}


上面的是我hook dll,采用InstallHook后 key.txt中并为捕获到按键,纠结....中
望有人指点一二
...全文
310 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lactoferrin 的回复:]

因为这个钩子过程是在GetMessage 中被调用的,相当于一个消息
[/Quote]

thank you!
Lactoferrin 2011-10-25
  • 打赏
  • 举报
回复
因为这个钩子过程是在GetMessage 中被调用的,相当于一个消息
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lactoferrin 的回复:]

引用 9 楼 cjf_iceking 的回复:

引用 5 楼 lactoferrin 的回复:

WH_KEYBOARD_LL不需要用dll

我用 单exe试过了 同样不行.....

你有没有试我给的代码
[/Quote]

先谢谢你了,我发现了问题,我原先的测试工程代码(win32 console)

p_install(); //装钩子
Sleep(30000); //这段时间内测试钩子
p_End(); //卸载钩子

用上面的方法做不行,后来我的测试代码改成:
p_install();

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
p_End();

这样就可以了


我的问题是,为何需要再应用程序中加上消息循环才能成功?
Lactoferrin 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cjf_iceking 的回复:]

引用 5 楼 lactoferrin 的回复:

WH_KEYBOARD_LL不需要用dll

我用 单exe试过了 同样不行.....
[/Quote]
你有没有试我给的代码
gameslq 2011-10-25
  • 打赏
  • 举报
回复
用dll实现包括键盘、鼠标 hook 调用界面等。
http://download.csdn.net/detail/gameslq/3692065
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lactoferrin 的回复:]

WH_KEYBOARD_LL不需要用dll
[/Quote]
我用 单exe试过了 同样不行.....

  • 打赏
  • 举报
回复
[Quote=引用 3 楼 aizeng 的回复:]

俺这边是可以获得键值的。如果你那里不行,就在KeyboardProc里设置断点,看被调用了没有。
[/Quote]

我将WH_KEYBOARD_LL 换成 WH_KEYBOARD却可以获取

为何WH_KEYBOADR_LL就获得不了了呢?
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oyljerry 的回复:]

dll是否被正确加载,安装是否hook成功
[/Quote]

dll成功加载,hook成功
Lactoferrin 2011-10-25
  • 打赏
  • 举报
回复
WH_KEYBOARD_LL的例子,把Z键改成C键
#include<windows.h>

LRESULT CALLBACK LowLevelKeyboardProc(
int nCode,
WPARAM wParam,
LPARAM lParam
)
{
if(((PKBDLLHOOKSTRUCT)lParam)->vkCode=='Z')
{
INPUT Input[1];
Input[0].type=INPUT_KEYBOARD;
Input[0].ki.wVk='C';
Input[0].ki.dwFlags=((PKBDLLHOOKSTRUCT)lParam)->flags&LLKHF_UP?KEYEVENTF_KEYUP:0;
Input[0].ki.wScan=MapVirtualKeyExW('C',0,0);
Input[0].ki.time=0;
Input[0].ki.dwExtraInfo=0;
SendInput(1,Input,sizeof(INPUT));
return 1;
}
return CallNextHookEx(0,nCode,wParam,lParam);
}

int wmain()
{
MSG msg;
SetWindowsHookExW(WH_KEYBOARD_LL,LowLevelKeyboardProc,GetModuleHandleW(0),0);
while(GetMessageW(&msg,0,0,0))DispatchMessageW(&msg);
return 0;
}
Lactoferrin 2011-10-25
  • 打赏
  • 举报
回复
WH_KEYBOARD_LL不需要用dll
oyljerry 2011-10-25
  • 打赏
  • 举报
回复
dll是否被正确加载,安装是否hook成功
演地 2011-10-25
  • 打赏
  • 举报
回复
俺这边是可以获得键值的。如果你那里不行,就在KeyboardProc里设置断点,看被调用了没有。
宇影周邵 2011-10-25
  • 打赏
  • 举报
回复
不要在钩子函数中做费时的操作
演地 2011-10-25
  • 打赏
  • 举报
回复

HHOOK g_hKey = NULL;
HWND g_hWnd = NULL;
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
if (code == HC_ACTION)
{
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
if(wParam == WM_KEYUP)
{
ofstream outfile("D:\\aaa.txt", ofstream::out | ofstream::app);
char buf1[1024] = {0};
sprintf(buf1, "code: %d %4d", code, p->vkCode);
outfile << buf1 << endl;
outfile.close();
}
}
return ::CallNextHookEx(g_hKey, code, wParam, lParam);
}

void SetHook(HWND hWnd)
{
g_hWnd = hWnd;
g_hKey = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, GetModuleHandle("Hook"), 0);
}

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧