有關函數FindWindow( )。(30分)

  • 主题发起人 主题发起人 leway
  • 开始时间 开始时间
L

leway

Unregistered / Unconfirmed
GUEST, unregistred user!
以下是函數FindWindow( )在幫助中的說明。
The FindWindow function retrieves the handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows.
最後一句是This function does not search child windows.
如果我要在MDI中尋找子窗體該怎麼辦。
 
MDI的主窗体有一个 childwindows 什么的属性
就可以了
 
用getcursorpos
和windowfrompoint可以找到该窗体的句柄
否则只能使用EnumWindows
 
var
i: integer;
begin
for I := application.MainForm.MDIChildCount-1 downto 0 do
if application.MainForm.MDIChildren.name=窗口名 then begin
application.MainForm.MDIChildren.WindowState:=wsNormal;
application.MainForm.MDIChildren.BringToFront;
if application.MainForm.ActiveMDIChild.Name<>窗口名 then
application.MainForm.MDIChildren.BringToFront;
exit;
end;
end;
 
我再將題目說的詳細些。
已知某子窗口的caption,如何得到子窗口的句柄。我試過findwindow不行。
 
定义一个全局变量hh:Thandle;
function EnumWindowsProc(Hw: HWnd; AMainForm: TMainForm): Boolean; stdcall;
var
WinName, CName: array[0..144] of char;
i: integer;
begin
Result := True;
GetWindowText(Hw, WinName, 144); // 获得text
//此处再比较这个winname是不是你要找的名字是的话将hh:=hw
end;
EnumWindows(@EnumWindowsProc, 0);//然后用它来调用一下
最后判断hh是不是nil,如不是的话则hh是要找的句柄
 
试一下,不过要改一点点

function findhnd(handle:thandle;lparam:lparam):boolean;stdcall;
var
l:integer;
name:pchar;
a:string;
buffer:array [0..255] of char;
begin
result:=true;
getclassname(handle,buffer,256);
a:=strpas(buffer);
if StrPas(buffer)='TButton' then //查找对应的类
begin
l:=sendmessage(handle,WM_GETTEXTLENGTH,0,0)+1;
GetMem(Name,L);
SendMessage(handle,WM_GETTEXT,l,integer(Name));
a:=strpas(name);
if strpas(name)='button1' then //查找对应的名称
begin
pinteger(lparam)^:=handle;
result:=false;
end;
FreeMem(name,0);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
hnd:thandle;
begin
hnd:=findwindow(nil,'Form2');
if hnd<>0 then
begin
EnumChildWindows(hnd,@findhnd,integer(@hnd));
sendmessage(hnd,WM_LBUTTONDOWN,0,0);
sendmessage(hnd,WM_LBUTTONUP,0,0);
end;

end;
 
多人接受答案了。
 
后退
顶部