2011-08-11 11 views
4

デスクトップショートカットからWPFメインウィンドウの最初のWindowState(Normal、Minimized、Maximized)を制御するにはどうすればよいですか?WPFアプリケーションへのデスクトップショートカットからWindowStateを渡すには?

ショートカットのプロパティダイアログの「実行:」コンボボックスで、「標準ウィンドウ」、「最小化」、「最大化」のいずれかを選択できます。しかし、このオプションはWPFアプリケーションでは完全に無視されているようです。 WinFormsでは、これは自動的に追加のコードなしでサポートされていました。

起動したWPFプロセスからこのオプションにアクセスする方法はありますか?私は新しいプロセスを起動するときにProcessStartInfo.WindowStyleプロパティを指定できることを知っています。しかし、このオプションをプロセスから起動するにはどうすればいいですか?全体の情報にアクセスするだけでinitial window stateまたはNativeMethods.StartupInfo.FromCurrentProcessを取得する

答えて

2
System.Diagnostics.Process.GetCurrentProcess().StartInfo.WindowStyle 
+0

これはまさに私が探していたものです。どうもありがとう! – candritzky

0

使用NativeMethods.StartupInfo.GetInitialWindowStyle()

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; 
      } 
     } 
    } 
} 
関連する問題