获取处理Metro应用程序的句柄

时间:2015-02-16 14:11:00

标签: c++ process windows-store-apps microsoft-metro

在桌面应用中,我使用ActivateApplication启动了一个Metro应用,我想将out参数进程ID转换为进程句柄,以便我可以使用WaitForSingleObjectExGetExitCodeProcess。我看到OpenProcess应该完全符合我的要求,但它不起作用。返回的句柄始终为null。我猜两种可能性之一:

  1. 启动的应用程序是一个城域应用程序而不是桌面应用程序,这就是为什么我不被允许处理其进程。
  2. 我在OpenProcess中请求的访问权限未经应用程序流程批准。我可以使用哪种访问权限来确保它不是这个?我正在寻找任何人都可以使用的访问权限。有这样的事吗?如果没有,有没有办法可以通过ActivateApplication调用来控制访问权限?

1 个答案:

答案 0 :(得分:0)

您可能想尝试这样做,循环浏览窗口并比较进程ID以找到正确的句柄。

HWND GetProcessWindow( DWORD processId )
{
// Now need to run a loop to get the correct window for process.
bool bFound = false;
HWND prevWindow = 0;

while ( ! bFound ) {
    HWND desktopWindow = GetDesktopWindow();
    if ( ! desktopWindow )
        break;

    HWND nextWindow = FindWindowEx( desktopWindow, prevWindow, NULL, NULL );
    if ( ! nextWindow )
        break;

    // Check whether window belongs to the correct process.
    DWORD procId = -1;
    GetWindowThreadProcessId( nextWindow, &procId );

    if ( procId == processId ) {
        // Add additional checks. In my case, I had to bring the window to front so these checks were necessary.
        wchar_t windowText[ 1024 ];
        if ( IsWindowVisible( nextWindow ) && ! IsIconic( nextWindow ) && GetWindowText( nextWindow, ( LPWSTR )windowText, sizeof( windowText ) / sizeof( wchar_t ) )
            && ! GetParent( nextWindow ) )
            return nextWindow;
    }

    prevWindow = nextWindow;
}

return 0;

}

参考: https://social.msdn.microsoft.com/forums/windowsdesktop/en-us/7e25e104-36cb-41ac-8f36-0e4c6b6146a3/finding-hwnd-of-metro-app-using-win32-api