要反向工程类似这样的东西,请务必使用Spy++实用程序。它是Visual Studio附带的,您需要64位版本的Common7\Tools\spyxx_amd64.exe。使用“搜索”>“查找窗口”,并将准星拖到UWP应用程序(如天气)上。
您将看到使用GetForegroundWindow()找到的窗口,它至少有3个子窗口:
- ApplicationFrameTitleBarWindow
- ApplicationFrameInputSinkWindow
- Windows.Core.UI.CoreWindow,这是UWP应用程序的主机窗口,也是您感兴趣的窗口。右键单击它并选择“属性”,在“进程”选项卡中单击进程ID。这将带您进入您想要了解的真正所有者进程。
因此,您只需从已有代码中进行额外的步骤,只需枚举子窗口并查找具有不同所有者进程的窗口即可。以下是一些C代码,试图使其尽可能通用而不会做出太多假设并且错误检查不足:
#include <stdio.h>
#include <Windows.h>
typedef struct {
DWORD ownerpid;
DWORD childpid;
} windowinfo;
BOOL CALLBACK EnumChildWindowsCallback(HWND hWnd, LPARAM lp) {
windowinfo* info = (windowinfo*)lp;
DWORD pid = 0;
GetWindowThreadProcessId(hWnd, &pid);
if (pid != info->ownerpid) info->childpid = pid;
return TRUE;
}
int main()
{
Sleep(2000);
HWND active_window = GetForegroundWindow();
windowinfo info = { 0 };
GetWindowThreadProcessId(active_window, &info.ownerpid);
info.childpid = info.ownerpid;
EnumChildWindows(active_window, EnumChildWindowsCallback, (LPARAM)&info);
HANDLE active_process = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, info.childpid);
WCHAR image_name[MAX_PATH] = { 0 };
DWORD bufsize = MAX_PATH;
QueryFullProcessImageName(active_process, 0, image_name, &bufsize);
wprintf(L"%s\n", image_name);
CloseHandle(active_process);
return 0;
}
天气程序的输出结果:
C:\Program Files\WindowsApps\Microsoft.BingWeather_4.5.168.0_x86__8wekyb3d8bbwe\
Microsoft.Msn.Weather.exe
QueryFullProcessImageName
吗? - theB