如何通过窗口句柄获取窗口创建/打开日期?Edge IE模式场景
可以实现,以下是可行方案
核心思路
IE模式的Edge窗口实际由iexplore.exe进程承载,每个窗口对应独立的进程实例。我们可以通过窗口句柄关联到对应进程,获取进程的创建时间来判断窗口的打开先后。
具体步骤与代码实现
- 通过
GetWindowThreadProcessId从窗口句柄获取进程ID - 用
OpenProcess打开进程并获取进程句柄 - 调用
GetProcessTimes获取进程的创建时间 - 对比两个进程的创建时间,确定较晚打开的窗口
以下是可运行的C++代码示例:
#include <windows.h> #include <iostream> // 获取进程创建时间(返回FILETIME结构) bool GetProcessCreationTime(DWORD processId, FILETIME& creationTime) { HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processId); if (hProcess == NULL) { return false; } FILETIME exitTime, kernelTime, userTime; bool success = GetProcessTimes(hProcess, &creationTime, &exitTime, &kernelTime, &userTime); CloseHandle(hProcess); return success; } // 比较两个FILETIME的先后,返回true表示time1晚于time2 bool IsTimeLater(const FILETIME& time1, const FILETIME& time2) { ULARGE_INTEGER uli1, uli2; uli1.LowPart = time1.dwLowDateTime; uli1.HighPart = time1.dwHighDateTime; uli2.LowPart = time2.dwLowDateTime; uli2.HighPart = time2.dwHighDateTime; return uli1.QuadPart > uli2.QuadPart; } int main() { HWND hWnd1 = /* 替换为你的第一个窗口句柄 */; HWND hWnd2 = /* 替换为你的第二个窗口句柄 */; DWORD pid1, pid2; GetWindowThreadProcessId(hWnd1, &pid1); GetWindowThreadProcessId(hWnd2, &pid2); FILETIME creationTime1, creationTime2; if (!GetProcessCreationTime(pid1, creationTime1) || !GetProcessCreationTime(pid2, creationTime2)) { std::cerr << "获取进程创建时间失败" << std::endl; return 1; } if (IsTimeLater(creationTime1, creationTime2)) { std::cout << "窗口1是较晚打开的" << std::endl; } else { std::cout << "窗口2是较晚打开的" << std::endl; } return 0; }
注意事项
- 确保程序有足够权限:
OpenProcess需要PROCESS_QUERY_INFORMATION权限,若权限不足会返回NULL,可尝试以管理员身份运行程序 - 若极少数情况下多个IE模式窗口共享同一进程,可改用线程创建时间:通过
GetWindowThreadProcessId获取线程ID,调用GetThreadTimes获取线程创建时间对比即可
内容的提问来源于stack exchange,提问作者Cagin Uludamar
相关产品推荐
相关产品推荐

