有三种Edit 类型
1)对话框,单文档,如:记事本,写字板类型
先要Find主窗口(主应用句柄)
找到主应用最后一个子窗口
找到主应用最后一个子窗口的最顶层窗口的句柄。
2)MDI多文档,如VC++的编辑框,UltraEdit32等
先要Find主窗口(主应用句柄)
连接MDIClient, 即用FindWindowEx找到主应用的子窗口名为"MDIClient"的窗口句柄。
找到MDICLient窗口句柄的,最后一个顶层窗口(the last TopWindow),
3)Edit框不是最后一个TopWindow,如VC++的编译结果显示框,和Delphi的Unit.pas编辑框。
用遍历法找
我写了一个VC++例子,基本全是API调用,C++BUilder直接用,稍做改动就可用于delphi。
// 记录输入参数的指针
static char *wClassName;
static char *wWindowName;
////////////////////////////////////////////////////
// 回调函数,用于找主应用句柄,类名,窗口名
// 如果不是为了用匹配法寻找窗口句柄
// 用FindWindow(wClassName, wWindowName)就够了
////////////////////////////////////////////////////
bool __stdcall EnumProc(HWND hWnd,LPARAM lParam)
{
char title[110];
char className[95];
if(hWnd == NULL)
return FALSE;
::GetClassName(hWnd,className,95);
::GetWindowText(hWnd,title,110);
if (wClassName != NULL)
if ( strstr(className, wClassName) == NULL )
return TRUE;
if (wWindowName != NULL)
if ( strstr(title, wWindowName) == NULL )
return TRUE;
// 找到了,把句柄传回去。
*((HWND*)lParam) = hWnd;
return FALSE;
}
////////////////////////////////////////////////////
// 找到一个窗口类名象..., 窗口标题象...的主应用句柄
// 可以类名或窗口名可以为NULL。
////////////////////////////////////////////////////
HWND GetWindowLike(const char *lpLikeClassName,const char *lpLikeWindowName)
{
HWND ControledhWnd = 0;
if ( (lpLikeClassName != NULL) && (*lpLikeClassName != _NIL_) )
wClassName = (char *)lpLikeClassName;
else
wClassName = NULL;
if ( (lpLikeWindowName != NULL) && (*lpLikeWindowName != _NIL_) )
wWindowName = (char *)lpLikeWindowName;
else
wWindowName = NULL;
if ( (wClassName == NULL) && (wWindowName == NULL) )
return NULL;
::EnumWindows((WNDENUMPROC)EnumProc,(LPARAM)&ControledhWnd);
return ControledhWnd;
}
////////////////////////////////////////////////////
// 找到窗口句柄hWnd的一个子窗口
// 子窗口类名象..., 窗口标题象...的主应用句柄
// 可以类名或窗口名可以为NULL。
////////////////////////////////////////////////////
HWND LookupAChildWindow(HWND hWnd, const char *className, const char *windowTitle)
{
char cName[100], wTitle[100];
BOOL iFind = FALSE;
int i;
for (i = 0; (i < _MAXSEARCHLEVEL_) && (hWnd != NULL); i++, hWnd = ::GetNextWindow(hWnd,GW_HWNDNEXT))
{
iFind = TRUE;
::GetClassName(hWnd, cName, 95);
::GetWindowText(hWnd, wTitle, 95);
if ( className != NULL)
if (strstr(cName, className) == NULL)
iFind = FALSE;
if (windowTitle != NULL)
if (strstr(wTitle, windowTitle) == NULL)
iFind = FALSE;
if (! iFind)
{
HWND hParent = hWnd;
if ( (hParent = ::GetTopWindow(hParent)) != NULL)
{
if ( (hParent = LookupAChildWindow(hParent, className, windowTitle)) != NULL)
{
hWnd = hParent;
break;
}
}
}
else
break;
}
return hWnd;
}
////////////////////////////////////////////////////
// 找到窗口句柄hWnd的顶层窗口句柄
////////////////////////////////////////////////////
HWND GetLastTopWindow(HWND hWnd)
{
if (hWnd == NULL)
return NULL;
int i;
HWND ahWnd = hWnd;
for (i = 0; (i < _MAXSEARCHLEVEL_) && (ahWnd != NULL); i++)
{
ahWnd = ::GetTopWindow(hWnd);
if (ahWnd == NULL)
break;
else
hWnd = ahWnd;
}
for (i = 0, ahWnd = hWnd; (i < _MAXSEARCHLEVEL_) && (ahWnd != NULL); i++)
{
ahWnd = ::GetNextWindow(hWnd,GW_HWNDNEXT);
if (ahWnd == NULL)
break;
else
hWnd = ahWnd;
}
return hWnd;
}
// 得到一个窗口句柄的MDI多文档Client主句柄
HWND GetWindowMDICLient(HWND hWnd)
{
return ::FindWindowEx(hWnd, NULL, "MDIClient", "");
}
////////////////////////////////////////////////////
// 找到窗口句柄hWnd的最后一个子窗口句柄
////////////////////////////////////////////////////
HWND GetLastChildWindow(HWND hWnd)
{
if (hWnd == NULL)
return NULL;
int i;
HWND ahWnd = ::GetWindow(hWnd, GW_CHILD);
for (i = 0; (i < _MAXSEARCHLEVEL_) && (ahWnd != NULL); i++)
{
hWnd = ahWnd;
ahWnd = ::GetWindow(hWnd,GW_HWNDNEXT);
if (ahWnd == NULL)
break;
}
return hWnd;
}
注:
(1)记事本写字板可用
hWnd = GetWindowLike("Notepad", NULL)
hWnd = GetLastChildWindow(hWnd);
hEdit = GetLastTopWindow(hWnd);
(2)VC++主编辑器
hWnd = GetWindowLike(NULL, "Microsoft Visual C++")
hWnd = GetWindowMDICLient(hWnd);
hEdit = GetLastTopWindow(hWnd);
(3)Delphi的Unit1.pass
hWnd = GetWindowLike("TEditWindow", "Unit1.pas")
hEdit = LookupAChildWindow(hWnd, "TEditControl", NULL)
这里的HWND就是Handle