1.不知你是否采用了dll作为外接库,若要成为系统钩子,应将mouseproc作为dll中的函数。

解决方案 »

  1.   

    1.不知你是否采用了dll作为外接库,若要成为系统钩子,应将mouseproc作为dll中的函数。
      

  2.   

    象gamepolice说的,将SetWindowsHookEx()和(LCALLBACK)mouseproc()放到动态连接库中去。
      

  3.   

    摘自:Win32全局钩子在VC5中的实现  
             贺成士  
    》VC5中MFC DLL的分类及特点   在VC5中有三种形式的MFC DLL(在该DLL中可以使用和继承已有的MFC类)可供选择,即Regular statically linked to MFC DLL(标准静态链接MFC DLL)和Regular using the shared MFC DLL(标准动态链接MFC DLL)以及Extension MFC DLL(扩展MFC DLL)。第一种DLL的特点是,在编译时把使用的MFC代码加入到DLL中,因此,在使用该程序时不需要其他MFC动态链接类库的存在,但占用磁盘空间比较大;第二种DLL的特点是,在运行时,动态链接到MFC类库,因此减少了空间的占用,但是在运行时却依赖于MFC动态链接类库;这两种DLL既可以被MFC程序使用也可以被Win32程序使用。第三种DLL的特点类似于第二种,做为MFC类库的扩展,只能被MFC程序使用。   四.在VC5中全局共享数据的实现   在主文件中,用#pragma data_seg建立一个新的数据段并定义共享数据,其具体格式为:   #pragma data_seg ("shareddata")   HWND sharedwnd=NULL;//共享数据   #pragma data_seg()   仅定义一个数据段还不能达到共享数据的目的,还要告诉编译器该段的属性,有两种方法可以实现该目的(其效果是相同的),一种方法是在.DEF文件中加入如下语句:   SETCTIONS   shareddata READ WRITE SHARED   另一种方法是在项目设置链接选项中加入如下语句:   /SECTION:shareddata,rws   五.具体实现步骤   由于全局钩子函数必须包含在动态链接库中,所以本例由两个程序体来实现。   1.建立钩子Mousehook.DLL   (1)选择MFC AppWizard(DLL)创建项目Mousehook; 。。
      
    ----
      

  4.   

    你挂上动态连接库
    然后你在连接选项中设定SHAREDATE
    应该没有问题的
      

  5.   

    我就是按贺士成的文章搞的,SHAREDATA也设定。i have used dll,
      

  6.   

    参见csdn的程序员大本影的光盘(99年的),有一个用系统钩子取得别的进程的键盘输入的例子,我把它改成其他用途试过,没有问题。当然要用到dll.
      

  7.   

    msdn中有这么一个例子,是捕获窗口消息的.我作过些程序,基本参考了它.我觉得挺经典的.
    另外我在 <程序员大本营2000>中见过类似的例子.
      

  8.   

    我只记得一点。全局钩子一定要放在DLL中(包括定义等)。你的代码我没看。
    不过我以前的错误就是没放在DLL中。不知对你有没有帮助。
      

  9.   

    在我的主页上有两个我写的关于系统钩子的源程序,一个是WH_MOUSE、WH_KEYBOARD的钩子,一个是WH_JOURNALPLAYBACK、WH_JOURNALRECORD的钩子,你可以去看看,应该有帮助
      

  10.   

    不是所有的HOOK都要放到DLL中的(包括系统HOOK),不过MSDN中说明一定要把SYSTEM HOOK放入DLL中,但我在实现WH_JOURNALRECORD时,不用DLL,好像运行都正常,MSDN在对JournalRecordProc注解中说可以不在DLL中实现.
    你程序的目的不知是什么?不知是否去获取别的APP的标题或PASSWORD,如果是这目的,你不必建立DLL,而且可以不用HOOK,用SetCapture();WindowFromPoint(pt);ReleaseCapture()实现.
       在你的源中有错误的地方.GetWindowText(glhTargetWnd,szCaption,100)该函数不能在此使用,它只能用于同一应用程序中,所以你只能取得自己程序的标题了.可以用SendMessage(glhTargetWnd,WM_GETTEXT,100,(LPARAM)(LPCTSTR)szCaption),如果它返回>0,在szCaption中就为正确的值了.
      

  11.   

    to jinqiu :
    GetWindowText随便怎么用都可以的,只要你确定可以得到另外一个窗口的句柄。
    在Hook中更容易了:
    比如MouseHook的MouseProc里:
    LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
        LPMOUSEHOOKSTRUCT pMouseHook = (MOUSEHOOKSTRUCT *)lParam;
    ..........
    ::GetWindowText(pMouseHook->hwnd,WndText,sizeof(WndText));
    一点问题都没有.
      

  12.   

    没时间仔细看你的问题,但是做全局钩子最常见的有两个问题
    1。全局钩子需要用DLL
    2。因为用了DLL,DLL进入了每一个它钩到的进程空间,WINDOWS采用写时拷贝,所以全局变量是互相不能读到的。这种情况可以通过把变量放在共享读写的数据段来解决。
      

  13.   

    那个贺成士基本是抄 Visual C++ 4 How to 上的一篇文章, 结果现在到处都署他的大名,
    真是的
      

  14.   

    hehe,
    我只想要分,不想答复,成不成啊?
      

  15.   

    呵呵……忘写主页地址了:http://sxbyl.home.chinaren.com
      

  16.   

    先说声西谢谢各位,再说声对不起。近来不知道出了甚么问题,拨号连通163后,可以用OICQ,FOXMAIL,就是不能浏缆网页,说找不到服务器,我都快急死了。更怪的是,可用OICQ,但PING腾讯却PING不到。
    i have e source code to u,sxbyl.thank u.
      

  17.   

    我找到我的错误了,在.def中,把
    SECTIONS  mydata READ WRITE SHARED
     写成了
     SECTIONS 
     mydata READ WRITE SHARED
    导致出现了一个LINK  WARNING,而我没有注意到BUILD栏中的这个讯息,只顾看DEBUG栏了。
    分数照给。想给的人太多,100分拆了给各位。SXBYL  40分      VCBEAR  30分   JINGQIU     30分。
    我再问一个问题,要先于系统截获CTRL+ALT+DEL,要怎么办?用KEYBOARD HOOK好象行不通,或是用别的方法?
      

  18.   

    tmd,怎么没有我的分?
    大哥,我第一次来,给点盘缠行不行?