首先我们需要明白程序实际上程序中的每个窗口都会有个句柄(即:窗口句柄)这个句柄是唯一的,在同一时刻不会有两个同样的句柄存在.一般来说灰色按纽激活程序都是激活的当前活动的窗口即当前得到焦点的窗口,(其他没得到焦点的窗口为灰色标题栏)如何得到呢?我们可以用一个API
GetForegroundWindow
这个API即可获得当前激活的窗口.返回类型就是一个句柄,函数原形如下:
HWND GetForegroundWindow(VOID);
下面就是关键了.需要用到一个API
BOOL EnumChildWindows(
HWND hWndParent,
WNDENUMPROC lpEnumFunc,
LPARAM lParam
);
这个函数的作用为枚举出指定窗口的全部子窗口.窗口的子窗口可以理解为窗口上的控件,因为这些控件例如按钮其实也是窗口,但是他是在窗口上,所以为子窗口,同理,用GetForegroundWindow获得到的自然是父窗口的句柄了.
这个可能不大好理解,简单的说就是那些例如按钮之类的控件都是子窗口,所以我们用上面那个API可以把这些控件枚举出来,这个函数是需要一个回调函数的.
先说明下这个API的参数,第一个为父窗口的句柄,第二个为回调函数的指针,第三个一般为NULL他的意思是给回调函数的参数,必要的时候可以通过这个传递一个指针给回调函数.
下面看下回调函数.
BOOL CALLBACK EnumChildProc(
HWND hwnd, // handle to child window
LPARAM lParam // application-defined value
){
...
}
这样系统每枚举一个控件就会调用一次这个函数.启动第一个参数就是控件的句柄.
例如我们做如下判断
if (!::IsWindowEnabled(hwnd))
{//处理灰色
::EnableWindow(hwnd,TRUE)
}
这样灰色的按钮就可以被激活了.
感谢: http://tbxy.blog.com.cn/archives/2006/1578246.shtml