首页
社区
课程
招聘
[求助]从 进程 PID 取窗口句柄(不能用 EnumWindows)
发表于: 2009-10-6 00:49 8915

[求助]从 进程 PID 取窗口句柄(不能用 EnumWindows)

2009-10-6 00:49
8915
有一个软件,因主窗口的类名和标题都是每次运行时都不同,所以,我只能从进程的 PID 取主窗口句柄:

  网上我看到的都是先用EnumWindows函数枚举所有的窗口句柄,再和GetWindowThreadProcessId,得到的pid再与进程的PID对比,不知有没有更快的方法?

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 450
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
枚举该进程的所有线程后,再调用 EnumThreadWindows 吧!
2009-10-6 01:22
0
雪    币: 189
活跃值: (4810)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
又好了点, 谢谢!!

不知还有更好的方法吗?
2009-10-6 02:08
0
雪    币: 189
活跃值: (4810)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
还有,

_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;

NtQuerySystemInformation(5, SYSTEM_PROCESSES_Info); 这个API 得到的进程创建时间, 好像不是时间格式的, 是“纳秒”吗?

  进程创建时间:=SYSTEM_PROCESSES_Info.CreateTime.QuadPart  div (除多少啊??  );

  请问如何转换成 时/分/秒 的格式

不想用 GetProcessTimes...
2009-10-6 18:12
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=kagayaki;696235]还有,
_SYSTEM_PROCESSES = record // Information Class 5
    NextEntryDelta: ULONG;
    ThreadCount: ULONG;
    Reserved1: array[0..5] of ULONG;
...[/QUOTE]
没区别,如果你会用GetProcessTime 就会用这个。
去看看 时间转换的API吧
好象叫 Filetimetosystemtime
2009-10-6 18:47
0
雪    币: 189
活跃值: (4810)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
........已解决, 好像是文件时间。

....包含了UTC时间信息的一个结构, 这个 UTC 指什么?

还有, 我在网上看到下面的几行代码,好像都不用时间的 API:

llTempTime  = pSystemProc->KernelTime.QuadPart + pSystemProc->UserTime.QuadPart;
                        llTempTime /= 10000;
                        printf("%3d:",llTempTime/(60*60*1000));
                        llTempTime %= 60*60*1000;
                        printf("%.2d:",llTempTime/(60*1000));
                        llTempTime %= 60*1000;
                        printf("%.2d.",llTempTime/1000);
                        llTempTime %= 1000;
                        printf("%.3d",llTempTime);

                        printf("\n");
2009-10-9 04:21
0
雪    币: 189
活跃值: (4810)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
手上没 VC++, 不过, 看计算时间的代码好像有问题:

#include <windows.h>
/* NOTE: W32API ddk/ntapi.h header has wrong definition of SYSTEM_PROCESSES. */
#include <ntos/types.h>

/* 0000 0000 0:00:00 0:00:00 0000 () */
static char* title = "PID PPID KTime UTime Hwnd NAME\n";
static char* title1 = " TID KTime UTime\n";

int main()
{
DWORD r, r1, i, tid = 0;
HANDLE pl;
HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE);
PSYSTEM_PROCESSES SystemProcesses = NULL;
PSYSTEM_PROCESSES CurrentProcess;
ULONG BufferSize, ReturnSize;
NTSTATUS Status;
char buf[256];
char buf1[256];

WriteFile(stdout, title, lstrlen(title), &r, NULL);
WriteFile(stdout, title1, lstrlen(title1), &r1, NULL);

/* Get process information. */
BufferSize = 0;
do
{
BufferSize += 0x10000;
SystemProcesses = HeapAlloc(GetProcessHeap(), 0, BufferSize);
Status = NtQuerySystemInformation(SystemProcessInformation,
SystemProcesses, BufferSize,
&ReturnSize);
if (Status == STATUS_INFO_LENGTH_MISMATCH)
HeapFree(GetProcessHeap(), 0, SystemProcesses);
} while (Status == STATUS_INFO_LENGTH_MISMATCH);

/* If querying system information failed, bail out. */
if (!NT_SUCCESS(Status))
return 1;

/* For every process print the information. */
CurrentProcess = SystemProcesses;
while (CurrentProcess->NextEntryDelta != 0)
{
int hour, hour1, thour, thour1;
int minute, minute1, tmin, tmin1;
int seconds, seconds1, tsec, tsec1;
int ti;
SYSTEMTIME systime;
FILETIME kt, ut;

kt.dwLowDateTime = CurrentProcess->KernelTime.LowPart;
kt.dwHighDateTime = CurrentProcess->KernelTime.HighPart;

FileTimeToSystemTime( &kt, &systime );
hour = systime.wHour;
minute = systime.wMinute;
seconds = systime.wSecond;

ut.dwLowDateTime = CurrentProcess->UserTime.LowPart;
ut.dwHighDateTime = CurrentProcess->UserTime.HighPart;

FileTimeToSystemTime( &ut, &systime );
hour1 = systime.wHour;
minute1 = systime.wMinute;
seconds1 = systime.wSecond;

wsprintf(buf,"%4d %4d %2d:%02d:%02d %2d:%02d:%02d %4d %S\n",
CurrentProcess->ProcessId,
CurrentProcess->InheritedFromProcessId,
hour, minute, seconds, hour1, minute1, seconds1 , 0,
CurrentProcess->ProcessName.Buffer);
WriteFile(stdout, buf, lstrlen(buf), &r, NULL);

for (ti = 0; ti < CurrentProcess->ThreadCount; ti++)
{
kt.dwLowDateTime =
CurrentProcess->Threads[ti].KernelTime.LowPart;
kt.dwHighDateTime =
CurrentProcess->Threads[ti].KernelTime.HighPart;

FileTimeToSystemTime( &kt, &systime );
thour = systime.wHour;
tmin = systime.wMinute;
tsec = systime.wSecond;

ut.dwLowDateTime = CurrentProcess->Threads[ti].UserTime.LowPart;
ut.dwHighDateTime =
CurrentProcess->Threads[ti].UserTime.HighPart;

FileTimeToSystemTime( &ut, &systime );
thour1 = systime.wHour;
tmin1 = systime.wMinute;
tsec1 = systime.wSecond;

wsprintf(buf1," %4d %2d:%02d:%02d %2d:%02d:%02d\n",
CurrentProcess->Threads[ti].ClientId.UniqueThread,
thour, tmin, tsec, thour1, tmin1, tsec1);
WriteFile(stdout, buf1, lstrlen(buf1), &r1, NULL);
}
CurrentProcess = (PSYSTEM_PROCESSES)((ULONG_PTR)CurrentProcess +
CurrentProcess->NextEntryDelta);
}

CloseHandle(pl);
}
2009-10-9 05:18
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
FileTimeToSystemTime 转后后的是格林标准时间 还要加上当前时区
2009-10-11 04:15
0
雪    币: 189
活跃值: (4810)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
谢谢!!!!!!!
2009-10-12 18:42
0
游客
登录 | 注册 方可回帖
返回
//