Esempio n. 1
0
        public static WindowInformation GetUWPWindowInformation(string PackageFamilyName, uint?WithPID = null)
        {
            WindowInformation Info = null;

            User32.EnumWindowsProc Callback = new User32.EnumWindowsProc((HWND hWnd, IntPtr lParam) =>
            {
                StringBuilder SbClassName = new StringBuilder(260);

                if (User32.GetClassName(hWnd, SbClassName, SbClassName.Capacity) > 0)
                {
                    string ClassName = SbClassName.ToString();

                    // Minimized : "Windows.UI.Core.CoreWindow" top window
                    // Normal : "Windows.UI.Core.CoreWindow" child of "ApplicationFrameWindow"
                    if (ClassName == "ApplicationFrameWindow")
                    {
                        if (Shell32.SHGetPropertyStoreForWindow(hWnd, new Guid("{886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99}"), out object PropertyStore).Succeeded)
                        {
                            Ole32.PROPVARIANT Prop = new Ole32.PROPVARIANT();

                            ((PropSys.IPropertyStore)PropertyStore).GetValue(Ole32.PROPERTYKEY.System.AppUserModel.ID, Prop);

                            string AUMID = Prop.pwszVal;

                            if (!string.IsNullOrEmpty(AUMID) && AUMID.Contains(PackageFamilyName))
                            {
                                WindowState State = WindowState.Normal;

                                if (User32.GetWindowRect(hWnd, out RECT CurrentRect))
                                {
                                    IntPtr RectWorkAreaPtr = Marshal.AllocHGlobal(Marshal.SizeOf <RECT>());

                                    try
                                    {
                                        if (User32.SystemParametersInfo(User32.SPI.SPI_GETWORKAREA, 0, RectWorkAreaPtr, User32.SPIF.None))
                                        {
                                            RECT WorkAreaRect = Marshal.PtrToStructure <RECT>(RectWorkAreaPtr);

                                            //If Window rect is out of SPI_GETWORKAREA, it means it's maximized;
                                            if (CurrentRect.left < WorkAreaRect.left && CurrentRect.top < WorkAreaRect.top && CurrentRect.right > WorkAreaRect.right && CurrentRect.bottom > WorkAreaRect.bottom)
                                            {
                                                State = WindowState.Maximized;
                                            }
                                        }
                                    }
                                    finally
                                    {
                                        Marshal.FreeHGlobal(RectWorkAreaPtr);
                                    }
                                }

                                HWND hWndFind = User32.FindWindowEx(hWnd, IntPtr.Zero, "Windows.UI.Core.CoreWindow", null);

                                if (!hWndFind.IsNull)
                                {
                                    if (User32.GetWindowThreadProcessId(hWndFind, out uint PID) > 0)
                                    {
                                        if (WithPID != null && WithPID.Value != PID)
                                        {
                                            return(true);
                                        }

                                        using (Kernel32.SafeHPROCESS ProcessHandle = Kernel32.OpenProcess(new ACCESS_MASK(0x1000), false, PID))
                                        {
                                            if (!ProcessHandle.IsInvalid && !ProcessHandle.IsNull)
                                            {
                                                uint Size = 260;
                                                StringBuilder PackageFamilyNameBuilder = new StringBuilder((int)Size);

                                                if (Kernel32.GetPackageFamilyName(ProcessHandle, ref Size, PackageFamilyNameBuilder).Succeeded)
                                                {
                                                    if (PackageFamilyNameBuilder.ToString() == PackageFamilyName && User32.IsWindowVisible(hWnd))
                                                    {
                                                        Size = 260;
                                                        StringBuilder ProcessImageName = new StringBuilder((int)Size);

                                                        if (Kernel32.QueryFullProcessImageName(ProcessHandle, 0, ProcessImageName, ref Size))
                                                        {
                                                            Info = new WindowInformation(ProcessImageName.ToString(), PID, State, hWnd);
                                                        }
                                                        else
                                                        {
                                                            Info = new WindowInformation(string.Empty, PID, State, hWnd);
                                                        }

                                                        return(false);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                return(true);
            });

            User32.EnumWindows(Callback, IntPtr.Zero);

            return(Info);
        }
Esempio n. 2
0
        private static void PropVariant()
        {
            Ole32.PROPVARIANT pv;
            // SafeArray
            pv = new Ole32.PROPVARIANT(new object[] { 1, DateTime.Now, Guid.NewGuid() });
            AddTestResult(null, pv.ToString(), pv.parray);
            pv = new Ole32.PROPVARIANT(new object[] { 1, 2, 3 });
            AddTestResult(null, pv.ToString(), pv.parray);

            // Struct
            var ms = new SafeCoTaskMemString("TESTFMT");

            pv = new Ole32.PROPVARIANT(new[] { new Ole32.CLIPDATA(ms.DangerousGetHandle(), ms.Length), new Ole32.CLIPDATA(0xCFF) });
            AddTestResult(null, pv.ToString(), pv.caclipdata.ToArray()[0].ulClipFmt);

            // Dates
            pv = new Ole32.PROPVARIANT((DateTime?)null);
            AddTestResult(null, pv.ToString(), pv.pdate);
            pv = new Ole32.PROPVARIANT(DateTime.Now.AddYears(-500));
            AddTestResult(null, pv.ToString(), pv.Value);
            pv = new Ole32.PROPVARIANT(DateTime.Now);
            AddTestResult(null, pv.ToString(), new[] { pv.Value, pv.date, pv.pdate });
            pv = new Ole32.PROPVARIANT(DateTime.Now, VarEnum.VT_FILETIME);
            AddTestResult(null, pv.ToString(), pv.filetime.ToString(null));
            pv = new Ole32.PROPVARIANT(new[] { DateTime.Now, DateTime.Today, DateTime.MaxValue });
            AddTestResult(null, pv.ToString(), pv.cadate);

            // FILETIME
            var ft = DateTime.Now.ToFileTimeStruct();

            pv = new Ole32.PROPVARIANT(ft);
            AddTestResult(null, pv.ToString(), pv.filetime.ToString(null));
            pv = new Ole32.PROPVARIANT(new[] { ft, ft });
            AddTestResult(null, pv.ToString(), pv.cafiletime?.Select(f => f.ToString("G")));
            pv = new Ole32.PROPVARIANT(new[] { DateTime.Now, DateTime.Today, DateTime.MaxValue }, VarEnum.VT_FILETIME);
            AddTestResult(null, pv.ToString(), pv.cafiletime?.Select(f => f.ToString("G")));

            // Bool
            pv = new Ole32.PROPVARIANT(true);
            AddTestResult(null, pv.ToString(), new[] { pv.pboolVal, pv.boolVal });
            pv = new Ole32.PROPVARIANT(new[] { true, false, true, false });
            AddTestResult(null, pv.ToString(), pv.cabool);
            PropSys.InitPropVariantFromBooleanVector(new[] { true, false, true, false }, 4, pv);
            AddTestResult(null, pv.ToString(), pv.cabool);
            AddTestResult(null, pv.ToString(), pv.cai);

            // Int
            pv = new Ole32.PROPVARIANT((int?)null);
            AddTestResult(null, pv.ToString(), pv.plVal);
            pv = new Ole32.PROPVARIANT(3);
            AddTestResult(null, pv.ToString(), new[] { pv.Value, pv.bVal, pv.cVal, pv.iVal, pv.uiVal, pv.intVal, pv.lVal, pv.uintVal, pv.ulVal, pv.hVal, pv.uhVal, pv.scode });
            pv = new Ole32.PROPVARIANT(new Win32Error(5));
            AddTestResult(null, pv.ToString(), $"{pv.lVal}/{(int)pv.scode}");
            pv = new Ole32.PROPVARIANT(new[] { 0, 1, 2 });
            AddTestResult(null, pv.ToString(), pv.cal);

            // Decimal
            pv = new Ole32.PROPVARIANT(3.3m);
            AddTestResult(null, pv.ToString(), new[] { pv.Value, pv.pdecVal, pv.bVal, pv.cVal, pv.iVal, pv.uiVal, pv.intVal, pv.lVal, pv.uintVal, pv.ulVal, pv.hVal, pv.uhVal, pv.fltVal, pv.dblVal });
            pv = new Ole32.PROPVARIANT(3.3m, VarEnum.VT_CY);
            AddTestResult(null, pv.ToString(), new[] { pv.Value, pv.pdecVal, pv.cyVal, pv.pcyVal });
            pv = new Ole32.PROPVARIANT(new[] { 0m, 1m, 2m }, VarEnum.VT_CY);
            AddTestResult(null, pv.ToString(), pv.cacy);

            // Single/double precision
            pv = new Ole32.PROPVARIANT(3.3f);
            AddTestResult(null, pv.ToString(), new[] { pv.Value, pv.fltVal, pv.dblVal, pv.pdecVal, pv.bVal, pv.cVal, pv.iVal, pv.uiVal, pv.intVal, pv.lVal, pv.uintVal, pv.ulVal, pv.hVal, pv.uhVal });
            pv = new Ole32.PROPVARIANT(3.3);
            AddTestResult(null, pv.ToString(), new[] { pv.Value, pv.fltVal, pv.dblVal });
            pv = new Ole32.PROPVARIANT(new[] { 0.0f, 1.1f, 2.2f });
            AddTestResult(null, pv.ToString(), pv.caflt);
            pv = new Ole32.PROPVARIANT(new[] { 0.0, 1.1, 2.2 });
            AddTestResult(null, pv.ToString(), pv.cadbl);

            // Byte
            pv = new Ole32.PROPVARIANT((byte)3);
            AddTestResult(null, pv.ToString(), pv.bVal);
            pv = new Ole32.PROPVARIANT(new byte[] { 0, 1, 2 });
            AddTestResult(null, pv.ToString(), pv.caub);

            // Guid
            pv = new Ole32.PROPVARIANT(Guid.NewGuid());
            AddTestResult(null, pv.ToString(), pv.puuid);
            pv = new Ole32.PROPVARIANT(new[] { Guid.NewGuid(), Guid.NewGuid() });
            AddTestResult(null, pv.ToString(), pv.cauuid);

            // String
            pv = new Ole32.PROPVARIANT("TestNoVTVal");
            AddTestResult(null, pv.ToString(), new[] { pv.Value, pv.pszVal, pv.pwszVal, pv.bstrVal, pv.pbstrVal });
            pv = new Ole32.PROPVARIANT("TestBSTR", VarEnum.VT_BSTR);
            AddTestResult(null, pv.ToString(), new[] { pv.Value, pv.pszVal, pv.pwszVal, pv.bstrVal, pv.pbstrVal });
            pv = new Ole32.PROPVARIANT("TestLPSTR", VarEnum.VT_LPSTR);
            AddTestResult(null, pv.ToString(), new[] { pv.Value, pv.pszVal, pv.pwszVal, pv.bstrVal, pv.pbstrVal });
            pv = new Ole32.PROPVARIANT("TestLPWSTR", VarEnum.VT_LPWSTR);
            AddTestResult(null, pv.ToString(), new[] { pv.Value, pv.pszVal, pv.pwszVal, pv.bstrVal, pv.pbstrVal });
            pv = new Ole32.PROPVARIANT(new[] { "TestStrVec", "X" });
            AddTestResult(null, pv.ToString(), pv.calpwstr);
            pv = new Ole32.PROPVARIANT(new[] { 1, 2, 3 }, VarEnum.VT_LPWSTR);
            AddTestResult(null, pv.ToString(), pv.calpwstr);
            PropSys.InitPropVariantFromStringVector(new[] { "TestStrVec", "X" }, 2, pv);
            AddTestResult(null, pv.ToString(), pv.calpwstr);
        }