请问如何获得指定程序的窗口名~(100分)

  • 主题发起人 主题发起人 gaolover
  • 开始时间 开始时间
G

gaolover

Unregistered / Unconfirmed
GUEST, unregistred user!
假如
我打开了3个记事本(windows 自带的记事本)
那么在wndows任务管理器中就会出现3个映像名称为notepad.exe
那么我该如何获得所有映像名称为 notepad.exe 分别对应的窗口标题栏的文字


//总结一句话:如何获得所有记事本的窗口标题文字?

感谢各位,如果有空的话,最好希望能贴出份源码,谢谢!
 
枚举进程,主要代码
procedure TProcessInfoList.EnumProcess;
var
p : TProcessInfo;
ContinueLoop : BOOL;
FSnapshotHandle : THandle;
FProcessEntry32 : TProcessEntry32;
sUser : string;
sDomain : string;
begin
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
try
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
while integer(ContinueLoop)<>0 do
begin
p := TProcessInfo.Create;
p.FHandle := FProcessEntry32.th32ProcessID;
p.FName := FProcessEntry32.szExeFile;
p.FFileName := GetExePathByProcessID(p.Handle);
if GetUserAndDomainFromPID(p.Handle, sUser, sDomain)>0 then
begin
p.FUserName := sUser;
p.FDomain := sDomain;
end;

if p.FFileName = '' then
p.FFileName := FProcessEntry32.szExeFile;
p.FFileName := AnalyzeFileName(p.FFileName);

GetFileIcon(p.FileName, p.Icon);
FItems.Add(p);
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
finally
CloseHandle(FSnapshotHandle);
end;
end;

判断进程名后,枚举进程的窗口
function EnumThreadProc(AHandle:HWND; lParam:LPARAM): Boolean; stdcall;

procedure GetWindowInfo(
const AHandle : HWND;
const AList : TStrings
);
var
szText : array[0..MAXBYTE] of char;
begin
AList.Add(IntToStr(AHandle));//句柄

GetWindowText(AHandle, szText, MAXBYTE);
AList.Add(StrPas(szText));//标题

GetClassName(AHandle, szText, MAXBYTE);
AList.Add(StrPas(szText));//类名
end;

begin
GetWindowInfo(AHandle, TStrings(Pointer(lParam)));
Result:=True;
end;

procedure TProcessInfo.EnumWindows(const AList: TStrings);
var
snap : THandle;
ThreadStruct: TThreadEntry32;
begin
if FHandle = 0 then
Exit;
snap := CreateToolHelp32Snapshot(TH32CS_SNAPTHREAD, FHandle);
if snap <> 0 then
try
ThreadStruct.dwSize := sizeOf(TThreadEntry32);
if Thread32First(snap, ThreadStruct) then
repeat
if ThreadStruct.th32OwnerProcessID = FHandle then
EnumThreadWindows(ThreadStruct.th32ThreadID, @EnumThreadProc, Integer(AList));
until not Thread32Next(snap, ThreadStruct);
finally
CloseHandle(snap);
end;
end;

然后从中找出你感兴趣的窗口
 
谢谢 肥羊

看了,调试了,调试不到我需要的结果
有点头痛了
希望能贴份能直接显示我需求效果的代码
 
连分析调试一下都不愿意,就知道要源代码,我看你不适合做程序员
 
调试了,我没调试成功.
 
当然不会成功
我是从我的工程里直接复制的代码,你连改都不改怎么可能成功?
代码仅供参考,你应该读懂,然后修改也好,自己从写也好,才能达到你自己要求的功能
 
好好好,被鄙视了,这个问题困扰了我好几天了
我再好好看看你的代码
有不懂的再跟你请教哈!
 
没有找到更好的办法,说一下思路,
首先枚举系统所有窗口 EnumWindow.然后通过窗口handle得到运行实例GetWindowLong(GWL_HINSTANCE) 然后通过CreateToolhelp32Snatshot列举系统所有进程,知道进程的这样就能得到一个对应关系,就可以知道窗口标题了.
 
我感觉 轻舞肥羊 的代码并非是从自己的工程中剥离出来的.
用个折中的方法可以实现了.
感谢2位.分不多,奉上.
 
不好意思,刚才没有调试,
实际上边是应该使用 GetWindowThreadProcessIdsId 通过 handle取得进程ID来进行比较.
而不是通过 GetWindowLong(gwl_hinstance).
GetWindowThreadProcessIdsId 我调试通过了.sorry!
 
后退
顶部