首页 »PHP教程 » 详解 EnumWindows 和 EnumWindowsProc »正文
详解 EnumWindows 和 EnumWindowsProc
来源: 发布时间:星期六, 2009年12月19日 浏览:0次 评论:0
// EnumWindows 功能是遍历所有顶层窗口 function EnumWindows( lpEnumFunc: TFNWndEnumProc; {回调指针} lParam: LPARAM {给回调参数, 它对应回调第 2个参数} ): BOOL; stdcall; //成功和否, 其实是返回了回调返回值 // EnumWindows 专用回调格式: function EnumWindowsProc( hwnd: HWND; {找到窗口句柄} lParam: LPARAM {EnumWindows 传给参数; 它是指针, 可传入, 但般用作传出数据} ): Boolean; stdcall; {返回 False 时, 它 EnumWindows 将停止遍历并返回 False} 例 : 获取所有顶层窗口 句柄 //需要个 TListBox 显示数据 function EnumWindowsProc_1(hwnd: HWND; lParam: LPARAM): Boolean; stdcall; begin Form1.ListBox1.Items.Add(IntToStr(hwnd)); Result := True; end; procedure TForm1.Button1Click(Sender: TObject); begin EnumWindows(@EnumWindowsProc_1, 0); end; 例 2: 获取所有顶层窗口 标题(排除无标题窗口) function EnumWindowsProc_2(hwnd: HWND; lParam: LPARAM): Boolean; stdcall; var buf: .gif' />[Byte] of Char; begin GetWindowText(hwnd, buf, SizeOf(buf)); buf <> '' then Form1.ListBox1.Items.Add(buf); Result := True; end; procedure TForm1.Button1Click(Sender: TObject); begin EnumWindows(@EnumWindowsProc_2, 0); end;
例 3: 查找第 个记事本 句柄 function EnumWindowsProc_3(hwnd: HWND; lParam: LPARAM): Boolean; stdcall; var buf: .gif' />[Byte] of Char; begin GetClassName(hwnd, buf, SizeOf(buf)); buf = 'Notepad' then begin Form1.ListBox1.Items.Add(Format('记事本句柄: %d', [hwnd])); Result := False; //如果不需要继续找, 找到第个就结束 end begin Result := True; end; end; procedure TForm1.Button1Click(Sender: TObject); begin EnumWindows(@EnumWindowsProc_3, 0); end; 例 4: 获取所有顶层窗口 句柄和类名 : type TMyStruct = record hwnd: HWND; ClassName: ; end; TMyStructArray = .gif' /> of TMyStruct; PMyStructArray = ^TMyStructArray; function EnumWindowsProc_4(hwnd: HWND; lParam: LPARAM): Boolean; stdcall; var buf: .gif' />[Byte] of Char; p: PMyStructArray; begin GetClassName(hwnd, buf, SizeOf(buf)); p := PMyStructArray(lParam); SetLength(p^, Length(p^) + 1); p^[High(p^)].hwnd := hwnd; p^[High(p^)].ClassName := buf; Result := True; end; procedure TForm1.Button1Click(Sender: TObject); var Arr: TMyStructArray; begin EnumWindows(@EnumWindowsProc_4, Integer(@Arr)); ShowMessage(IntToStr(Length(Arr))); //总数 ShowMessageFmt('%d - %s', [Arr[0].hwnd, Arr[0].ClassName]); //第个元素 end;
例 5: 重复上 个例子, 如果 是全局遍历并不靠参数传递, 代码会简单些 type TMyStruct = record hwnd: HWND; ClassName: ; end; var Arr: .gif' /> of TMyStruct; function EnumWindowsProc_5(hwnd: HWND; lParam: LPARAM): Boolean; stdcall; var buf: .gif' />[Byte] of Char; begin GetClassName(hwnd, buf, SizeOf(buf)); SetLength(Arr, Length(Arr) + 1); Arr[High(Arr)].hwnd := hwnd; Arr[High(Arr)].ClassName := buf; Result := True; end; procedure TForm1.Button1Click(Sender: TObject); begin SetLength(Arr, 0); EnumWindows(@EnumWindowsProc_5, Integer(Arr)); ShowMessage(IntToStr(Length(Arr))); //总数 ShowMessageFmt('%d - %s', [Arr[0].hwnd, Arr[0].ClassName]); //第个元素 end; SplendourChiang 目 是获取进程 ID 和窗口句柄 , 按 "例 4" 思路方法给修改如下: type MyProcessInfo = record PID, WinHWND : DWORD; end; TMyProcessInfoArray = .gif' /> of MyProcessInfo; PMyProcessInfoArray = ^TMyProcessInfoArray; function MyEnumWindowsProc(Wnd: DWORD; lParam: LPARAM): Bool; stdcall; var PID : DWORD; p: PMyProcessInfoArray; begin GetWindowThreadProcessID(Wnd, @PID); p := PMyProcessInfoArray(lParam); SetLength(p^, Length(p^) + 1); p^[High(p^)].PID := PID; p^[High(p^)].WinHWND := Wnd; Result := True; end; procedure TForm1.Button1Click(Sender: TObject); var CC: TMyProcessInfoArray; begin SetLength(CC, 0); EnumWindows(@MyEnumWindowsProc, Integer(@CC)); ShowMessage(IntToStr(Length(CC))); //总数 ShowMessageFmt('%d - %d', [CC[0].PID, CC[0].WinHWND]); //第个元素 end;
标签:
相关文章
读者评论
发表评论
|
|