如何从hWnd for Windows 10 Store应用程序(例如Edge)获取“应用程序名称”【JAVA教程】

!
也想出现在这里? 联系我们
信息

如何从hWnd for Windows 10 Store应用程序(例如Edge)获取“应用程序名称”,第1张

概述如何从hWnd for Windows 10 Store应用程序(例如Edge)获取“应用程序名称

我正在尝试为windows 10应用程序获取可理解的“进程名称”。 目前,他们都使用ApplicationFrameHost ,所以我认为我可以使用ModelID或Packagename ,但似乎windows 10商店应用程序(我尝试使用Mail , Store和Edge )将无法使用包查询API

使用kernel32.dll , GetApplicationusermodelID返回APPMODEL_ERROR_NO_APPliCATION , GetPackageID返回APPMODEL_ERROR_NO_PACKAGE 。

我如何获得windows 10商店应用程序的标识符,以便我可以唯一标识Edge ,还有其他任何windows 10商店应用程序?

更新

我从hWnd (窗口句柄)获取进程ID,所以我认为我的问题实际上是如何从窗口句柄中获取“真实”进程ID。 从那里,使用这些方法可能会奏效。

时间术语

linux可执行文件是否与OS X“兼容”?

这个应用程序已经请求运行时以不寻常的方式终止它。

注入DLL时,Explorer.exe在启动时死锁

列出C ++目录中的所有文本文件

C ++访问主外部的命令行参数?

Ubuntu 11.10上的C和C ++编程

ENfile,当使用内核iterate_dir时,文件表溢出

什么创build了三个closures/最小化/最大化窗口顶部的图标? (C ++)

qDeBUG()在windows上不支持unicodestring

GetPackageFullname / Familyname / ID(hprocess,…)等返回APPMODEL_ERROR_NO_PACKAGE,如果进程没有包标识。 同上GetApplicationusermodelID(hprocess …)返回APPMODEL_ERROR_NO_APPliCATION,因为同样的过程没有应用程序标识。

听起来就像你有一个代表应用程序工作的HWND,但不是应用程序。 这是相当普遍的 – Runtimebroker和其他进程作为“桌面应用程序”(即无W / O包或应用程序标识的进程)运行,作为中间商为他们自己无法完成的应用程序处理事务。

到你原来的问题,“我从hWnd(窗口句柄)获取进程ID,所以我认为我的问题实际上是如何从窗口句柄”获得真实“的进程ID”这是一个根本上有缺陷的方法。 你有一个HWND的PID,但是如果这个过程是一个经纪人,它可以代表多个应用程序工作 – 代理程序没有身份; 它知道每个请求/ WinRT API调用/等谁是调用者,并将其工作的范围,以该身份。 在流程层面你无法发现。

您可以使用GetPackageID() ,然后使用PackageFullnameFromID() 。

例如:

HANDLE hProcess = OpenProcess( PROCESS_query_liMITED_informatION,false,pe32.th32ProcessID); UINT32 bufferLength = 0; LONG result = GetPackageID(hProcess,&bufferLength,nullptr); BYTE* buffer = (PBYTE) malloc(bufferLength); result = GetPackageID(hProcess,buffer); PACKAGE_ID* packageID = reinterpret_cast<PACKAGE_ID*>(buffer); wprintf(L\”name: %sn\”,packageID->name);

下面是在windows 8/10中获取实际进程名称, 活动窗口进程名称的类似

使用Spy ++实用程序,确认windows.Core.UI.CoreWindow是天气的子窗口,并且是我们感兴趣的窗口。(Win10 10563验证)

所以首先有一个叫做AppusermodelID的东西,它是任务栏用来分组窗口的窗口的ID。 因为所有的WinRT窗口都来自同一个进程,但是没有分组,这意味着每个应用都有自己的usermodelID。

要从HWND获得usermodelID,您可以使用此答案中的方法。

#include \”Propsys.h\” #include <propkey.h> #pragma comment (lib,\”Shell32.lib\”) //……… IPropertyStore* propStore; auto weatherWnd = FinDWindow(L\”ApplicationFrameWindow\”,L\”Weather\”); SHGetPropertyStoreForWindow(weatherWnd,IID_IPropertyStore,(voID**)&propStore); PROPVARIANT prop; propStore->GetValue(PKEY_Appusermodel_ID,&prop);

并且prop将包含值LPWSTR = 0x00838f68 L\”Microsoft.BingWeather_8wekyb3d8bbwe!App\” 。 这是完整的入口点名称格式<FullPackageFamilyname>!<EntryPoint> 。 启动应用程序的入口点通常称为App 。 入口点在应用程序清单中定义。

另外有趣的事情 – 应用程序拥有的子窗口不被破坏,而是从应用程序框架主机移到桌面窗口。 我不知道为什么会发生,但是你必须小心,因为FinDWindow(nullptr,L\”Weather\”)返回了子应用程序窗口而不是appframehost窗口。

PS AppusermodelID只是一个字符串,它的格式没有记录,所以这个方法并不是最可靠的。

PPS另外我注意到你想要有图标和名字,你可以使用PackageManager来做这件事,它需要你引用winmd程序集,怎么做到这里看这里

总结

以上是内存溢出为你收集整理的如何从hWnd for Windows 10 Store应用程序(例如Edge)获取“应用程序名称”全部内容,希望文章能够帮你解决如何从hWnd for Windows 10 Store应用程序(例如Edge)获取“应用程序名称”所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

© 版权声明
THE END
喜欢就支持一下吧
点赞88 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容