#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;
}我设了一全局的钩子,但不知为什么这个钩子只能钩调用他的那个程序中的鼠标信息,请问,这是为什么?全局钩子的参数又是怎么样的呢?

解决方案 »

  1.   

    HHOOK SetWindowsHookEx(
      int idHook,       
      HOOKPROC lpfn,     
      HINSTANCE hMod,    
      DWORD dwThreadId  
    ); 
    第一个参数:指定钩子的类型,有WH_MOUSE、WH_KEYBOARD等十多种(具体参见MSDN)
    第二个参数:标识钩子函数的入口地址
    第三个参数:钩子函数所在模块的句柄;
    第四个参数:钩子相关函数的ID用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息。另外需要注意的是为了捕获所有事件,挂钩函数应该放在动态链接库DLL中。
      

  2.   

    laiyiling(最熟悉的陌生人),其实我也知道这些参数的意义,不过我不知道要设为全局的钩子,
    SetWindowsHookEx(WH_MOUSE, (HOOKPROC) MouseProc,theApp.m_hInstance,0);
    里面具体的值应该是多少才对,也就是说,theApp.m_hInstance,0  这两个参数应该用什么来代替才是全局的钩子?
      

  3.   

    SetWindowsHookEx(WH_MOUSE, (HOOKPROC) MouseProc,AfxGetInstanceHandle(),0);
      

  4.   

    或者说,不知有没有人能给我个鼠标全局钩子的DLL(有源程序的更好),非常期待!!
      

  5.   

    我原来写了一个
    不过在学校  估计你也等不及我开学了 :)你在vckbase 去找找  应该有 
    很简单的  做成一个独立的dllSetWindowsHookEx的第三个参数是dll实例的句柄
      

  6.   

    也给我发一个吧,
    [email protected]
      

  7.   

    please put the functions you have writed in a dll
      

  8.   

    这种hook的程序在vcbase和codeproject上有很多,可以参考