本文整理自网络,侵删。
WinAPI: GetClassName - 获取指定窗口的类名==============================================
//声明:GetClassName(hWnd: HWND; {指定窗口句柄}lpClassName: PChar; {缓冲区}nMaxCount: Integer {缓冲区大小}): Integer; {返回类名大小; 失败返回 0}
//测试1: 新建一个工程, 主窗口的类名默认是 TForm1, 用程序获取一下看看varps: array[0..254] of Char;beginGetClassName(Handle, ps, 255);ShowMessage(ps); {TForm1}end;
//测试2: 看看 "计算器" 窗口的类名(先启动计算器)varh: HWND;ps: array[0..254] of Char;beginh := FindWindow(nil, '计算器'); {这句是获取计算器窗口的句柄}GetClassName(h, ps, 255);ShowMessage(ps); {SciCalc}end;
//测试3: 看看记事本窗口的类名(先重新启动记事本):varh: HWND;ps: array[0..254] of Char;beginh := FindWindow(nil, '无标题 - 记事本'); {这句是获取记事本窗口的句柄}GetClassName(h, ps, 255);ShowMessage(ps); {Notepad}end;
==枚举当前所有窗口{要有个 Memo 接受数据}procedure TForm1.Button1Click(Sender: TObject);varh: HWnd;p: array[0..254] of char;beginh := GetWindow(Handle, GW_HWNDFIRST);while h <> 0 dobeginif GetWindowText(h, p, 255) > 0 then Memo1.Lines.Add(p);h := GetWindow(h, GW_HWNDNEXT);end;end;
==============================================unit Unit1;
interface
usesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;
typeTForm1 = class(TForm)Button1: TButton;Memo1: TMemo;procedure Button1Click(Sender: TObject);end;
varForm1: TForm1;
implementation
{$R *.dfm}
{获取已打开的所有记事本的标题}procedure TForm1.Button1Click(Sender: TObject);varh: HWnd;p: array[0..254] of char;beginMemo1.Clear;h := GetWindow(Handle, GW_HWNDFIRST);while h <> 0 dobeginGetClassName(h, p, Length(p));if p = 'Notepad' thenbeginGetWindowText(h, p, Length(p));Memo1.Lines.Add(p);end;h := GetWindow(h, GW_HWNDNEXT);end;end;
end.===================================================WinAPI: FindWindow、FindWindowEx - 查找窗口FindWindow(lpClassName, {窗口的类名}lpWindowName: PChar {窗口的标题}): HWND; {返回窗口的句柄; 失败返回 0}
//FindWindowEx 比 FindWindow 多出两个句柄参数:FindWindowEx(Parent: HWND; {要查找子窗口的父窗口句柄}Child: HWND; {子窗口句柄}ClassName: PChar; {}WindowName: PChar {}): HWND;{如果 Parent 是 0, 则函数以桌面窗口为父窗口, 查找桌面窗口的所有子窗口;如果 是 HWND_MESSAGE, 函数仅查找所有消息窗口;子窗口必须是 Parent 窗口的直接子窗口;如果 Child 是 0, 查找从 Parent 的第一个子窗口开始;如果 Parent 和 Child 同时是 0, 则函数查找所有的顶层窗口及消息窗口.}
//测试1: 试着找找新建程序主窗口的句柄varh: HWND;begin{现在我们知道窗口的标题是: Form1、窗口的类名是: TForm1}h := FindWindow('TForm1', 'Form1');ShowMessage(IntToStr(h)); {656180; 这是随机, 每次启动窗口肯定不一样}
{假如不知道类名}h := FindWindow(nil, 'Form1');ShowMessage(IntToStr(h)); {656180}
{假如不知道标题名}h := FindWindow('TForm1', nil);ShowMessage(IntToStr(h)); {656180}
{其实这个窗口的句柄不就是 Self.Handle 吗}ShowMessage(IntToStr(Handle)); {656180}end;
//测试2: 找计算器窗口的句柄(先打开计算器)varh: HWND;begin{如果不是简体中文系统, 这样可能不灵}h := FindWindow(nil, '计算器');ShowMessage(IntToStr(h)); {1508334}
{最好这样, 但你得提前知道计算器窗口的类名是: SciCalc}h := FindWindow('SciCalc', nil);ShowMessage(IntToStr(h)); {1508334}end;
相关阅读 >>
更多相关阅读请进入《Delphi》频道 >>