请问EnumChildWindow怎样获得一个窗口中Edit的句柄!(50分)

  • 主题发起人 主题发起人 sh9
  • 开始时间 开始时间
S

sh9

Unregistered / Unconfirmed
GUEST, unregistred user!
请问用EnumChildWindow怎样获得一个窗口中Edit的句柄!
举例好吗?
 
function EnumChildWindowsProc(H: HWnd; lparam: longint): Boolean; stdcall;
var
Buffer: array[0..10] of Char;
begin
Result := True; //設定為True才會再找下一個
getclassname(h,buffer,10);
if trim(StrPas(Buffer))='Edit' then
begin
ThisUrl:= StrAlloc(250);
SendMessage(h,WM_GETTEXT,249,Integer(ThisUrl));
Result:=False;//設定為false不找下一個
end;
end;

procedure GetEdit;
begin
EnumChildWindows(getforegroundwindow, @EnumChildWindowsProc, 0);
end;
 
有三种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_) &amp;&amp; (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_) &amp;&amp; (ahWnd != NULL); i++)
{
ahWnd = ::GetTopWindow(hWnd);
if (ahWnd == NULL)
break;
else
hWnd = ahWnd;
}
for (i = 0, ahWnd = hWnd; (i < _MAXSEARCHLEVEL_) &amp;&amp; (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_) &amp;&amp; (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
 
接受答案了.
 
后退
顶部