环境32位xp,vc2005,这个是跨窗口子类化的DLL,从CSDN上拷贝的
----------------------------
#include   "stdafx.h"   
  //////////////////////////////////////////////////////////////////////   
  //共享数据段   
  #pragma   data_seg(".MYDATA")   
  HHOOK   g_hProc   =   NULL;   //   钩子窗口   过程句柄     
  WNDPROC   OldProc=NULL;//子类化窗口   过程地址   
  HWND   hookhandle=NULL;//挂钩的窗口句柄   
  bool   subReady=FALSE;//子类化标志   识别   
  int   handleMessage=NULL;//消息句柄,撤销子类化   
  int   handleMessage2=NULL;//消息句柄,捕捉到   动作   
  int   handleMessage3=NULL;//消息句柄,动作达到限定   
  HWND   Resivehandle=NULL;//接收消息的vb窗口句柄   
  long   Maxcount=NULL;//最大打标次数限定   
  #pragma   data_seg()   
  #pragma   comment(linker,"/SECTION:.MYDATA,RWS")   
  //////////////////////////////////////////////////////////////////////   
    
  HINSTANCE   g_hInstDLL=NULL;   //DLL实例句柄   
  //////////////////////////////////////////////////////////////////////   
   
  //DLL入口   函数   
  BOOL   APIENTRY   DllMain( HANDLE   hModule,     DWORD     ul_reason_for_call,    LPVOID   lpReserved   )   
  {   
  g_hInstDLL=(HINSTANCE)hModule;   
  handleMessage   =   RegisterWindowMessage("MyMessage");   
  handleMessage2   =   RegisterWindowMessage("note");   
  handleMessage3   =   RegisterWindowMessage("stop");   
  return   TRUE;   
  }   
    
  //最大打标次数限定,接收消息的vb窗口句柄,赋值代码   
  long   __stdcall   info(HWND   ju,long   maxtime)   //参数p1,p2   
  {     
  Resivehandle=ju;   
  Maxcount=maxtime;   
  return   1;   
  }   
    
  //////////////////////////////////////////////////////////////////////   
    
  //子类化窗口过程函数   
  LRESULT   CALLBACK   WindowProc(   
      HWND   hwnd,             //   handle   to   window   
      UINT   uMsg,             //   message   identifier   
      WPARAM   wParam,     //   first   message   parameter   
      LPARAM   lParam       //   second   message   parameter   
  )   
  {   
  //在这做出对消息的处理   
  static   long   COUNTS;   
  if   (uMsg==(unsigned   int)handleMessage)//收到撤销子类化消息   
  {   
  Beep(700,5);   
  SetWindowLong(hookhandle,GWL_WNDPROC,(long)OldProc);   
  subReady=FALSE;   
  return   TRUE;   
  }   
  if   (uMsg==WM_LBUTTONDOWN   &&   COUNTS==Maxcount)//达到限定次数   
  {   
  PostMessage(Resivehandle,handleMessage3,0,0);   
  COUNTS=0;   
  //Beep(700,5);   
  return   TRUE;   
  }   
  if   (uMsg==WM_LBUTTONDOWN   )//收到鼠标左键按下消息   
  {   
  PostMessage(Resivehandle,handleMessage2,0,0);   
  COUNTS++;   
  Beep(700,5);   
  }   
  //将窗口消息传递给Windows处理   
  return   (long)CallWindowProcA(OldProc,hwnd,uMsg,wParam,lParam);   
  }   
  //////////////////////////////////////////////////////////////////////   
    
  //钩子   过程函数   
  LRESULT   CALLBACK   CallWndProc(int   nCode,   WPARAM   wParam,   LPARAM   lParam)     
  {   
  if   (subReady==FALSE)   
  {   
  OldProc=(WNDPROC)GetWindowLong(hookhandle,GWL_WNDPROC);   
  SetWindowLong(hookhandle,GWL_WNDPROC,(long)WindowProc);   
  subReady=TRUE;   
  }   
  return   CallNextHookEx(g_hProc,   nCode,   wParam,   lParam);     
  }   
  //////////////////////////////////////////////////////////////////////   
    
  //   挂接钩子函数     
  long   __stdcall   WINAPI   SetHook(HWND   ju2)   
  {   
  DWORD   dwThreadID;   
  hookhandle=ju2;   
  if   (ju2   !=   NULL)     
  {   
  //   挂接钩子   
  subReady=FALSE;   
  dwThreadID   =GetWindowThreadProcessId(ju2,   NULL);       
  g_hProc   =   SetWindowsHookEx(WH_CALLWNDPROC,   CallWndProc,   g_hInstDLL,   dwThreadID);     
    }   
  else     
  {     
  //   卸载钩子   
  UnhookWindowsHookEx(g_hProc);     
  }     
  return   1;   
  }   
----------------------
; DLL-for-zhuru.def : 声明 DLL 的模块参数。LIBRARY      "DLL-for-zhuru"EXPORTS
    ; 此处可以是显式导出
    info   @1   
SetHook   @2
-----------------------------------------------
大家帮我看一下,生成时,出现三个错误,三个警告
-----------------------------------------------
1>------ 已启动生成: 项目: DLL-for-zhuru, 配置: Debug Win32 ------
1>正在编译...
1>DLL-for-zhuru.cpp
1>d:\test-pro\dll-for-zhuru\dll-for-zhuru\dll-for-zhuru.cpp(25) : error C2664: “RegisterWindowMessageW”: 不能将参数 1 从“const char [10]”转换为“LPCWSTR”
1>        与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>d:\test-pro\dll-for-zhuru\dll-for-zhuru\dll-for-zhuru.cpp(26) : error C2664: “RegisterWindowMessageW”: 不能将参数 1 从“const char [5]”转换为“LPCWSTR”
1>        与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>d:\test-pro\dll-for-zhuru\dll-for-zhuru\dll-for-zhuru.cpp(27) : error C2664: “RegisterWindowMessageW”: 不能将参数 1 从“const char [5]”转换为“LPCWSTR”
1>        与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>d:\test-pro\dll-for-zhuru\dll-for-zhuru\dll-for-zhuru.cpp(54) : warning C4311: “类型转换”: 从“WNDPROC”到“long”的指针截断
1>d:\test-pro\dll-for-zhuru\dll-for-zhuru\dll-for-zhuru.cpp(81) : warning C4312: “类型转换”: 从“LONG”转换到更大的“WNDPROC”
1>d:\test-pro\dll-for-zhuru\dll-for-zhuru\dll-for-zhuru.cpp(82) : warning C4311: “类型转换”: 从“LRESULT (__stdcall *)(HWND,UINT,WPARAM,LPARAM)”到“long”的指针截断
1>生成日志保存在“file://d:\test-pro\DLL-for-zhuru\DLL-for-zhuru\Debug\BuildLog.htm”
1>DLL-for-zhuru - 3 个错误,3 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========
-------------------------------------------------------------------------------------------------------------
请教,为什么?
如果您有现成的实例的话,发给我个,多谢多谢....最好是宿主程序,主程序,注入DLL,多谢多谢,小妹拜谢....我全部的分都拿出来了..

解决方案 »

  1.   

      handleMessage  =  RegisterWindowMessage("MyMessage"); 
      handleMessage2  =  RegisterWindowMessage("note"); 
      handleMessage3  =  RegisterWindowMessage("stop");  
    改成这样  RegisterWindowMessage(TEXT("MyMessage"));  其他2个一样加上 TEXT() 就行了
      

  2.   

    从错误提示看是UNICODE的问题,在每个字符串前面加个L就行了。
      

  3.   

    改了成RegisterWindowMessage(TEXT("MyMessage"));   错误变了.还是错误许多..您能帮我调试一下吗?
      

  4.   

    SetWindowLong(hookhandle,GWL_WNDPROC,(long)OldProc);  
    这句提示:warning C4311: “类型转换”: 从“WNDPROC”到“long”的指针截断
    这个怎么改?
    --写程序真辛苦...
      

  5.   

    不是这样加的,
    写成这样:RegisterWindowMessage(L"MyMessage");  用L还是用TEXT都可以,不过都不能加括号。
      

  6.   

    上面都说了从WNDPROC到long指针截断,那就将long改成WNDPROC啊
      

  7.   

    是不是setwindowlong这个是LONG类型的?要改这个函数的类型吗?还是其中的参数类型?
      

  8.   

    现在还有两个错误
    ----------------真是麻烦您了.
    1>------ 已启动生成: 项目: DLL-for-zhuru, 配置: Debug Win32 ------
    1>正在链接...
    1>mfcs80ud.lib(dllmodul.obj) : error LNK2005: _DllMain@12 已经在 DLL-for-zhuru.obj 中定义
    1>   正在创建库 D:\test-pro\DLL-for-zhuru\Debug\DLL-for-zhuru.lib 和对象 D:\test-pro\DLL-for-zhuru\Debug\DLL-for-zhuru.exp
    1>D:\test-pro\DLL-for-zhuru\Debug\DLL-for-zhuru.dll : fatal error LNK1169: 找到一个或多个多重定义的符号
    1>生成日志保存在“file://d:\test-pro\DLL-for-zhuru\DLL-for-zhuru\Debug\BuildLog.htm”
    1>DLL-for-zhuru - 2 个错误,0 个警告
    ========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========
      

  9.   

    还请问一下,我找到了一个HOOKAPI的例子,请问HOOKAPI可以得到按钮的点击动作吗?还是改改就可以得到任何动作了?
      

  10.   


    不建议直接用L,_T和TEXT是宏,要加括号的
    除非这样RegisterWindowMessageW(L"MyMessage");
    看看最新的SDK或MSDN吧
    SetWindowLong最后一个参数是LONG_PTR,
    #define SetWindowLongPtr SetWindowLong
    SetWindowLong(hookhandle,GWL_WNDPROC,(LONG_PTR)OldProc); 
      

  11.   


    就是DllMain定义重复啦新建项目后,IDE会在生成的某个cpp文件中添加DllMain了
    而你复制的代码中又含有DllMain函数
      

  12.   


    定时SendMessage WM_GETTEXT
      

  13.   

      handleMessage  =  RegisterWindowMessage(L"MyMessage"); 
      handleMessage2  =  RegisterWindowMessage(L"note"); 
      handleMessage3  =  RegisterWindowMessage(L"stop");  
      

  14.   

    RegisterWindowMessage(_T("MyMessage"));  
      

  15.   

    VS2005和VC6最让人不舒服的是UNICODE,不过,你只要将属性是的字符集由UNICODE改为多字节,一般的编译性问题都好解决