获得其他程序的子窗体

通过一个父窗体的句柄,递归的枚举它的子窗体,我们可以最终找到需要的子窗体。
  用法如下:

  nParentHandle: HWnd;
  nChildHandle: HWnd;

  nParentHandle :
= FindWindow(nil'Notepad');
  
if nParentHandle <> 0 then
    nChildHandle :
= FindChildWindow(nParentHandle, 'SomeChildEditsClassName');

------函数代码------

var
hwndFindChildWindow : HWND;

function EnumWindowsForFindChildWindowProc(WHandle: HWND; lParam: LPARAM): BOOL; exportstdcall;
const
MAX_WINDOW_NAME_LEN 
= 80;
var
sTargetClassName: 
string;
nHandle: HWnd;
sCurrClassName: 
string;
bResult: Boolean;
begin
if (hwndFindChildWindow <> 0then
exit;
sTargetClassName :
= PChar(lParam);
sCurrClassName :
= GetWindowClass(WHandle);
bResult :
= CompareText(sCurrClassName, sTargetClassName) = 0;
If (bResult) 
then
hwndFindChildWindow :
= WHandle
else
FindChildWindow(WHandle, PChar(lParam));
end;

function FindChildWindow(hwndParent: HWnd; ClassName: PChar) : HWnd;
begin
try
EnumChildWindows(hwndParent, @EnumWindowsForFindChildWindowProc, LongInt(PChar(ClassName)));
Result :
= hwndFindChildWindow;
except
on Exception 
do
Result :
= 0;
end;
end;

//返回当前获得焦点的窗体
function GetFocusedWindowFromParent(ParentWnd:HWnd):HWnd;
var
OtherThread,
Buffer : DWord;
idCurrThread: DWord;
begin
OtherThread :
= GetWindowThreadProcessID(ParentWnd, @Buffer);
idCurrThread :
= GetCurrentThreadID;
if AttachThreadInput(idCurrThread, OtherThread, true) then begin
Result :
= GetFocus;
AttachThreadInput(idCurrThread, OtherThread, false);
end
else
Result:
= GetFocus;
end;

//获得当前获得焦点的子窗体,即使它是其他应用程序的窗体
function GetFocusedChildWindow: HWnd;
begin
Result :
= GetFocusedWindowFromParent(GetForegroundWindow);
end;

//获得窗体的文本
function EIGetWinText(nHandle: Integer): string;
var
pcText: 
array[0..32768of char;
begin
SendMessage(nHandle, WM_GETTEXT, 
32768, LongInt(@pcText));
Result :
= pcText;
end;

//设定窗体的文本
procedure EISetWinText(nHandle: Integer; const sNewText: string);
begin
SendMessage(nHandle, WM_SETTEXT, Length(sNewText), LongInt(PChar(Trim(sNewText))));
end;

//返回窗体的类名
function EIGetWindowClass(const nHandle: HWnd): string;
var
szClassName: 
array[0..255of char;
begin
GetClassName(nHandle, szClassName, 
255);
Result :
= szClassName;
end;


posted @ 2009-07-27 12:29  Handll  阅读(286)  评论(0编辑  收藏  举报