钩子函数全局问题

linux_fay 2011-04-01 09:08:40
最近写了一个全局钩子函数,可是运行之后,却不是全局的,哪位大侠知道这是怎么回事?
...全文
156 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lactoferrin 2011-04-01
  • 打赏
  • 举报
回复
1、那个 Hook 的 HANDLE 应该共享的;无需共享
hook handle只能给安装的进程用,CallNextHookEx的第一参数被忽略
linux_fay 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lactoferrin 的回复:]
引用 14 楼 linux_fay 的回复:

引用 13 楼 lactoferrin 的回复:
就是WH_KEYBOARD_LL等于多少加进去

呵呵,很感谢你的及时回复,我试试先~

记住用LL的就不用在dll中完成
[/Quote]
嗯 Thanks
Lactoferrin 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 linux_fay 的回复:]

引用 13 楼 lactoferrin 的回复:
就是WH_KEYBOARD_LL等于多少加进去

呵呵,很感谢你的及时回复,我试试先~
[/Quote]
记住用LL的就不用在dll中完成
linux_fay 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lactoferrin 的回复:]
就是WH_KEYBOARD_LL等于多少加进去
[/Quote]
呵呵,很感谢你的及时回复,我试试先~
lazy_2010 2011-04-01
  • 打赏
  • 举报
回复
1、那个 Hook 的 HANDLE 应该共享的;

2、在共享段中的数据,应当初始化,不然无效;

3、取消 Hook 之后,应当发送广播消息 WM_NULL 以使得别的 application 取消 Hook。
Lactoferrin 2011-04-01
  • 打赏
  • 举报
回复
就是WH_KEYBOARD_LL等于多少加进去
linux_fay 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lactoferrin 的回复:]
其实你不用装,补充定义就行
[/Quote]

?? 大侠,求解
Lactoferrin 2011-04-01
  • 打赏
  • 举报
回复
其实你不用装,补充定义就行
linux_fay 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lactoferrin 的回复:]
使用visual studio 2010即可
[/Quote]
呃~ 那我得 去装VS2010试试了,这样就能解决问题? 希望吧!
Lactoferrin 2011-04-01
  • 打赏
  • 举报
回复
使用visual studio 2010即可
linux_fay 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lactoferrin 的回复:]
这是因为你的头文件太老了
[/Quote]
我用的是VC6.0,这个没包含?或者还要新加什么头文件? 谢谢
Lactoferrin 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 linux_fay 的回复:]

引用 3 楼 lactoferrin 的回复:
你把hInst = hInstance;注释掉干什么?
hInst,oldmousehook,oldkeyhook都无需共享,CallNextHookEx也不用传入oldmousehook,0即可
oldmousehook,oldkeyhook应该叫MouseHookHandle,KeyboardHookHandle
BOOL WINAPI……
[/Quote]
这是因为你的头文件太老了

运行之后,在焦点在程序窗体外时,不能响应,所以就不是全局的
只要不止一个程序受到钩子的影响就是全局的

这是切换左右键的

LRESULT CALLBACK MouseHookProc(
int code,
WPARAM wParam,
MSLLHOOKSTRUCT*lParam
)
{
static INPUT Input={INPUT_MOUSE};
if(code<0||lParam->flags&LLMHF_INJECTED)return CallNextHookEx(0,code,wParam,(LPARAM)lParam);
switch(wParam)
{
case WM_LBUTTONDOWN:
Input.mi.dx=lParam->pt.x;
Input.mi.dy=lParam->pt.y;
Input.mi.mouseData=lParam->mouseData;
Input.mi.dwFlags=MOUSEEVENTF_RIGHTDOWN;
Input.mi.time=lParam->time;
Input.mi.dwExtraInfo=lParam->dwExtraInfo;
SendInput(1,&Input,sizeof(INPUT));
return 1;
case WM_LBUTTONUP:
Input.mi.dx=lParam->pt.x;
Input.mi.dy=lParam->pt.y;
Input.mi.mouseData=lParam->mouseData;
Input.mi.dwFlags=MOUSEEVENTF_RIGHTUP;
Input.mi.time=lParam->time;
Input.mi.dwExtraInfo=lParam->dwExtraInfo;
SendInput(1,&Input,sizeof(INPUT));
return 1;
case WM_RBUTTONDOWN:
Input.mi.dx=lParam->pt.x;
Input.mi.dy=lParam->pt.y;
Input.mi.mouseData=lParam->mouseData;
Input.mi.dwFlags=MOUSEEVENTF_LEFTDOWN;
Input.mi.time=lParam->time;
Input.mi.dwExtraInfo=lParam->dwExtraInfo;
SendInput(1,&Input,sizeof(INPUT));
return 1;
case WM_RBUTTONUP:
Input.mi.dx=lParam->pt.x;
Input.mi.dy=lParam->pt.y;
Input.mi.mouseData=lParam->mouseData;
Input.mi.dwFlags=MOUSEEVENTF_LEFTUP;
Input.mi.time=lParam->time;
Input.mi.dwExtraInfo=lParam->dwExtraInfo;
SendInput(1,&Input,sizeof(INPUT));
return 1;
}
return CallNextHookEx(0,code,wParam,(LPARAM)lParam);
}

int wmain()
{
HHOOK hHook;MSG msg;
hHook=SetWindowsHookExW(WH_MOUSE_LL,(HOOKPROC)MouseHookProc,GetModuleHandleW(0),0);
while (GetMessageW(&msg, 0, 0, 0)!=-1);
}



WH_MOUSE_LL=14
WH_KEYBOARD_LL=13
typedef struct tagMSLLHOOKSTRUCT {
POINT pt;
DWORD mouseData;
DWORD flags;
DWORD time;
ULONG_PTR dwExtraInfo;
} MSLLHOOKSTRUCT, *PMSLLHOOKSTRUCT, *LPMSLLHOOKSTRUCT;
linux_fay 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jieleiping 的回复:]
你怎么判断的HOOK没有全局的???
[/Quote]
运行之后,在焦点在程序窗体外时,不能响应,所以就不是全局的
linux_fay 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lactoferrin 的回复:]
你把hInst = hInstance;注释掉干什么?
hInst,oldmousehook,oldkeyhook都无需共享,CallNextHookEx也不用传入oldmousehook,0即可
oldmousehook,oldkeyhook应该叫MouseHookHandle,KeyboardHookHandle
BOOL WINAPI DllMain(HINSTANCE hInstan……
[/Quote]
注释hInst = hInstance;因为我加载的时候给了它参数了,不注释也还是一样的效果。还有就是改成WH_MOUSE_LL,WH_KEYBOARD_LL,编译错误,没这个东西。不过还是谢谢你!
jieleiping 2011-04-01
  • 打赏
  • 举报
回复
你怎么判断的HOOK没有全局的???
Lactoferrin 2011-04-01
  • 打赏
  • 举报
回复
你把hInst = hInstance;注释掉干什么?
hInst,oldmousehook,oldkeyhook都无需共享,CallNextHookEx也不用传入oldmousehook,0即可
oldmousehook,oldkeyhook应该叫MouseHookHandle,KeyboardHookHandle
BOOL WINAPI DllMain(HINSTANCE hInstance,ULONG What,LPVOID NotUsed)
{

switch(What)
{
case DLL_PROCESS_ATTACH://在进程加载时安装
hInst = hInstance;
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:

break;
case DLL_THREAD_DETACH:
break;
}

return 1;
}

void InstallHook(void)
{

oldmousehook=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseProc,hInst,0);
oldkeyhook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyBoardProc,hInst,0);
}


如果用WH_MOUSE_LL,WH_KEYBOARD_LL就可以直接在exe中完成
linux_fay 2011-04-01
  • 打赏
  • 举报
回复

#include "windows.h"
#include "hookdll.h" //键盘按键值定义

#include "string.h"
#include "stdio.h"
#include <iostream.h>

//#include <afx.h>

#pragma data_seg("hookdata")//参数导出
char command[90];
HHOOK oldkeyhook=NULL;
HHOOK oldmousehook=NULL;
HWND hwnd=NULL;
HANDLE com;
HINSTANCE hInst=NULL;
bool doSend=false;
OVERLAPPED wOverLaped1 = {0}; //写操作使用的OVERLAPPED结构
#pragma data_seg()

#pragma comment(linker,"/SECTION:hookdata,RWS")//导出全局数据

#define DllExport extern "C"__declspec(dllexport)
DllExport LRESULT WINAPI CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam );//钩子函数导出
DllExport LRESULT WINAPI CALLBACK MouseProc(int nCode,WPARAM wParam, LPARAM lParam );//钩子函数导出
DllExport void InstallHook(HINSTANCE hInstance);//安装钩子函数导出
DllExport void EndHook();//卸载钩子函数导出
DllExport void setSend(bool Send);//
DllExport void setCom(HANDLE Com);//
DWORD send(HANDLE hCom,LPCVOID lpBuffer,DWORD nNumber);
/*动态库入口函数*/
BOOL WINAPI DllMain(HINSTANCE hInstance,ULONG What,LPVOID NotUsed)
{

switch(What)
{
case DLL_PROCESS_ATTACH://在进程加载时安装
// hInst = hInstance;
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:

break;
case DLL_THREAD_DETACH:
break;
}
return 1;
}


/*安装键盘钩子函数*/
void InstallHook(HINSTANCE hInstance)
{

oldmousehook=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseProc,hInstance,0);
oldkeyhook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyBoardProc,hInstance,0);
}
/*键盘钩子函数回调函数*/
LRESULT WINAPI CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam )
{
return CallNextHookEx(oldkeyhook,nCode,wParam,lParam);
}

LRESULT WINAPI CALLBACK MouseProc(int nCode,WPARAM wParam, LPARAM lParam )
{
return CallNextHookEx( oldmousehook,nCode,wParam,lParam);
}

void EndHook()
{
UnhookWindowsHookEx(oldmousehook);
UnhookWindowsHookEx(oldkeyhook);
}

lazy_2010 2011-04-01
  • 打赏
  • 举报
回复
上代码吧

15,471

社区成员

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

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