给到一百分,谁能拿?

soft_air 2001-03-02 12:54:00
主  题:MouseHook的一小问题?
作  者:soft_air
所属论坛:Visual C++
问题点数:20
回复次数:0
人气指数:7
发表时间:2001-2-28 18:43:00

按他人原码做了个MouseHook,定义为全局钩子,但不能钩到所有applications,只钩到了使用钩子的application(mouse)的mouse消息。EDIT控件里只出现了mouse的窗口标题mouse,别的没出现,why?SetWindowsHookEx (..,..,..,0)
HWND glhTargetWnd=pMouseHook->hwnd;

//取目标窗口句柄

   HWND ParentWnd=glhTargetWnd;

   while (ParentWnd !=NULL)

   {

   glhTargetWnd=ParentWnd;

   ParentWnd=GetParent(glhTargetWnd);

   //取应用程序主窗口句柄

   }

   if(glhTargetWnd!=glhPrevTarWnd)

   {

   char szCaption[100];

   GetWindowText(glhTargetWnd,szCaption,100);

   //取目标窗口标题

   if(IsWindow(glhDisplayWnd))

   SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);

   glhPrevTarWnd=glhTargetWnd;

   //保存目标窗口

   }

...全文
545 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
eidle 2001-03-07
  • 打赏
  • 举报
回复
tmd,怎么没有我的分?
大哥,我第一次来,给点盘缠行不行?
soft_air 2001-03-07
  • 打赏
  • 举报
回复
我找到我的错误了,在.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好象行不通,或是用别的方法?

soft_air 2001-03-07
  • 打赏
  • 举报
回复
先说声西谢谢各位,再说声对不起。近来不知道出了甚么问题,拨号连通163后,可以用OICQ,FOXMAIL,就是不能浏缆网页,说找不到服务器,我都快急死了。更怪的是,可用OICQ,但PING腾讯却PING不到。
i have e source code to u,sxbyl.thank u.
sxbyl 2001-03-06
  • 打赏
  • 举报
回复
呵呵……忘写主页地址了:http://sxbyl.home.chinaren.com
金秋王 2001-03-05
  • 打赏
  • 举报
回复
不是所有的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中就为正确的值了.
sxbyl 2001-03-05
  • 打赏
  • 举报
回复
在我的主页上有两个我写的关于系统钩子的源程序,一个是WH_MOUSE、WH_KEYBOARD的钩子,一个是WH_JOURNALPLAYBACK、WH_JOURNALRECORD的钩子,你可以去看看,应该有帮助

eidle 2001-03-05
  • 打赏
  • 举报
回复
hehe,
我只想要分,不想答复,成不成啊?
rsrwx 2001-03-05
  • 打赏
  • 举报
回复
把原码e过来,我给你看看.
kaede 2001-03-05
  • 打赏
  • 举报
回复
那个贺成士基本是抄 Visual C++ 4 How to 上的一篇文章, 结果现在到处都署他的大名,
真是的
deadhorse 2001-03-05
  • 打赏
  • 举报
回复
没时间仔细看你的问题,但是做全局钩子最常见的有两个问题
1。全局钩子需要用DLL
2。因为用了DLL,DLL进入了每一个它钩到的进程空间,WINDOWS采用写时拷贝,所以全局变量是互相不能读到的。这种情况可以通过把变量放在共享读写的数据段来解决。
vcbear 2001-03-05
  • 打赏
  • 举报
回复
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));
一点问题都没有.

soft_air 2001-03-04
  • 打赏
  • 举报
回复
我就是按贺士成的文章搞的,SHAREDATA也设定。i have used dll,
xrbeck 2001-03-04
  • 打赏
  • 举报
回复
我只记得一点。全局钩子一定要放在DLL中(包括定义等)。你的代码我没看。
不过我以前的错误就是没放在DLL中。不知对你有没有帮助。
bridge 2001-03-04
  • 打赏
  • 举报
回复
msdn中有这么一个例子,是捕获窗口消息的.我作过些程序,基本参考了它.我觉得挺经典的.
另外我在 <程序员大本营2000>中见过类似的例子.
flyheart 2001-03-04
  • 打赏
  • 举报
回复
我也是过这个程序,而且通过了,没有问题.
就是按照文章里写的
flyheart 2001-03-04
  • 打赏
  • 举报
回复
我也是过这个程序,而且通过了,没有问题.
就是按照文章里写的
angwan 2001-03-04
  • 打赏
  • 举报
回复
参见csdn的程序员大本影的光盘(99年的),有一个用系统钩子取得别的进程的键盘输入的例子,我把它改成其他用途试过,没有问题。当然要用到dll.
eastsunli 2001-03-02
  • 打赏
  • 举报
回复
你挂上动态连接库
然后你在连接选项中设定SHAREDATE
应该没有问题的
vcbear 2001-03-02
  • 打赏
  • 举报
回复
摘自: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;

。。。。。。。。。。。。。。。。。
  
----
cindy2000 2001-03-02
  • 打赏
  • 举报
回复
象gamepolice说的,将SetWindowsHookEx()和(LCALLBACK)mouseproc()放到动态连接库中去。
加载更多回复(7)

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧