#include "stdafx.h"
#include "Hook_dll.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif#ifndef _EXPORTING
#define _EXPORTING
#endif
#include "myfunc.h"
//多个进程的共享数据
#pragma data_seg("SHARDATA")
//是否已经初始化
BOOL gbInited = FALSE;
//是否已经安装
BOOL gbInstalled = FALSE;
//安装挂钩的窗口
static HWND ghwndMain = NULL; // Main hwnd. We will get this from the App
#pragma data_seg()
//外面定义的全局应用对象
extern CHook_dllApp theApp;
//进程范围的钩子句柄
static HHOOK hHook;将调用此DLL的窗口句柄传入
extern "C" void __stdcall InitHooksDll(HWND hwndMainWindow)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
ghwndMain = hwndMainWindow;
gbInited = TRUE; }//消息钩子
LRESULT __stdcall LowLevelMouseProc (int nCode, WPARAM wParam, LPARAM lParam )
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// BOOL b;
// MSG *lpMsg;
if ( nCode >= 0 ) {
SetWindowPos(ghwndMain,HWND_TOP, 0, 0, 0, 0,SWP_NOMOVE|SWP_NOSIZE); }
//调用下一个钩子
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
extern "C" BOOL __stdcall InstallFilter (BOOL bInstall)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); if ( ! gbInited )
{
return FALSE;
}
if ( bInstall )
{
if(!gbInstalled)
{
hHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC) LowLevelMouseProc, theApp.m_hInstance,0);
if(hHook)
{
gbInstalled = TRUE;
}
}
}
else
{
if(gbInstalled)
{
if(UnhookWindowsHookEx(hHook))
{
gbInstalled = FALSE;
}
}
}//else return gbInstalled;
}我设了一全局的钩子,但不知为什么这个钩子只能钩调用他的那个程序中的鼠标信息,请问,这是为什么?全局钩子的参数又是怎么样的呢?
#include "Hook_dll.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif#ifndef _EXPORTING
#define _EXPORTING
#endif
#include "myfunc.h"
//多个进程的共享数据
#pragma data_seg("SHARDATA")
//是否已经初始化
BOOL gbInited = FALSE;
//是否已经安装
BOOL gbInstalled = FALSE;
//安装挂钩的窗口
static HWND ghwndMain = NULL; // Main hwnd. We will get this from the App
#pragma data_seg()
//外面定义的全局应用对象
extern CHook_dllApp theApp;
//进程范围的钩子句柄
static HHOOK hHook;将调用此DLL的窗口句柄传入
extern "C" void __stdcall InitHooksDll(HWND hwndMainWindow)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
ghwndMain = hwndMainWindow;
gbInited = TRUE; }//消息钩子
LRESULT __stdcall LowLevelMouseProc (int nCode, WPARAM wParam, LPARAM lParam )
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// BOOL b;
// MSG *lpMsg;
if ( nCode >= 0 ) {
SetWindowPos(ghwndMain,HWND_TOP, 0, 0, 0, 0,SWP_NOMOVE|SWP_NOSIZE); }
//调用下一个钩子
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
extern "C" BOOL __stdcall InstallFilter (BOOL bInstall)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); if ( ! gbInited )
{
return FALSE;
}
if ( bInstall )
{
if(!gbInstalled)
{
hHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC) LowLevelMouseProc, theApp.m_hInstance,0);
if(hHook)
{
gbInstalled = TRUE;
}
}
}
else
{
if(gbInstalled)
{
if(UnhookWindowsHookEx(hHook))
{
gbInstalled = FALSE;
}
}
}//else return gbInstalled;
}我设了一全局的钩子,但不知为什么这个钩子只能钩调用他的那个程序中的鼠标信息,请问,这是为什么?全局钩子的参数又是怎么样的呢?
int idHook,
HOOKPROC lpfn,
HINSTANCE hMod,
DWORD dwThreadId
);
第一个参数:指定钩子的类型,有WH_MOUSE、WH_KEYBOARD等十多种(具体参见MSDN)
第二个参数:标识钩子函数的入口地址
第三个参数:钩子函数所在模块的句柄;
第四个参数:钩子相关函数的ID用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息。另外需要注意的是为了捕获所有事件,挂钩函数应该放在动态链接库DLL中。
SetWindowsHookEx(WH_MOUSE, (HOOKPROC) MouseProc,theApp.m_hInstance,0);
里面具体的值应该是多少才对,也就是说,theApp.m_hInstance,0 这两个参数应该用什么来代替才是全局的钩子?
不过在学校 估计你也等不及我开学了 :)你在vckbase 去找找 应该有
很简单的 做成一个独立的dllSetWindowsHookEx的第三个参数是dll实例的句柄
[email protected]