专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »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; 


标签:
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: