高分悬赏,有胆量的进来拿分,准备1000分!

cqwty 2006-09-26 08:26:51
问题描述:如何获得一个灰色控件,比如按钮,的句柄?
如何拦截一个控件比如按钮从不可用变成可用的消息?
高手请进来回答回答一下,谢谢!
...全文
438 点赞 收藏 25
写回复
25 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
cqwty 2006-10-05
谢谢大家的回复,钩子的方法我用过了,效果不行,而且一个按钮从灰色变成可用,不一定触发的是wm_enable这个消息,所以拦截这个消息肯定不行,而且对于不同的开发工具开发出来的软件,消息不一样,当然除了windows的消息.用windows列的13种钩子不能完成这个功能.使用子类化处理可以完成,子类化处理不复杂,当然也可以使用远程进程注入的方式.现在结贴了.
回复
gaopl_8278 2006-10-04
窗口过程钩子监视所有从系统消息队列发往目标窗口的消息.
WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks
WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks使你可以监视发送到窗口过程的消息。系统在消息发送到接收窗口过程之前调用WH_CALLWNDPROC Hook子程,并且在窗口过程处理完消息之后调用WH_CALLWNDPROCRET Hook子程。WH_CALLWNDPROCRET Hook传递指针到CWPRETSTRUCT结构,再传递到Hook子程。CWPRETSTRUCT结构包含了来自处理消息的窗口过程的返回值,同样也包括了与这个消息关联的消息参数。
编写钩子程序
   编写钩子程序的步骤分为三步:定义钩子函数、安装钩子和卸载钩子。
  1.定义钩子函数
  钩子函数是一种特殊的回调函数。钩子监视的特定事件发生后,系统会调用钩子函数进行处理。不同事件的钩子函数的形式是各不相同的。下面以鼠标钩子函数举例说明钩子函数的原型:
LRESULT CALLBACK HookProc(int nCode ,WPARAM wParam,LPARAM lParam)
参数wParam和 lParam包含所钩消息的信息,比如鼠标位置、状态,键盘按键等。nCode包含有关消息本身的信息,比如是否从消息队列中移出。
我们先在钩子函数中实现自定义的功能,然后调用函数 CallNextHookEx.把钩子信息传递给钩子链的下一个钩子函数。CallNextHookEx.的原型如下:
LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam )
参数 hhk是钩子句柄。nCode、wParam和lParam 是钩子函数。
当然也可以通过直接返回TRUE来丢弃该消息,就阻止了该消息的传递。
2.安装钩子
  在程序初始化的时候,调用函数SetWindowsHookEx安装钩子。其函数原型为:
HHOOK SetWindowsHookEx( int idHook,HOOKPROC lpfn, INSTANCE hMod,DWORD dwThreadId )
参数idHook表示钩子类型,它是和钩子函数类型一一对应的。比如,WH_KEYBOARD表示安装的是键盘钩子,WH_MOUSE表示是鼠标钩子等等。
  Lpfn是钩子函数的地址。
  HMod是钩子函数所在的实例的句柄。对于线程钩子,该参数为NULL;对于系统钩子,该参数为钩子函数所在的DLL句柄。
   dwThreadId 指定钩子所监视的线程的线程号。对于全局钩子,该参数为NULL。
  SetWindowsHookEx返回所安装的钩子句柄。
  3.卸载钩子
   当不再使用钩子时,必须及时卸载。简单地调用函数 BOOL UnhookWindowsHookEx( HHOOK hhk)即可。
回复
cqwty 2006-09-28
谢谢楼上的大哥!晚上下班测试!
回复
wangk 2006-09-28
指定线程dwThreadId:
SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc lpfn,HINSTANCE hMod,dwThreadId);
你只要指定要钩的句柄所在的线程即可。
GetWindowThreadProcessId可以返回句柄所在的线程。具体参见MSDN。
回复
xyx119 2006-09-28
兄弟你有没有一千分哦,忽悠我们吧!
回复
cqwty 2006-09-27
但是是跨进程的啊,是对其他的应用程序进行的。子类化能行吗?
回复
cqwty 2006-09-27
怎么样将一个全局的钩子指定为某一个进程,因为如果是全局钩子,那系统会有点慢,但是指定一个特定的进程后,应该快很多了,不影响系统的性能。谁知道,说一下,谢谢!
回复
cqwty 2006-09-27
楼上的大哥,可以详细的说说WH_CALLWNDPROC如何使用吗?
回复
wangk 2006-09-27
消息钩子WH_CALLWNDPROC。对其他的应用程序进行子类化做起来比较麻烦,要用到远线程,绕了个大弯。
回复
cqwty 2006-09-26
本人声明,不是忽悠,本人知识短浅,所以就这样问了,大家不要笑我,我知道钩子,但是用什么钩子呢?钩子分了很多的撒,键盘,鼠标,外部输入设备的,相应有键盘钩子,鼠标钩子,日志钩子。这个用啥子钩子吗?分数绝对给大家,不忽悠大家!
回复
baojian88888 2006-09-26
这样的问题还需要悬赏?
回复
「已注销」 2006-09-26
楼主很会忽悠,你的问题用钩子应该很好解决
回复
cqwty 2006-09-26
因为是跨进程的,是不同的应用程序,而且可以指定被监视的应用程序,所以我个人也觉得钩子比较合适,拦截wm_enable的消息。楼上的各位大侠,能否告诉我拦截wm_enable消息用什么钩子?谢谢,分数会奉上的,决不食言,功劳大的多得到!
另外,小蘑菇,spy++可以手动获得,怎么手动操作啊?嘿嘿,很少用spy++,所以不知道,不要笑偶哈。
回复
iflang 2006-09-26
用spy++可以手动获得,,,,,,呵呵
回复
wangk 2006-09-26
用钩子比较好,特别是跨进程的时候。
回复
templarzq 2006-09-26
我以为是啥惊天动地的问题。。。
回复
aa3000 2006-09-26
正如小三所说。过来接分,分我100吧。。。
回复
会思考的草 2006-09-26
子类化就可以了。
回复
lixiaosan 2006-09-26
用SetWindowLong替换控件的消息处理,重新处理其消息处理回调函数

也可以写钩子
回复
cqwty 2006-09-26
通过FindWindow FindWindowEx EnumChildWindows应该可以,但是拦截WM_ENABLE消息怎么拦截呢?是用什么钩子来拦截啊?谢谢!
回复
加载更多回复
相关推荐
发帖
硬件/系统
创建于2007-09-28

2594

社区成员

VC/MFC 硬件/系统
申请成为版主
帖子事件
创建了帖子
2006-09-26 08:26
社区公告
暂无公告