ventana tomar solo pantalla entre diferencias cuadro copiar como comandos capturar captura activa c++ windows winapi accessibility win-universal-app

c++ - tomar - Nombre del proceso para la ventana activa en Windows 8/10



diferencias de windows 8 y 10 (4)

¿La toma de instantáneas de los procesos en ejecución y la eliminación del nombre al comparar el ID de proceso no funciona? Referencia completa aquí:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms686837(v=vs.85).aspx

Pero arreglas la instantánea con CreateToolhelp32Snapshot ().

¿O desde WTSEnumerateProcesses () y la API circundante?

Bastante seguro de que funcionó en Win 8. ¿Está roto en 10?

El siguiente ejemplo ha devuelto de manera confiable el nombre del proceso que está asociado con la ventana activa, pero no funciona con las aplicaciones modernas / universales más nuevas porque devuelve el nombre de un proceso auxiliar WWAHost.exe en Windows 8 y ApplicationFrameHost.exe en Windows 10 en lugar del nombre de la aplicación.

HWND active_window = GetForegroundWindow(); GetWindowThreadProcessId(active_window, &active_process_id); HANDLE active_process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, active_process_id); GetProcessImageFileName(active_process, image_name, 512);

Con Windows 10, ApplicationFrameHost.exe es el proceso que crea los manejadores de ventana y es lo que GetWindowThreadProcessId devuelve (). ¿Hay otra API de Win32 que pueda usarse para obtener el proceso activo de la aplicación universal que está activa?

También probé el uso de GetApplicationUserModelId () y GetPackageFullName () sin éxito ya que devuelven APPMODEL_ERROR_NO_APPLICATION y APPMODEL_ERROR_NO_PACKAGE respectivamente porque el identificador active_process es solo el proceso auxiliar y no el proceso de la aplicación activa.

Cualquier otra API que se use para obtener el nombre de proceso de una aplicación Moderna / Universal dado el hwnd de la ventana, o de otra manera averiguar el nombre de proceso de la aplicación universal está activa.

¡Gracias por adelantado!


A partir de Win10 Anniversary Update, la ventana secundaria de ApplicationFrameHost devuelve todo menos la aplicación UWP. Funcionó solo en el modo Tableta después de volver a iniciar sesión.


Aquí hay una pequeña aplicación de aplicación de consola que continuamente (para que pueda probarla seleccionando fácilmente diferentes ventanas en su escritorio) muestra información sobre el proceso actual de la ventana de primer plano y el proceso de almacenamiento, si corresponde.

Las aplicaciones pueden tener una jerarquía de ventanas que puede abarcar múltiples procesos. Lo que hago aquí es buscar la primera ventana secundaria que tiene el nombre de clase ''Windows.UI.Core.CoreWindow''.

Esta aplicación utiliza la API de UIAutomation (y también punteros inteligentes, BSTR inteligentes y VARIANT inteligentes proporcionados por la directiva #import). Supongo que puede hacer lo mismo con el SDK estándar de Windows, pero me parece que la UIAutomation utilizada de esta manera es bastante elegante.

#include "stdafx.h" #import "UIAutomationCore.dll" using namespace UIAutomationClient; int main() { // initialize COM, needed for UIA CoInitialize(NULL); // initialize main UIA class IUIAutomationPtr pUIA(__uuidof(CUIAutomation)); do { // get the Automation element for the foreground window IUIAutomationElementPtr foregroundWindow = pUIA->ElementFromHandle(GetForegroundWindow()); wprintf(L"pid:%i/n", foregroundWindow->CurrentProcessId); // prepare a [class name = ''Windows.UI.Core.CoreWindow''] condition _variant_t prop = L"Windows.UI.Core.CoreWindow"; IUIAutomationConditionPtr condition = pUIA->CreatePropertyCondition(UIA_ClassNamePropertyId, prop); // get the first element (window hopefully) that satisfies this condition IUIAutomationElementPtr coreWindow = foregroundWindow->FindFirst(TreeScope::TreeScope_Children, condition); if (coreWindow) { // get the process id property for that window wprintf(L"store pid:%i/n", coreWindow->CurrentProcessId); } Sleep(1000); } while (TRUE); cleanup: CoUninitialize(); return 0; }


Asegúrate de usar la utilidad Spy ++ cuando quieras realizar una ingeniería inversa de algo como esto. Incluido con Visual Studio, necesita la versión de 64 bits en Common7 / Tools / spyxx_amd64.exe. Use Buscar> Buscar ventana y arrastre la diana a una aplicación de UWP, como Weather.

Verá la ventana que encontrará con GetForegroundWindow (), tiene al menos 3 ventanas secundarias:

  • AplicaciónFrameTitleBarWindow
  • ApplicationFrameInputSinkWindow
  • Windows.Core.UI.CoreWindow, esa es la ventana del host para la aplicación UWP y la que le interesa. Haga clic con el botón derecho en ella y seleccione Propiedades, pestaña Procesar, haga clic en la ID del proceso. Eso te lleva al proceso de propietario real que quieres saber.

Entonces, solo necesita hacer un paso adicional del código que ya tiene, solo tiene que enumerar las ventanas secundarias y buscar una con un proceso de propietario diferente. Algún código C, que trata de hacerlo lo más universal posible sin hacer demasiadas suposiciones y sin un control de errores insuficiente:

#include <stdio.h> #include <Windows.h> typedef struct { DWORD ownerpid; DWORD childpid; } windowinfo; BOOL CALLBACK EnumChildWindowsCallback(HWND hWnd, LPARAM lp) { windowinfo* info = (windowinfo*)lp; DWORD pid = 0; GetWindowThreadProcessId(hWnd, &pid); if (pid != info->ownerpid) info->childpid = pid; return TRUE; } int main() { Sleep(2000); HWND active_window = GetForegroundWindow(); windowinfo info = { 0 }; GetWindowThreadProcessId(active_window, &info.ownerpid); info.childpid = info.ownerpid; EnumChildWindows(active_window, EnumChildWindowsCallback, (LPARAM)&info); HANDLE active_process = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, info.childpid); WCHAR image_name[MAX_PATH] = { 0 }; DWORD bufsize = MAX_PATH; QueryFullProcessImageName(active_process, 0, image_name, &bufsize); wprintf(L"%s/n", image_name); CloseHandle(active_process); return 0; }

Salida en el programa de clima:

C: / Archivos de programa / WindowsApps / Microsoft.BingWeather_4.5.168.0_x86__8wekyb3d8bbwe / Microsoft.Msn.Weather.exe