2015-02-16 2 views
0

Из приложения для настольных компьютеров я запускаю приложение для метро, ​​используя ActivateApplication, и я хотел бы отключить идентификатор процесса процесса в дескрипторе процесса, чтобы я мог использовать WaitForSingleObjectEx или GetExitCodeProcess. Я видел, что OpenProcess должен делать именно то, что я ищу, но он не работает. Возвращаемый дескриптор всегда равен нулю. Я предполагаю одну из двух возможностей:Получить дескриптор для приложения Metro

  1. Запущенное приложение - это приложение для метро, ​​а не настольное приложение, и поэтому мне не разрешено обращаться с его процессом.
  2. Права доступа, которые я запрашиваю в OpenProcess, не одобрены процессом приложения. Какое право доступа я могу использовать, чтобы убедиться, что это не так? Я ищу право доступа, которое любой может использовать. Что-то подобное существует? Если нет, есть ли способ контролировать права доступа из вызова ActivateApplication?
+0

Вам нужно списывать, это полезно только для отладчика. –

+0

Я не совсем понимаю, о чем вы говорите. Что я должен «списать»? – Scorpio

+0

Я считаю правильным. Все связанные с процессом методы требуют обработки процессов, но вам предлагаются только идентификаторы процессов. Должен быть способ превратить один в другой, а когда он не сработает, мы сможем узнать, почему и как его исправить. – Scorpio

ответ

0

Возможно, вы захотите попробовать это, перейдя через окна и сравнив идентификатор процесса, чтобы найти правильную ручку.

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

Смежные вопросы