Win10判断窗口是否是系统计算器

Win10判断窗口是否是系统计算器

注:此文只讨论如何判断是否是win10系统默认的UWP计算器

假设已经获取到窗口的句柄,如通过GetForegroundWindow(),常见有两种判断方式,通过GetWindowThreadProcessId读取进程相关信息,或者获取窗口标题。对于UWP程序,第一种方式读取到的进程id是Application Frame Host,需要进一步去处理,第二种方式涉及到多语言的话,更难处理。
(这里不讨论为什么是Application Frame Host这一进程id,我也没有研究过UWP的这种机制)

实际上,在UWP程序中,使用了一个叫Application User Model ID (AppUserModelID) 的东西来唯一标识一个应用程序。在win7系统之后,大量使用了该值来实现一些系统功能,比如任务栏的跳转列表、文件关联等。如果一个程序没有指定该值,则由系统分配一个并管,这个属性可以在窗口、进程、快捷键(不知道是否还有其他)中存在。所以只要能够从窗口句柄中读取该属性就可以了。

获取AppUserModelID可以使用用接口 SHGetPropertyStoreForWindow

IPropertyStore *proterty_store;
HRESULT res = SHGetPropertyStoreForWindow(hwnd, IID_PPV_ARGS(&proterty_store));
if (SUCCEEDED(res) && proterty_store)
{
    PROPVARIANT pv;
    proterty_store->GetValue(PKEY_AppUserModel_ID, &pv);
    if (pv.vt == VT_LPWSTR)
    {
        //pv.pwszVal即是AppUserModelID值
    }
    proterty_store->Release();
}

其中 PKEY_AppUserModel_ID 是 PROPERTYKEY 类型的结构体,在头文件 propkey.h 中预定义了一些值。

目前系统默认的UWP计算器的 AppUserModelID 值是 “Microsoft.WindowsCalculator_8wekyb3d8bbwe!App” ,至于该值会不会在未来有更改,还真不好说,不过也是我目前找到的比较方便的办法。

猜你喜欢

转载自blog.csdn.net/eiilpux17/article/details/82353918
今日推荐