功能:递归式查找所有的窗口,包括多层的子窗口,以找到标题为包含<参数1>的窗口句柄。
这样可以找到报表窗口了。
一般情况下,在VFP里处理不到报表窗口,用这函数取得它句柄后,就可以随心所欲的处置它了。
参数1 :窗口标题的一部分文本。
参数2(选项):父窗口句柄 hwnd,用来限定搜索的范围。不指定的话,以windows desktop 作范围,即在windows所有窗口及子窗口中查找。
返回:窗口句柄。
例子:gnFindWindow('Report Designer', _vfp.hwnd)
{"gnFindWindow", (FPFI) gnFindWindow, 2,"C,.I"}
HWND FindWindowByCaption(HWND hParentWin,
char
*
caption)
{ // hParentWin为0,则取desktop
HWND hChild,hNext,hResult = 0 ;
char cTmp[ 100 ] ;
string pattern = caption ;
if (hParentWin == 0 )
hParentWin = GetDesktopWindow();
// (0) 每次的处理:比较窗口标题
GetWindowText(hParentWin,cTmp, 100 );
string s = cTmp;
// (1) 退出条件:找到 包含caption的窗口
if ( s.find(pattern, 0 ) != 0xffffffff )
return hParentWin;
// (2) 退出条件: 无子窗口
if ( (hChild = GetWindow(hParentWin,GW_CHILD) ) == 0 )
return hResult;
// (3) 进入方法:列举本窗口下的所有子窗口
hNext = hChild ;
while ( hNext != 0 )
{
if ( (hResult = FindWindowByCaption(hNext,caption)) != 0 )
return hResult;
hNext = GetWindow(hNext,GW_HWNDNEXT);
}
return hResult;
}
void gnFindWindow(ParamBlk FAR * parm)
{ // char cCaption, int hParent
HWND hParent = parm -> pCount == 1 ? 0 :(HWND) parm -> p[ 1 ].val.ev_long ;
NullTerminate( & parm -> p[ 0 ].val);
char * cCaption = ( char * ) _HandToPtr(parm -> p[ 0 ].val.ev_handle);
_RetInt( ( long ) FindWindowByCaption(hParent, cCaption), 30 );
}
{ // hParentWin为0,则取desktop
HWND hChild,hNext,hResult = 0 ;
char cTmp[ 100 ] ;
string pattern = caption ;
if (hParentWin == 0 )
hParentWin = GetDesktopWindow();
// (0) 每次的处理:比较窗口标题
GetWindowText(hParentWin,cTmp, 100 );
string s = cTmp;
// (1) 退出条件:找到 包含caption的窗口
if ( s.find(pattern, 0 ) != 0xffffffff )
return hParentWin;
// (2) 退出条件: 无子窗口
if ( (hChild = GetWindow(hParentWin,GW_CHILD) ) == 0 )
return hResult;
// (3) 进入方法:列举本窗口下的所有子窗口
hNext = hChild ;
while ( hNext != 0 )
{
if ( (hResult = FindWindowByCaption(hNext,caption)) != 0 )
return hResult;
hNext = GetWindow(hNext,GW_HWNDNEXT);
}
return hResult;
}
void gnFindWindow(ParamBlk FAR * parm)
{ // char cCaption, int hParent
HWND hParent = parm -> pCount == 1 ? 0 :(HWND) parm -> p[ 1 ].val.ev_long ;
NullTerminate( & parm -> p[ 0 ].val);
char * cCaption = ( char * ) _HandToPtr(parm -> p[ 0 ].val.ev_handle);
_RetInt( ( long ) FindWindowByCaption(hParent, cCaption), 30 );
}
写C++,真是不容易呵,过后再看C#,小菜一碟