枚舉窗口

// 爲指定的父窗口枚舉子窗口、按鈕
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('句柄:' + inttostr(AhWnd));
    lines.add('-------');
  end;
  result := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  hWnd: LongInt;
begin
  Memo1.lines.Clear;
  Memo1.lines.add(Edit1.Text + ' 有如下控件類名稱');
  hWnd := Strtoint(Edit1.Text);
  // hWnd:=FindWindow(nil,pchar(Edit1.Text));
  if hWnd <> 0 then
  begin
    EnumChildWindows(hWnd, @EnumChildWndProc, 0);
  end
  else
    MessageBox(self.handle, '沒找到該窗口句柄', '提示', 0);
end;



//根據句柄獲取進程PID(需要引用PsAPI單元)
Function GetPidAndPath(Han: Hwnd): String;
Var
  Pid: Cardinal;
  PHandle: THandle;
  Buf: Array [0 .. 254] Of Char;
Begin
  GetWindowThreadProcessId(Han, @Pid); // 根據句柄獲得進程PID
  PHandle := OpenProcess(PROCESS_ALL_ACCESS, False, Pid); // 通過進程PID獲取進程句柄
  GetModuleFileNameEx(PHandle, 0, Buf, 255); // 通過進程句柄獲取其模塊路徑
  CloseHandle(PHandle);
  if Buf <> '' then
  Begin
    Result := Buf;  //返回程序路徑
  End;
End;
//枚舉可視所有窗口句柄
procedure TForm1.Button1Click(Sender: TObject);
Var
  A: Hwnd;
  Sztext: Array [0 .. 254] Of Char;
begin
  A := GetWindow(Handle, GW_HwndFirst);
  while A <> 0 do
  Begin
    if (GetWindowText(A, Sztext, 254) > 0) And (IsWindowVisiBle(A)) then
    Begin
      Memo1.Lines.Add(Sztext);
    End;
    A := GetWindow(A, GW_HwndNext);
  End;
end;
// 通過子窗口句柄獲取最主窗口句柄
function ChildGetMainWindow(a: hWnd): Integer; 
Var
  Thw: hWnd;
  TBl: Integer;
Begin
  while a <> 0 do
  Begin
    if a <> 0 then
      Result := a;
    a := GetParent(a);
  End;
End;




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章