【问题标题】:How to pass WindowState from desktop shortcut into WPF app?如何将 WindowState 从桌面快捷方式传递到 WPF 应用程序?
【发布时间】:2011-10-24 23:30:22
【问题描述】:

如何从桌面快捷方式控制 WPF 主窗口的初始 WindowState(正常、最小化、最大化)?

快捷方式属性对话框的“运行:”组合框让我在“普通窗口”、“最小化”和“最大化”之间进行选择。但是 WPF 应用程序似乎完全忽略了这个选项。使用 WinForms,无需额外代码即可自动支持。

有没有办法从启动的 WPF 进程中访问此选项?我知道我可以在启动新进程时指定 ProcessStartInfo.WindowStyle 属性。但是如何从正在启动的进程中访问此选项?

【问题讨论】:

    标签: wpf processstartinfo windowstate desktop-shortcut


    【解决方案1】:
    System.Diagnostics.Process.GetCurrentProcess().StartInfo.WindowStyle
    

    【讨论】:

    • 这正是我想要的。非常感谢!
    【解决方案2】:

    使用NativeMethods.StartupInfo.GetInitialWindowStyle() 只获取initial window stateNativeMethods.StartupInfo.FromCurrentProcess 以访问全部信息。

    static partial class NativeMethods
    {
        public static class StartupInfo
        {
            [StructLayout(LayoutKind.Sequential)]
            public class STARTUPINFO
            {
                public readonly UInt32 cb;  
                private IntPtr lpReserved;
                [MarshalAs(UnmanagedType.LPWStr)] public readonly string lpDesktop;
                [MarshalAs(UnmanagedType.LPWStr)] public readonly string lpTitle;
                public readonly UInt32 dwX;
                public readonly UInt32 dwY;
                public readonly UInt32 dwXSize;
                public readonly UInt32 dwYSize;
                public readonly UInt32 dwXCountChars;
                public readonly UInt32 dwYCountChars;
                public readonly UInt32 dwFillAttribute;
                public readonly UInt32 dwFlags;
                [MarshalAs(UnmanagedType.U2)] public readonly UInt16 wShowWindow;
                [MarshalAs(UnmanagedType.U2)] public readonly UInt16 cbReserved2;
                private IntPtr lpReserved2;
                public readonly IntPtr hStdInput;
                public readonly IntPtr hStdOutput;
                public readonly IntPtr hStdError;
            }
    
            public readonly static STARTUPINFO FromCurrentProcess = null;
    
            const uint STARTF_USESHOWWINDOW = 0x00000001;
            const ushort SW_HIDE = 0;
            const ushort SW_SHOWNORMAL = 1;
            const ushort SW_SHOWMINIMIZED = 2;
            const ushort SW_SHOWMAXIMIZED = 3;
            const ushort SW_MINIMIZE = 6;
            const ushort SW_SHOWMINNOACTIVE = 7;
            const ushort SW_FORCEMINIMIZE = 11;
    
            [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
            static extern void GetStartupInfoW(IntPtr startupInfoPtr);
    
            static StartupInfo() //Static constructor
            {
                FromCurrentProcess = new STARTUPINFO();
                int length = Marshal.SizeOf(typeof(STARTUPINFO));
                IntPtr ptr = Marshal.AllocHGlobal(length);
    
                Marshal.StructureToPtr(FromCurrentProcess, ptr, false);
                GetStartupInfoW(ptr);
                Marshal.PtrToStructure(ptr, FromCurrentProcess);
                Marshal.FreeHGlobal(ptr);
            }
    
            public static ProcessWindowStyle GetInitialWindowStyle()
            {
                if ((FromCurrentProcess.dwFlags & STARTF_USESHOWWINDOW) == 0) return ProcessWindowStyle.Normal;
    
                switch (FromCurrentProcess.wShowWindow)
                {
                    case SW_HIDE: return ProcessWindowStyle.Hidden;
                    case SW_SHOWNORMAL: return ProcessWindowStyle.Normal;
                    case SW_MINIMIZE:
                    case SW_FORCEMINIMIZE:
                    case SW_SHOWMINNOACTIVE:
                    case SW_SHOWMINIMIZED: return ProcessWindowStyle.Minimized;
                    case SW_SHOWMAXIMIZED: return ProcessWindowStyle.Maximized;
                    default: return ProcessWindowStyle.Normal;
                }
            }
        } 
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-15
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-05
      • 2023-03-18
      • 1970-01-01
      相关资源
      最近更新 更多