我正在尝试为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)获取“应用程序名称”所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)