查找标题已知的窗口句柄,遍历窗口控件句柄
有了回調(diào)函數(shù)的概念及上面的例子,我們可以繼續(xù)了。其實(shí)想要找到一個標(biāo)題已知的窗口句柄,用一個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;
有了這個窗口句柄,就離我們的初始目的不遠(yuǎn)了:控制其他窗體上的窗口控件.
同樣,首先要得到其他窗體上窗口控件的句柄.我們用這個API函數(shù):EnumChildWindows.
其函數(shù)原形是: function EnumChildWindows(hWndParent: HWND; lpEnumFunc: TFNWndEnumProc; ? lParam: LPARAM): BOOL; stdcall;
這個函數(shù)和EnumWindow函數(shù)很有些想象.其作用也很相似.它的功能就是列舉窗口句柄為hWndParent的窗體上所有的窗口控件的句柄.同樣也是以回調(diào)函數(shù)參數(shù)的形式給出的.
我們再舉一個實(shí)際的例子,來說明這個函數(shù)的用法.程序的功能是讓用戶輸入一個窗口標(biāo)題,然后調(diào)用FindWindow函數(shù)找到此窗口句柄.通過這個句柄,我們在一個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ā)送不同的消息可以做很多事情.
????????????
閱讀全文????????轉(zhuǎn)載于:https://www.cnblogs.com/gaobo543013306/p/7819312.html
總結(jié)
以上是生活随笔為你收集整理的查找标题已知的窗口句柄,遍历窗口控件句柄的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS7搭建lamp环境
- 下一篇: Android几秒后自动关闭dialog