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