在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
首先申明:我是菜鸟,我只不过想把困绕了我很长时间的问题的解决方案发表出来,免得以后我又忘记,同时给还不知道这些小知识的同僚一些帮助。各位不要笑我的浅薄。同时为了表示我的低级,我会很罗嗦的讲一些基本的东西,这些都是我的理解,很不准确。 function EnumWindowsProc(AhWnd:LongInt;lParam:LongInt):boolean;stdcall;
function EnumWindows(lpEnumFunc: TFNWndEnumProc; lParam: LPARAM): BOOL; stdcall; TFNWndEnumProc其实就是指针类型。其中的lpEnumFunc就是回调函数的入口地址了。 EnumWindows(@EnumWindowsProc,0); 通过向系统注册回调函数的入口地址,系统就能在需要的时候,调用回调函数,传递参数给它,也许这些参数就是我们想要的。 function EnumWindowsProc(AhWnd:LongInt;lParam:LongInt):boolean;stdcall; 当系统找到了一个窗口后,就开始调用这个回调函数,将窗口的句柄作为第一个参数传递过来,将在EnumWindows中lParam: LPARAM这个程序定义的值作为第二个参数传递过来。
function GetWindowText(hWnd: HWND; lpString: PChar; nMaxCount: Integer): Integer; stdcall; 该函数功能是将窗口句柄为hWnd的窗口的标题拷入到一个缓冲区lpString。nMaxCount是拷入缓冲区内的最大的字符数。 function GetClassName(hWnd: HWND; lpClassName: PChar; nMaxCount: Integer): Integer; stdcall; 其参数意义和上面的函数差不多。不详细解释了。 function EnumWindowsProc(AhWnd:LongInt;AForm:TForm1):boolean;stdcall; 注意我将第二个参数改了,不要紧,到时候调用的时候注意看。 function EnumWindowsProc(AhWnd:LongInt;AForm:TForm1):boolean; var lpszClassName,lpszWindowText:array[0..254] of char; //定义两个缓冲区。 begin GetWindowText(AhWnd,lpszWindowText,254);//得到窗口标题 GetClassName(AhWnd,lpszClassName,254);//得到窗口类名。 Aform.memo1.lines.add(StrPas(lpszWindowText)); Aform.memo1.lines.add(StrPas(lpszClassName)); Aform.memo1.lines.add('--------------------'); Result:=True; end; 接着需要做的就是调用EnumWindows函数,注册回调函数入口地址,让系统调用回调函数,列举窗口了。所以再添加一个TButton: btn_listwindow procedure TForm1.btn_listwindowClick(Sender: TObject); begin EnumWindows(@EnumWindowsProc,LongInt(self)); end; 程序清单如下: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; btn_listwindow: TButton; procedure btn_listwindowClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; function EnumWindowsProc(AhWnd:LongInt;AForm:TForm1):boolean;stdcall; implementation {$R *.dfm} function EnumWindowsProc(AhWnd:LongInt;AForm:TForm1):boolean; var lpszClassName,lpszWindowText:array[0..254] of char; begin GetWindowText(AhWnd,lpszWindowText,254); GetClassName(AhWnd,lpszClassName,254); Aform.memo1.lines.add(StrPas(lpszWindowText)); Aform.memo1.lines.add(StrPas(lpszClassName)); Aform.memo1.lines.add('--------------------'); Result:=True; end; procedure TForm1.btn_listwindowClick(Sender: TObject); begin EnumWindows(@EnumWindowsProc,LongInt(self)); end; end. F9,运行,看看结果。最好是F7单步跟踪调试一下,看看回调函数是怎么被调用的。
var wndhwnd:HWND; wndhwnd:=FindWindow(nil,'某窗口标题'); if wndhwnd<>0 then file://找到此窗口句柄. begin xxxxx end else begin MessageBox(self.handle,'没找到该窗口句柄','提示',0); end; 有了这个窗口句柄,就离我们的初始目的不远了:控制其他窗体上的窗口控件. function EnumChildWindows(hWndParent: HWND; lpEnumFunc: TFNWndEnumProc;lParam: LPARAM): BOOL; stdcall; 这个函数和EnumWindow函数很有些想象.其作用也很相似.它的功能就是列举窗口句柄为hWndParent的窗体上所有的窗口控件的句柄.同样也是以回调函数参数的形式给出的.
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; 然后在一事件里调用EnumChildWindows函数. 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://输入标题. 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. 有了控件句柄,我们当然就可以随心所欲了.比如: |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论