2015-09-02 16 views
20

Aşağıdaki örnek, etkin pencereyle ilişkilendirilen işlemin adını güvenilir bir şekilde döndürdü, ancak yeni modern/evrensel uygulamalarla çalışmaz; Bir yardımcı işlem WWAHost.exe Windows 8 ve ApplicationFrameHost.exe Windows 10 yerine uygulamanın adı. Windows'un 10 ApplicationFrameHost.exe ileWindows'da etkin pencere için işlem adı 8/10

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); 

pencere kolları oluşturur ve GetWindowThreadProcessId() tarafından döndürülen Nelerin olduğunu süreçtir, evrensel app aktif sürecini almak için kullanılabilecek bir başka Win32 API olduğunu aktif?

da active_process kolu sadece yardımcı işlemi olup, aktif uygulamadaki bir süreç olduğu için, sırasıyla APPMODEL_ERROR_NO_APPLICATION ve APPMODEL_ERROR_NO_PACKAGE dönüş olarak başarı ile GetApplicationUserModelId() ve GetPackageFullName() kullanarak çalıştı. Pencerenin hwnd'i verilen Modern/Evrensel uygulamasının işlem adını almak için kullanılan diğer tüm API'lar veya evrensel uygulamanın işlem adını belirleme diğer etkin API'lardır.

Şimdiden teşekkürler!

+0

['QueryFullProcessImageName'] 'ı (https://msdn.microsoft.com/en-us/library/windows/desktop/ms684919%28v=vs.85%29.aspx) denediniz mi? – theB

+0

Evet ve hala ApplicationFrameHost.exe yolunu döndürür, çünkü process_handle döndürülen pencereyi oluşturan yardımcı işlemdir. –

cevap

16

Böyle bir şeyi tersine çevirmek istediğinizde Spy ++ yardımcı programını kullandığınızdan emin olun. Visual Studio ile birlikte, Common7 \ Tools \ spyxx_amd64.exe 64-bit sürümü gerekir. Arama> Pencereyi Bul'u kullanın ve bullseye, Hava Durumu gibi bir UWP uygulamasına sürükleyin.

Sen GetForegroundWindow(), sahip olduğu en az 3 çocuk pencereli bulacaksınız penceresi görürsünüz:

  • ApplicationFrameTitleBarWindow
  • ApplicationFrameInputSinkWindow
  • Windows.Core.UI.CoreWindow, UWP uygulamasının ve ilgilendiğiniz ana bilgisayarın penceresi. Sağ tıklayın ve Özellikler, İşlem sekmesini seçin, İşlem Kimliği'ni tıklayın. Bu sizi bilmek istediğiniz gerçek sahiplik sürecine götürür.

Bu nedenle, yalnızca sahip olduğunuz koddan ek bir adım atmanız yeterlidir, yalnızca alt pencereleri numaralandırmanız ve farklı bir sahiplik süreciyle bir tane aramanız gerekir. Bazı C kodu, çok fazla varsayım ve yeterli hata denetimi yapmadan olabildiğince evrensel olarak yapmaya çalışıyorum:

Hava programında
#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; 
} 

Çıktı:

C: \ Program Files \ WINDOWSAPPS \ Win10 Yıldönümü Güncelleme ApplicationFrameHost çocuk pencereden başlayarak Microsoft.BingWeather_4.5.168.0_x86__8wekyb3d8bbwe \ Microsoft.Msn.Weather.exe

+0

Geç bir gözlem - Pencereli modda çalışır, Win10 üzerinde tam ekran UWP uygulamaları ile çalışmaz (numaralandırma yolunda hem ebeveyn hem de çocuk için ApplicationFrameHost.exe dosyasını döndürür). – prabindh

10

Sürekli olarak (eğer masaüstünüzde farklı pencereleri seçerek kolayca test edebildiğinizi test edebilirsiniz), mevcut ön plan penceresi süreci ve varsa depolama işlemiyle ilgili bilgileri görüntüleyen küçük bir konsol uygulaması uygulaması.

Uygulamalar, birden çok işlemi kapsayabilen bir pencere hiyerarşisine sahip olabilir. Burada yaptığım, 'Windows.UI.Core.CoreWindow' sınıf adı olan ilk alt pencerede arama.

Bu uygulama UIAutomation API (ve ayrıca akıllı göstergeler, akıllı BSTR'ler ve #import yönergesi tarafından sağlanan akıllı VARYANT) kullanır. Standart Windows SDK ile aynı şeyi yapabileceğinizi sanıyorum, ancak UIAutomation'ın bu şekilde oldukça şık olduğunu düşünüyorum.

#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; 
} 
2

Süreç kimliğini karşılaştırarak, çalışan işlemlerin anlık görüntüsünü alıp adını çekip çıkarmıyor mu? Burada Tam referans:

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

Ama CreateToolhelp32Snapshot ile anlık düzeltmek(). Ya da WTSEnumerateProcesses() ve çevre API'sinden

Veya?

Win 8'de çalıştığından emin olun. 10'da kırılmış mı?

+0

İşlem kimliğini neyle karşılaştırıyorsunuz? Modern (Windows Mağazası stili) uygulamaların en üst düzey USER32 pencereleri yoktur, bu yüzden doğru HWND'nin GetWindowThreadProcessId() 'ye geçmesi önemsizdir. –

+0

Anlık görüntü bir hwnd gerektirmez. Sistemdeki tüm süreçlerin bir listesini almak için kullanılabilir. Ardından, işlem hakkında bildiklerinizi temel alarak o listeden bir girişi filtreleyebilirsiniz. Muhtemelen bu konuda _something_ hakkında bilgi sahibi olursunuz (ana işlem kimliği gibi). –

+0

@Ben Voigt, GetWindowThreadProcessId() hakkında biraz bilgi alacağım, çünkü bahsettiğiniz gibi, hwnd yok. –

-2

UWP uygulamanın ancak sonuç döndürmedi. Relogon'dan sonra sadece Tablet modunda çalıştı.

İlgili konular