有了回調(diào)函數(shù)的概念及上面的例子,我們可以繼續(xù)了。其實(shí)想要找到一個(gè)標(biāo)題已知的窗口句柄,用一個(gè)API函數(shù)就可以了:FindWindow.
其函數(shù)原形是:
function FindWindow(lpClassName, lpWindowName: PChar): HWND; stdcall;
lpClassName:窗口類名.如果只知道標(biāo)題,可以為空.窗口類名可以用很多工具獲得.如winsignt32.
lpWindowName:窗口標(biāo)題.
調(diào)用方式舉例:
var wndhwnd:HWND;
wndhwnd:=FindWindow(nil,'某窗口標(biāo)題');
if wndhwnd<>0 then file://找到此窗口句柄.
begin
xxxxx
end
else begin
MessageBox(self.handle,'沒找到該窗口句柄','提示',0);
end;
有了這個(gè)窗口句柄,就離我們的初始目的不遠(yuǎn)了:控制其他窗體上的窗口控件.
同樣,首先要得到其他窗體上窗口控件的句柄.我們用這個(gè)API函數(shù):EnumChildWindows.
其函數(shù)原形是:
function EnumChildWindows(hWndParent: HWND; lpEnumFunc: TFNWndEnumPRoc;
lParam: LPARAM): BOOL; stdcall;
這個(gè)函數(shù)和EnumWindow函數(shù)很有些想象.其作用也很相似.它的功能就是列舉窗口句柄為hWndParent的窗體上所有的窗口控件的句柄.同樣也是以回調(diào)函數(shù)參數(shù)的形式給出的.
我們?cè)倥e一個(gè)實(shí)際的例子,來說明這個(gè)函數(shù)的用法.程序的功能是讓用戶輸入一個(gè)窗口標(biāo)題,然后調(diào)用FindWindow函數(shù)找到此窗口句柄.通過這個(gè)句柄,我們?cè)谝粋€(gè)Memo里顯示該窗口上所有的窗口控件.
同樣先編寫回調(diào)函數(shù).
function EnumChildWndProc(AhWnd:LongInt;
AlParam:lParam):boolean;stdcall;
var
WndClassName: array[0..254] of Char;
WndCaption: array[0..254] of Char;
begin
GetClassName(AhWnd,wndClassName,254);
GetWindowText(aHwnd,WndCaption,254);
with form1.memo1 do
begin
lines.add( string(wndClassName));
lines.add( string(wndCaption));
lines.add('-------');
end;
result:=true;
end;
然后在一事件里調(diào)用EnumChildWindows函數(shù).
procedure TForm1.Button1Click(Sender: TObject);
var
hWnd:LongInt;
begin
memo1.Lines.Clear;
Memo1.Lines.Add(Edit1.Text+' 有如下控件類名稱');
hWnd:=FindWindow(nil,pchar(Edit1.Text));
if hWnd<>0 then
begin
EnumChildWindows(hWnd,@EnumChildWndProc,0);
end
else MessageBox(self.handle,'沒找到該窗口句柄','提示',0);
end;
程序清單如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo; file://用來顯示找到的控件
Label1: TLabel;
Edit1: TEdit; file://輸入標(biāo)題.
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
function EnumChildWndProc(AhWnd:LongInt;
AlParam:lParam):boolean;stdcall;
implementation
{$R *.dfm}
function EnumChildWndProc(AhWnd:LongInt;
AlParam:lParam):boolean;stdcall;
var
WndClassName: array[0..254] of Char;
WndCaption: array[0..254] of Char;
begin
GetClassName(AhWnd,wndClassName,254);
GetWindowText(aHwnd,WndCaption,254);
with form1.memo1 do
begin
lines.add( string(wndClassName));
lines.add( string(wndCaption));
lines.add('-------');
end;
result:=true;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hWnd:LongInt;
begin
memo1.Lines.Clear;
Memo1.Lines.Add(Edit1.Text+' 有如下控件類名稱');
hWnd:=FindWindow(nil,pchar(Edit1.Text));
if hWnd<>0 then
begin
EnumChildWindows(hWnd,@EnumChildWndProc,0);
end
else MessageBox(self.handle,'沒找到該窗口句柄','提示',0);
end;
end.
有了控件句柄,我們當(dāng)然就可以隨心所欲了.比如:
SendMessage(hWnd,WM_SETTEXT,0,LongInt(Pchar('sdafdsf')));就可以給控件發(fā)送文本.其他還可以發(fā)送不同的消息可以做很多事情.
但是,有很大一個(gè)問題:假設(shè)一個(gè)窗體上有很多相同的控件,并且根本沒辦法區(qū)分他們,即使我們能找到所有的控件句柄,我們又不能區(qū)分到底哪個(gè)是我們想要的,同樣是干著急.
我想了很長時(shí)間,后來在大富翁里找到了答案,只要用到一個(gè)小技巧,就可以解決了.
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注