// msg32.cpp : Defines the entry point for the DLL application.
//#include "stdafx.h"
#include "stdio.h"#pragma data_seg ("abcdata")
HHOOK h=NULL;
HINSTANCE inst=NULL;
#pragma data_seg()
LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(nCode<0)
return CallNextHookEx(h,nCode,wParam,lParam);
char c[100];
MOUSEHOOKSTRUCT *a=(MOUSEHOOKSTRUCT *)lParam;sprintf(c,"%d==%d===%d",wParam,a->pt.x,a->pt.y);
::TextOut(::GetDC(0),10,10,c,strlen(c));
if(wParam==WM_LBUTTONUP)
::TextOut(::GetDC(0),10,30,"WM_LBUTTONUP",strlen("WM_LBUTTONUP"));
if(wParam==WM_MBUTTONDBLCLK)
::TextOut(::GetDC(0),10,30,"WM_MBUTTONDBLCLK",strlen("WM_MBUTTONDBLCLK"));return CallNextHookEx(h,nCode,wParam,lParam);//全局是非法操作
}BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
 )
{
HINSTANCE lib;
HWND h2=NULL;
inst=(HINSTANCE)hModule; h=::SetWindowsHookEx(WH_MOUSE,MouseProc,inst,0);
return TRUE;
}def里是这样定义的
SETCTIONS  abcdata READ WRITE SHARED
dll调用的时候是这样调用的
typedef void (*AA)(int nCode, WPARAM wParam, LPARAM lParam);void CAbcdDlg::OnButton1() 
{
extern HINSTANCE lib;
AA lp;
lib=::LoadLibrary("msg.dll");
if(!lib)::AfxMessageBox("err");
}出问题的地方是:
鼠标在调用这个dll的那个程序的窗口里移动没有问题,只要一移出那个窗口就出非法操作,哪位有时间的话最好帮我真正按上面的代码调试一下,我实在是没有办法自己解决了

解决方案 »

  1.   

    可能是::GetDC(0)出错。你在DLL程序里加上
      if(::GetDC(0)==NULL)
      {
         ::MessageBox(NULL,"hdc error","hdc",MB_OK);
         return CallNextHookEx(h,nCode,wParam,lParam);
      }
    还有你的AA lp;这句有用吗?
      

  2.   

    應該是getdc的問題,我也做過一個,用windowfrompoint先得到hwnd,再做GetDC,比較好吧。
      

  3.   

    把::SetWindowsHookEx(WH_MOUSE,MouseProc,inst,0);
    放到DllMain里不好。当鼠标进入其它窗口时,其它窗口所在的进程会加载你的Dll,这样DllMain会被再次调用。
    应该写一个Dll export函数调用SetWindowsHookEx,此外终止时还要调用UnhookWindowsHook卸载钩子。
      

  4.   

    我试了一下,我把安装和删除钩子的函数单独做到了dll中的函数里,现在已经不再出现非法操作,但是还有一个问题,就是鼠标在调用这个dll的那个程序的窗口上移动时不触动钩子函数,如果移出这个窗口就正常,不知道是怎么回事?