问题描述:如何获得一个灰色控件,比如按钮,的句柄?
如何拦截一个控件比如按钮从不可用变成可用的消息?
高手请进来回答回答一下,谢谢!
如何拦截一个控件比如按钮从不可用变成可用的消息?
高手请进来回答回答一下,谢谢!
解决方案 »
- VC调用动态库里面的类(这个动态库没有提供函数接口)详见下文(加急)
- 如何删除INI文件中的一条信息
- 如何登录局域网中其他主机的数据库SQL server
- 100分求教:非管理员权限下,Windows下如何通过编程实现增加、删除、修改路由
- 鼠标放到一个控件上面,在其他的空间可以显示提示信息
- 谁能给在下提供在一块画布上写字,字数可多可少,根据字数进行布置,字数少则字体大,字数多则字体小,不能超出画布的范围,怎么做?
- 我做切分窗体时出现这个警告:Warning: Could not find splitter cursor - using system provided alternative.,什么意思?
- 如何隐藏和显示一个对话框的一半
- 关于 windows xp
- 怎么遍历应用程序窗口中所有BUTTON并从外部控制操作?
- Visual Studio 2007 PreRelease 推出[下载][真感觉到自己老了啊~~]
- 大家帮忙分析一下以下代码为什么出现非法操作?
使能状态改变消息:WM_ENABLE,截获它即可。
楼上应该可以了
另外,小蘑菇,spy++可以手动获得,怎么手动操作啊?嘿嘿,很少用spy++,所以不知道,不要笑偶哈。
SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc lpfn,HINSTANCE hMod,dwThreadId);
你只要指定要钩的句柄所在的线程即可。
GetWindowThreadProcessId可以返回句柄所在的线程。具体参见MSDN。
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)即可。