给到一百分,谁能拿? 1.不知你是否采用了dll作为外接库,若要成为系统钩子,应将mouseproc作为dll中的函数。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1.不知你是否采用了dll作为外接库,若要成为系统钩子,应将mouseproc作为dll中的函数。 象gamepolice说的,将SetWindowsHookEx()和(LCALLBACK)mouseproc()放到动态连接库中去。 摘自: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; 。。 ---- 你挂上动态连接库然后你在连接选项中设定SHAREDATE应该没有问题的 我就是按贺士成的文章搞的,SHAREDATA也设定。i have used dll, 参见csdn的程序员大本影的光盘(99年的),有一个用系统钩子取得别的进程的键盘输入的例子,我把它改成其他用途试过,没有问题。当然要用到dll. msdn中有这么一个例子,是捕获窗口消息的.我作过些程序,基本参考了它.我觉得挺经典的.另外我在 <程序员大本营2000>中见过类似的例子. 我只记得一点。全局钩子一定要放在DLL中(包括定义等)。你的代码我没看。不过我以前的错误就是没放在DLL中。不知对你有没有帮助。 在我的主页上有两个我写的关于系统钩子的源程序,一个是WH_MOUSE、WH_KEYBOARD的钩子,一个是WH_JOURNALPLAYBACK、WH_JOURNALRECORD的钩子,你可以去看看,应该有帮助 不是所有的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中就为正确的值了. 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));一点问题都没有. 没时间仔细看你的问题,但是做全局钩子最常见的有两个问题1。全局钩子需要用DLL2。因为用了DLL,DLL进入了每一个它钩到的进程空间,WINDOWS采用写时拷贝,所以全局变量是互相不能读到的。这种情况可以通过把变量放在共享读写的数据段来解决。 那个贺成士基本是抄 Visual C++ 4 How to 上的一篇文章, 结果现在到处都署他的大名,真是的 hehe,我只想要分,不想答复,成不成啊? 呵呵……忘写主页地址了:http://sxbyl.home.chinaren.com 先说声西谢谢各位,再说声对不起。近来不知道出了甚么问题,拨号连通163后,可以用OICQ,FOXMAIL,就是不能浏缆网页,说找不到服务器,我都快急死了。更怪的是,可用OICQ,但PING腾讯却PING不到。i have e source code to u,sxbyl.thank u. 我找到我的错误了,在.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好象行不通,或是用别的方法? tmd,怎么没有我的分?大哥,我第一次来,给点盘缠行不行? 通过应用程序名获取应用程序路径方法讨论? vs2008中ATL例子的编译问题 [求助]关于CBitmapButton 求书:OpenGL及其在VC++6.0下的开发 如何改变Release编译后的exe文件? vc++6.0對文件操作問題!!!高手指教,急!急!急! 菜鸟求助----如何连接Mysql数据库啊! 如何在vc中使用比较精确的计时器 请教:DWORD和UINT两种类型有什么区别? 请问如何才能知道MODEM的当前状态? →→→→惨淡←←←← auto_ptr in STL
贺成士
》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; 。。
----
然后你在连接选项中设定SHAREDATE
应该没有问题的
另外我在 <程序员大本营2000>中见过类似的例子.
不过我以前的错误就是没放在DLL中。不知对你有没有帮助。
你程序的目的不知是什么?不知是否去获取别的APP的标题或PASSWORD,如果是这目的,你不必建立DLL,而且可以不用HOOK,用SetCapture();WindowFromPoint(pt);ReleaseCapture()实现.
在你的源中有错误的地方.GetWindowText(glhTargetWnd,szCaption,100)该函数不能在此使用,它只能用于同一应用程序中,所以你只能取得自己程序的标题了.可以用SendMessage(glhTargetWnd,WM_GETTEXT,100,(LPARAM)(LPCTSTR)szCaption),如果它返回>0,在szCaption中就为正确的值了.
GetWindowText随便怎么用都可以的,只要你确定可以得到另外一个窗口的句柄。
在Hook中更容易了:
比如MouseHook的MouseProc里:
LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
LPMOUSEHOOKSTRUCT pMouseHook = (MOUSEHOOKSTRUCT *)lParam;
..........
::GetWindowText(pMouseHook->hwnd,WndText,sizeof(WndText));
一点问题都没有.
1。全局钩子需要用DLL
2。因为用了DLL,DLL进入了每一个它钩到的进程空间,WINDOWS采用写时拷贝,所以全局变量是互相不能读到的。这种情况可以通过把变量放在共享读写的数据段来解决。
真是的
我只想要分,不想答复,成不成啊?
i have e source code to u,sxbyl.thank u.
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好象行不通,或是用别的方法?
大哥,我第一次来,给点盘缠行不行?