今天学习的内容在Demo032中基本上己学过了, 此例仅在Demo32基础上做了一点延伸。
在上节中我们了解EnumchildWindows遍历桌面的子窗体, 本节使 用此函数来获取窗体中所有控件.
一、代码演示
//////////////////////////////////////////////////////////////////////////
BOOL CALLBACK EnumChildWndProc ( HWND hWnd , LPARAM lParam )
{
HWND hListbox = ( HWND ) lParam ;
if ( NULL == hWnd ) return FALSE ;
if ( NULL != hListbox && IsWindow ( hListbox ))
{
TCHAR szWndInfo [512] = {0};
TCHAR szWndTitle [256] = {0};
TCHAR szClsName [64] = {0};
GetWindowText ( hWnd , szWndTitle , 256);
GetClassName ( hWnd , szClsName , 64);
_stprintf ( szWndInfo ,
_T ( "´°¿Ú%08X " )
_T ( "\"%s\" " )
_T ( "%s " )
_T ( "%s" ),
hWnd ,
szWndTitle ,
szClsName ,
IsWindowVisible ( hWnd ) ? _T ( "Visible" ) : _T ( "Invisible" ));
SendMessage ( hListbox , LB_ADDSTRING , 0, ( LPARAM ) szWndInfo );
}
return TRUE ;
}
BOOL CALLBACK EnumChildWndProc ( HWND hWnd , LPARAM lParam )
{
HWND hListbox = ( HWND ) lParam ;
if ( NULL == hWnd ) return FALSE ;
if ( NULL != hListbox && IsWindow ( hListbox ))
{
TCHAR szWndInfo [512] = {0};
TCHAR szWndTitle [256] = {0};
TCHAR szClsName [64] = {0};
GetWindowText ( hWnd , szWndTitle , 256);
GetClassName ( hWnd , szClsName , 64);
_stprintf ( szWndInfo ,
_T ( "´°¿Ú%08X " )
_T ( "\"%s\" " )
_T ( "%s " )
_T ( "%s" ),
hWnd ,
szWndTitle ,
szClsName ,
IsWindowVisible ( hWnd ) ? _T ( "Visible" ) : _T ( "Invisible" ));
SendMessage ( hListbox , LB_ADDSTRING , 0, ( LPARAM ) szWndInfo );
}
return TRUE ;
}
HWND
hListbox
=
GetDlgItem
(
hWnd
,
IDC_LSTWNDLIST
);
SendMessage ( hListbox , LB_RESETCONTENT , 0, 0);
HWND hParent = FindWindowEx ( NULL , NULL , _T ( "Notepad" ), NULL );
EnumChildWindows ( hParent , WndEnumProc , ( LPARAM ) GetDlgItem ( hWnd , IDC_LSTWNDLIST ));
SetWindowText ( GetDlgItem ( hWnd , IDC_BTNDATAREAD ), _T ( "Refresh" ));
TCHAR szTmp [128];
DWORD dwcount = SendMessage ( GetDlgItem ( hWnd , IDC_LSTWNDLIST ), LB_GETCOUNT , 0, 0);
_stprintf ( szTmp , _T ( "size: %d" ), dwcount );
OutputDebugString ( szTmp );
SendMessage ( hListbox , LB_RESETCONTENT , 0, 0);
HWND hParent = FindWindowEx ( NULL , NULL , _T ( "Notepad" ), NULL );
EnumChildWindows ( hParent , WndEnumProc , ( LPARAM ) GetDlgItem ( hWnd , IDC_LSTWNDLIST ));
SetWindowText ( GetDlgItem ( hWnd , IDC_BTNDATAREAD ), _T ( "Refresh" ));
TCHAR szTmp [128];
DWORD dwcount = SendMessage ( GetDlgItem ( hWnd , IDC_LSTWNDLIST ), LB_GETCOUNT , 0, 0);
_stprintf ( szTmp , _T ( "size: %d" ), dwcount );
OutputDebugString ( szTmp );
本例以Notepad 窗体为目标, 通过EnumChildWindows 获取NotePad中所有的控件
二、显示结果
运行后发现NodePad 有两个控件1. Edit 2. statusbar 且不可见