做了个简单的系统鼠标钩子
但是只有鼠标在我的对话框中才有效~~不知道为什么..
希望达人帮忙!!我的关键代码如下:// 共享数据段
#pragma data_seg(".Hookdata")
HWND s_hTargetWnd = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.Hookdata, rws")// 需要的全局变量
HINSTANCE g_hModule = NULL; // 实例句柄
HHOOK g_hHook = NULL; // 钩子句柄BOOL APIENTRY DllMain( HINSTANCE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID /*lpReserved*/
 )
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
g_hModule = hModule;
}
else if (ul_reason_for_call == DLL_PROCESS_DETACH)
{
if (g_hHook != NULL)
::UnhookWindowsHookEx(g_hHook);
}    return TRUE;
}static LRESULT CALLBACK MyMouseProc(int iCode, WPARAM wParam, LPARAM lParam)
{
do
{
if (iCode < 0)
break; MSG msg = *((LPMSG)lParam);
switch (msg.message)
{
case WM_LBUTTONDOWN:
::SendMessage(s_hTargetWnd, WM_HOOKMOUSE, WM_SUB_LBTN, 0);
break;
case WM_RBUTTONDOWN:
::SendMessage(s_hTargetWnd, WM_HOOKMOUSE, WM_SUB_RBTN, 0);
break;
default: break;
}
} while(FALSE); return ::CallNextHookEx(g_hHook, iCode, wParam, lParam);
}// 鼠标钩子类
// 
// 安装钩子
BOOL CMouseHook::Start()
{
// g_hHook = ::SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MyMouseProc, g_hModule, 0);
g_hHook = ::SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)MyMouseProc, g_hModule, 0);
if (g_hHook == NULL)
return FALSE; return TRUE;
}// 卸载钩子
BOOL CMouseHook::Stop()
{
return ::UnhookWindowsHookEx(g_hHook);
}

解决方案 »

  1.   

    做全局钩子,必须把这些代码封装到一个dll文件中,才可以,否则只能挂住自己的进程。
      

  2.   

    我这个就是在dll里啊
    我贴的接是dll的代码
      

  3.   

    to LZ:但是只有鼠标在我的对话框中才有效~~不知道为什么..
    ---------------------------------------------------------问题描述清楚点
      

  4.   

    我再描述下问题
    我贴的代码是DLL中的
    我会导出CMouseHook类和一个设置s_hTargetWnd的函数SetTargetWnd然后还有个对话框程序,里面有CMouseHook类型的成员变量
    在对话框初始化时先调用SetTargetWnd来设置窗口句柄
    然后有两个按扭分别调用CMouseHook::Start() 和 CMouseHook::Stop()调用Start后,只有鼠标在该对话框中才能钩住,其他地方根本就不会进入我的MyMouseProc
      

  5.   

    to zengwenfu():你是说把线程ID设为0吧?
    实例句柄应该是这样设的
      

  6.   

    不是没有人回,而是你DLL中的内容看不出问题,都是对,谁敢答
      

  7.   

    是不是我的DLL是对的,而对接受消息的对话框程序有问题呢
      

  8.   

    将HINSTANCEg_hModule = NULL;// 实例句柄
    HHOOKg_hHook = NULL;// 钩子句柄
    也放在共享节里试试.
      

  9.   

    我也觉得不是这个cpp代码的问题
    是头文件的问题吗?请高手们说说全局钩子应注意哪些问题?
    还有些什么东西需要设置?
    我已经完全按照网上的教程做了,还是有问题.我搞了好几天了,都没有找到错误的原因,郁闷哪!!~~~
      

  10.   

    to wltg2001(红猪):
    放在共享段也不行~~
      

  11.   

    我想到了,SendMessage(s_hTargetWnd, WM_HOOKMOUSE, WM_SUB_LBTN, 0);是不是有问题呢?WM_HOOKMOUSE是你自己定义的消息,只有你自己的进程中才能用,DLL被注入在别的进程中的时候,这个消息应该是其它进程发给你的进程的,这样行吗?是不是对这个消息要先RegisterWindowMessage一下.
      

  12.   

    感谢wltg2001(红猪)
    不过,我现在的问题是根本就不能进MyMouseProc,也就是根本就到不了SendMessage这里
      

  13.   

    wltg2001(红猪)
    我把我的整个代码给你看看如何?
      

  14.   

    仔细看了看,消息处理函数中为什么有个do while啊,什么目的呢?
      

  15.   

    这是我的习惯~~~~这样可以break出来,统一最后的处理,可防止内存泄露~~~~这里虽然没什么用~~
    这不是关键问题~~~~
      

  16.   

    其实钩子还是钩住了别的进程中的消息,我试了一下,在处理函数中加了一句:
    case WM_RBUTTONDOWN:
    ::PostMessage(s_hTargetWnd, WM_HOOKMOUSE, WM_SUB_RBTN, 0);
    MessageBox(NULL,"kKKK","ppp",MB_OK);
    发现,别的进程中的消息还是被钩住了,只是PostMessage过去的消息没反应,这个函数也没有返回错误.
      

  17.   

    没改好,只发现弹出了对话框,但是PostMessage过去的消息还是没有反应.
      

  18.   

    我自己写的最简单的DLL,能工作,你写就是不行,我也不知道区别在哪儿,晕
    1.cpp
    #define _WIN32_WINNT 0x0500
    #include  "windows.h"
    #include "1.h"
    #include "stdio.h"
    #pragma data_seg("Shared")
    HHOOK hook=NULL;
    HINSTANCE hMod=NULL;
    HWND hwnd=NULL;
    #pragma data_seg()
    #pragma comment(linker,"/Section:Shared,RWS")int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
    {       

    hMod=hInstance;
    return TRUE ;
    }
    EXPORT VOID CALLBACK InstallHook()
    {
        hook=SetWindowsHookEx(WH_GETMESSAGE,MouseProc,hMod,0);
    if(hwnd==NULL)
    hwnd=FindWindow(NULL,"MouseHookMain");}
    EXPORT LRESULT CALLBACK MouseProc(int code,WPARAM wParam,LPARAM lParam )
    {
    MSG *pMsg;
    pMsg=(MSG *)lParam;
    if(pMsg->message==WM_RBUTTONDOWN)
    {
    ::PostMessage(hwnd,WM_MOUSE_USER,WM_MOUSE_RUSER,lParam);
    }
    if(pMsg->message==WM_LBUTTONDOWN)
    {
    ::PostMessage(hwnd,WM_MOUSE_USER,WM_MOUSE_LUSER,lParam);
    }
        return CallNextHookEx(hook,code,wParam,lParam);
    }
    EXPORT VOID CALLBACK UnInstall()
    {
    UnhookWindowsHookEx(hook);
    hwnd=NULL;
    }
    1.h
    #ifdef      __cplusplus
    #define     EXPORT extern "C" __declspec (dllexport)
    #else
    #define     EXPORT __declspec (dllexport)
    #endif
    #define WM_MOUSE_USER WM_USER+5
    #define WM_MOUSE_LUSER WM_USER+6
    #define WM_MOUSE_RUSER WM_USER+7
    EXPORT LRESULT CALLBACK MouseProc(int code,WPARAM wParam,LPARAM lParam);
    EXPORT VOID CALLBACK InstallHook();
    EXPORT VOID CALLBACK UnInstall();
      

  19.   

    别的进程干吗要对WM_HOOKMOUSE做出反应?
    应该是::PostMessage(s_hTargetWnd,WM_MOUSE_USER,WM_MOUSE_RUSER,lParam);吧
      

  20.   

    唉~我写的最简单的都不能钩住~to ls
    别个进程不用做出反应,我只要钩住别个进程的鼠标消息而已~~~~但是就是钩不住~
      

  21.   

    // MessageHook.cpp : Defines the entry point for the DLL application.
    //#include "stdafx.h"
    #include "../HookTest/HookMessage.h"#pragma data_seg("Hookdata")
    HWND        s_hTargetWnd    = NULL;
    HINSTANCE   g_hModule       = NULL;
    HHOOK       g_hHook         = NULL;
    #pragma data_seg()
    #pragma comment(linker, "/section:Hookdata,RWS")#ifdef _MANAGED
    #pragma managed(push, off)
    #endif
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
     )
    {
        if (ul_reason_for_call == DLL_PROCESS_ATTACH)
        {
            g_hModule = hModule;
        }
        else if (ul_reason_for_call == DLL_PROCESS_DETACH)
        {
            if (g_hHook != NULL)
                ::UnhookWindowsHookEx(g_hHook);
        }
        return TRUE;
    }LRESULT CALLBACK MyMouseProc(int iCode, WPARAM wParam, LPARAM lParam)
    {
        do
        {
            if (iCode < 0)
                break;        MSG msg = *((LPMSG)lParam);
            switch (msg.message)
            {
            case WM_LBUTTONDOWN:
                ::SendMessage(s_hTargetWnd, WM_HOOKMOUSE, WM_SUB_LBTN, 0);
                break;
            case WM_RBUTTONDOWN:
                ::SendMessage(s_hTargetWnd, WM_HOOKMOUSE, WM_SUB_RBTN, 0);
                break;
            default: break;
            }
        } while(FALSE);    return ::CallNextHookEx(g_hHook, iCode, wParam, lParam);
    }BOOL _declspec(dllexport) StartHook(HWND _hMonitor)
    {
        s_hTargetWnd    = _hMonitor;
        g_hHook         = ::SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)MyMouseProc, g_hModule, 0);
        if (g_hHook == NULL)
            return FALSE;    return TRUE;
    }我稍微改了点东西,可以hook的
      

  22.   

    偶然的机会,解决了这个问题,在rws前面,不能有空格
    真是晕死!!!!!
    结帖