问题描述:如何获得一个灰色控件,比如按钮,的句柄?
          如何拦截一个控件比如按钮从不可用变成可用的消息?
高手请进来回答回答一下,谢谢!

解决方案 »

  1.   

    如果是其他进程的窗口,FindWindow FindWindowEx EnumChildWindows 可以得到控件的句柄
      

  2.   

    不使能也一样获得吧,有什么不同么?
    使能状态改变消息:WM_ENABLE,截获它即可。
      

  3.   

    FindWindow FindWindowEx EnumChildWindows
    楼上应该可以了
      

  4.   

    通过FindWindow FindWindowEx EnumChildWindows应该可以,但是拦截WM_ENABLE消息怎么拦截呢?是用什么钩子来拦截啊?谢谢!
      

  5.   

    用SetWindowLong替换控件的消息处理,重新处理其消息处理回调函数也可以写钩子
      

  6.   

    用spy++可以手动获得,,,,,,呵呵
      

  7.   

    因为是跨进程的,是不同的应用程序,而且可以指定被监视的应用程序,所以我个人也觉得钩子比较合适,拦截wm_enable的消息。楼上的各位大侠,能否告诉我拦截wm_enable消息用什么钩子?谢谢,分数会奉上的,决不食言,功劳大的多得到!
    另外,小蘑菇,spy++可以手动获得,怎么手动操作啊?嘿嘿,很少用spy++,所以不知道,不要笑偶哈。
      

  8.   

    谁知道用什么方式拦截这个消息啊?wm_enable的,告诉我一下,谢谢了!
      

  9.   

    用子类化吧,SetWindowLong替换控件的窗口过程
      

  10.   

    消息钩子WH_CALLWNDPROC。对其他的应用程序进行子类化做起来比较麻烦,要用到远线程,绕了个大弯。
      

  11.   

    楼上的大哥,可以详细的说说WH_CALLWNDPROC如何使用吗?
      

  12.   

    指定线程dwThreadId:
    SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc lpfn,HINSTANCE hMod,dwThreadId);
    你只要指定要钩的句柄所在的线程即可。
    GetWindowThreadProcessId可以返回句柄所在的线程。具体参见MSDN。
      

  13.   

    窗口过程钩子监视所有从系统消息队列发往目标窗口的消息.
    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)即可。
      

  14.   

    谢谢大家的回复,钩子的方法我用过了,效果不行,而且一个按钮从灰色变成可用,不一定触发的是wm_enable这个消息,所以拦截这个消息肯定不行,而且对于不同的开发工具开发出来的软件,消息不一样,当然除了windows的消息.用windows列的13种钩子不能完成这个功能.使用子类化处理可以完成,子类化处理不复杂,当然也可以使用远程进程注入的方式.现在结贴了.