解决方案 »

  1.   

    从DLLMain中传递的参数获取的hModule获取的
      

  2.   

    全局Hook会将Dll注入到其他进程, 其他进程不能调用你的主进程的回调函数吧?
    至于返回非1屏蔽鼠标消息, 是因为返回非0值就不会将消息再传递目标窗口过程了(参见MSDN).
      

  3.   

    有道理,那我应该用什么方法获取到全局的鼠标消息呢?也就是用什么方法能让我的主程序知道发生了这些鼠标事件呢?按理说我传递了主程序的回调函数地址应该能够调用啊,而且我在DLL中回调函数的地址设为了共享,对所有应用程序是一样的。
      

  4.   

    有道理,那我应该用什么方法获取到全局的鼠标消息呢?也就是用什么方法能让我的主程序知道发生了这些鼠标事件呢?按理说我传递了主程序的回调函数地址应该能够调用啊,而且我在DLL中回调函数的地址设为了共享,对所有应用程序是一样的。
    地址设为了共享, 代码总在你主程序中吧? 其他程序可以访问主程序的内存空间? 传送的话可以发送WM_COPYDATA或者CreateFileMapping创建一个命名的内存映射.
      

  5.   

    试试SetWindowsHookEx(WH_MOUSE_LL, ...);
      

  6.   

    Quote: 引用 5 楼 ProgrammingRing 的回复:

    一语中的啊,谢谢啊,原来这才是问题的所在,你说的这两种方法具体应如何实现呢?顺便问下哈,您用过钩子吗?有很多问题想要请教啊~
      

  7.   

    你说的这种鼠标钩子中不需要把钩子处理函数写到DLL中的吧,你的意思是把钩子处理函数写到主程序中?现在的问题是能捕获到消息,但是是不能在主程序里捕获到。
      

  8.   

    1> WM_COPYDATA
    COPYDATASTRUCT CopyData = {0, DataSize, Data};  // DataSize和Data分别为要传送的数据和长度
    SendMessage(主程序窗口句柄, WM_COPYDATA, NULL, &CopyData);
    2> CreateFileMapping
    HANDLE MapHandle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, 内存大小高32, 低32, TEXT("MemMap"));
    LPVOID MapMemory = MapViewOfFile(MapHandle, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
    Dll中可以将信息写入MapMem
    主程序中可以通过
    HANDLE MapHandle =  CreateFileMapping(INVALID_HANDLE_VALUE, NULL, 内存大小高32, 低32, TEXT("MemMap"));

    HANDLE MapHandle = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, TEXT("MemMap"));
    LPVOID MapMemory = MapViewOfFile(MapHandle, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
    来打开创建的内存映射, 从MapMemory中获取Dll中写入的数据.
    你也可以设置个标记什么的来通知Dll写了数据, 主程序可以读了,如信号.
    你也可以如上面那位所说, 用WH_MOUSE_LL看看, 印象里貌似低级钩子可以不用安装到DLL中, 直接在主程序中挂钩, 处理函数可以直接放到主程序中
      

  9.   

    你说的这种鼠标钩子中不需要把钩子处理函数写到DLL中的吧,你的意思是把钩子处理函数写到主程序中?现在的问题是能捕获到消息,但是是不能在主程序里捕获到。
    是的,不需要写到dll中。
      

  10.   

    用这种方法能够实现dll监控exe某个消息吗?
      

  11.   

    有道理,那我应该用什么方法获取到全局的鼠标消息呢?也就是用什么方法能让我的主程序知道发生了这些鼠标事件呢?按理说我传递了主程序的回调函数地址应该能够调用啊,而且我在DLL中回调函数的地址设为了共享,对所有应用程序是一样的。
    地址设为了共享, 代码总在你主程序中吧? 其他程序可以访问主程序的内存空间? 传送的话可以发送WM_COPYDATA或者CreateFileMapping创建一个命名的内存映射.
    也可以不使用共享内存,从dll向主程序直接发消息也可以,如果你主程序有窗口。
    在主程序启动dll前 g_hModule = LoadLibrary("dllhook.dll")
    然后StartHool再把g_hModule 传回去。
    在dll里面建一个窗口指针把主程序的窗口传进去。
    dll hook到鼠标消息后,将鼠标信息合成一个消息串发送到主窗口就可以。