首页
社区
课程
招聘
[求助]通过PID 或 TID得到其主窗口句柄的问题!!!
发表于: 2009-12-14 12:33 6136

[求助]通过PID 或 TID得到其主窗口句柄的问题!!!

2009-12-14 12:33
6136
目前,我已得到任一进程的 PID 和 TID 和下面的信息 (我用 NtQuerySystemInformation )

_SYSTEM_PROCESSES = record // Information Class 5
    NextEntryDelta: ULONG;
    ThreadCount: ULONG;
    Reserved1: array[0..5] of ULONG;
    CreateTime: LARGE_INTEGER;   
   UserTime: LARGE_INTEGER;
    KernelTime: LARGE_INTEGER;
    ProcessName: UNICODE_STRING;
    BasePriority: KPRIORITY;
    ProcessId: ULONG;
    InheritedFromProcessId: ULONG;
    HandleCount: ULONG;
    // next two were Reserved2: array [0..1] of ULONG; thanks to Nico Bendlin
    SessionId: ULONG;
    Reserved2: ULONG;
    VmCounters: VM_COUNTERS;
    PrivatePageCount: ULONG;
    IoCounters: IO_COUNTERSEX; // Windows 2000 only
    Threads: array[0..0] of SYSTEM_THREADS;
  end;

  现在想找出相关的主窗口,发现, 无论是用“EnumWindows”或“EnumThreadWindows ”都很难找出相关的主窗口:

如:取当前窗口的主窗口或取当前窗口的窗口风格来识别都不行(因为有很多的“tooltips_class32”和“IME”和“MSCTFIME UI”,用“IsWindowEnabled”、GetParent、GetWindow(WinHWND, GW_OWNER)、IsWindowEnabled、就是再比较 PID、TID 也没用).....

  不知大家有无好的方法或好的“比较出主窗口的方法”?

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
EnumWindow+GetWindowThreadId
2009-12-14 13:56
0
雪    币: 189
活跃值: (4810)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
谢谢, 不知你有没有试过,我以前试过了,好像不能起到识别的作用,同时比较“PID”和“TID”也没多大的识别作用, 因为,好像大部分程序都会自动创建有一个“输入法窗口(类名是:MSCTFIME UI 和 M)”的。

  我想, 如果可以通过“PID”或“TID”传个自定义标记给当前窗口,这样就可以通过“EnumWindow”或“EnumThreadWindow”来识别做过标记的“主窗口”了,不过,好像有没有相关的 API。

下面是我现在的一种方法,很不可靠:

if ThreadCount = 1 then  // 单线程的程序,调用“EnumThreadWindows” 来得到主窗口句柄 //_SYSTEM_PROCESSES
  EnumThreadWindows(MyGetThreadID(Threads[0].ClientId), @EnumThreadWndProc, Integer(@HWND_A))
else
begin   
//  多线程的的程序,想不出有什么好的方法来识别主窗口句柄,等高手出手了      
end;

// 这个是我调用来识别“单线程的程序”的主窗口,可靠。
function EnumThreadWndProc(WinHWND : HWND; var ResultWinHWND : HWND): Bool; stdcall;
begin
Result:=False;
  ResultWinHWND :=WinHWND;
end;

//这是我以前用调用的“EnumWindow”和“EnumThreadWindow”的识别过程,想不出有什么好的方法来识别主窗口句柄,所以未调用。

function EnumWindowsProc(Wnd: DWORD; var EI: TEnumInfo): Bool; stdcall;   EnumWindow var
  PID : DWORD;
begin
  GetWindowThreadProcessID(Wnd, @PID);
  Result := (PID <> EI.ProcessID) or (not IsWindowVisible(WND)) or (not IsWindowEnabled(WND));
  if not result then EI.WinHandle := WND;
end;

function EnumThreadWndProcEX(WinHWND : HWND; var ResultWinHWND : HWND): Bool; stdcall; // 多线程的程序,很不可靠
var
  PClassName : array[0..12] of Char;
  ParentHWND, PID : HWND;
   AA : String;
begin
Result:=True;
ResultWinHWND:=Windows.GetParent(WinHWND);  //
   if ResultWinHWND = 0 then    // 没有父窗口,则它就是主窗口
   begin
   ResultWinHWND:= WinHWND;
   Result:=False;
   end;
end;
2009-12-14 14:15
0
雪    币: 189
活跃值: (4810)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
想起就头痛,等深入了解“窗口”关系的高手....
查句柄表也没用吧?
2009-12-14 17:04
0
雪    币: 189
活跃值: (4810)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
看看, 比喻:
单单是这个"Error Show"的进程,想找出这个进程的窗体句柄, 但有很多的窗体 PID 和 TID 是相同的(类名是:MSCTFIME UI 和 M)



其实我要做的只是显示当前系统的所有进程的主窗口标题、类名、等等。



2009-12-15 11:36
0
游客
登录 | 注册 方可回帖
返回
//