Autor Beitrag
Kasko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 126
Erhaltene Danke: 1

Win 10
C# C++ (VS 2017/19), (Java, PHP)
BeitragVerfasst: Mi 27.01.21 15:02 
Ich muss das Fenster einer bestimmten UWP-Anwendung auslesen, um es zu "zeigen" und zu verschieben. Folgendes habe ich derzeit. Es funktioniert für alle UWP-Apps, die ich habe, aber nur, wenn sich das Fenster nicht im Vollbildmodus befindet:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
public static IntPtr GetHwndsForUWPApp(string aumid) {
    NativeHWNDExtractor.aumid = aumid;
    ENUMWINDOWPARAM ep = new ENUMWINDOWPARAM();
    IntPtr eplParam = Marshal.AllocHGlobal(Marshal.SizeOf(ep));
    Marshal.StructureToPtr(ep, eplParam, false);

    NativeMethods.EnumWindows(new NativeMethods.WNDENUMPROCR(CheckWindowUWP), ref eplParam);

    object obj = Marshal.PtrToStructure(eplParam, typeof(ENUMWINDOWPARAM));
    ENUMWINDOWPARAM newep = (ENUMWINDOWPARAM)obj;
    Marshal.FreeHGlobal(eplParam);

    return new IntPtr(newep.ihWnd);
}

private static bool CheckWindowUWP(IntPtr hwnd, ref IntPtr lParam) {
    ENUMWINDOWPARAM ep = (ENUMWINDOWPARAM)Marshal.PtrToStructure(lParam, typeof(ENUMWINDOWPARAM));
    
    StringBuilder sbClassName = new StringBuilder(256);
    NativeMethods.GetClassName(hwnd, sbClassName, sbClassName.Capacity);
    string className = sbClassName.ToString();

    if (className.Equals("ApplicationFrameWindow")) {
        // get real hWnd
        NativeInterfaces.IPropertyStore pPropertyStore;
        Guid guid = new Guid("{886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99}");
        NativeEnums.HRESULT hr = NativeMethods.SHGetPropertyStoreForWindow(hwnd, ref guid, out pPropertyStore);
        if (hr == NativeEnums.HRESULT.S_OK) {
            NativeStructs.PROPVARIANT propVar = new NativeStructs.PROPVARIANT();
            hr = pPropertyStore.GetValue(ref NativeDefinitions.PKEY_AppUserModel_ID, out propVar);
            string sAUMID = Marshal.PtrToStringUni(propVar.pwszVal);
            if (sAUMID != null && sAUMID.Equals(aumid)) {
                ep.ihWnd = hwnd.ToInt32();
                Marshal.StructureToPtr(ep, lParam, false);
                Marshal.ReleaseComObject(pPropertyStore);
                return false;
            }
            Marshal.ReleaseComObject(pPropertyStore);
        }
    }

    return true;
}


Wenn sich das Fenster (z. B. Microsoft Movies & TV) im Vollbildmodus Befindet oder im Vollbildmodus is und dann minimiert wird, kann ich es nicht auslesen. GetForegroundWindow liest es zumindest aus, jedoch muss es dafür zusehen und fokusiert sein. Habe ich das Fenster jedoch auf einem anderem Bildscirm und fokusiere ich grad ein anderes Fenster funktioniert es logischerweise nicht. Gleiches gilt für Fullscreen + minimiert. Es scheint als werden fullscreen Fenster separat behandelt, z.B. für Fullscreen-Optimization

Gibt es also eine Möglichkeit, alle Fenster im Vollbildmodus auszulesen, um sie danach zu filtern?