2011-09-14 27 views
8

Trong chương trình MFC, bạn có thể xác định liệu lối tắt ứng dụng có giá trị Chạy được đặt thành "Thu nhỏ" hay không bằng cách kiểm tra giá trị m_nCmdShow. Có cách nào tương đương để làm điều này trong C#?Có tương đương C# m_nCmdShow không?

Để làm rõ, tôi không muốn đặt trạng thái của một biểu mẫu cụ thể. Nếu bạn nhìn vào các thuộc tính cho một phím tắt, có một tùy chọn "Chạy". Bạn có thể đặt giá trị này thành Cửa sổ Bình thường, Thu nhỏ hoặc Tối đa hóa.

Trong C++, bạn có thể đọc giá trị khởi động đã được đặt bằng cách xem m_nCmdShow. Tôi cần phải làm điều tương tự trong C#.

Cập nhật

nỗ lực này:

[STAThread] 
static void Main(string[] args) 
{ 
    ProcessStartInfo processInfo = Process.GetCurrentProcess().StartInfo; 
    MessageBox.Show(processInfo.WindowStyle.ToString()); 
    ... 
} 

luôn báo cáo Normal, không có vấn đề gì các phím tắt được thiết lập để.

Trả lời

3

Trong WindowsForms thuộc tính WindowState của lớp Biểu mẫu. kiểm tra nó trong các thuộc tính tại thời điểm thiết kế hoặc thiết lập nó từ mã.

Chỉnh sửa: Khi chạy chương trình từ phím tắt Windows có thể sử dụng API CreateProcess chuyển cấu trúc STARTUPINFO đến nó.

từ Windows Forms ứng dụng mà bạn có được cấu trúc như vậy theo cách này:

System.Diagnostics.Process.GetCurrentProcess().StartInfo 

trong đó có bất động sản: WindowStyle và các giá trị có sẵn cho nó được những người của enum:

System.Diagnostics.ProcessWindowStyle 

nên :

Hidden; 
Minimized; 
Maximized; 
Normal; 

và đó là ánh xạ tới m_nCmdShow OP đang tìm kiếm.

+0

Thú vị! thành viên đó được đặt trong MFC như thế nào? giá trị của nó phải được chỉ định ở đâu đó ... –

+0

@Ifalin: xem chỉnh sửa cuối cùng của tôi :) hy vọng câu trả lời này hoàn toàn là câu hỏi của bạn. –

+0

lạ ... thực ra cũng có một câu hỏi khác về điều này: http://stackoverflow.com/questions/7026395/how-to-pass-windowstate-from-desktop-shortcut-into-wpf-app –

0

Điều này cho phép bạn truy xuất trạng thái cửa sổ ban đầu bằng cách truy cập NativeMethods.StartupInfo.GetInitialWindowStyle() trong mã của bạn. Bạn có thể sử dụng thêm thông tin bằng cách truy cập NativeMethods.StartupInfo.FromCurrentProcess. Nếu bạn bắt đầu chương trình của mình từ cmd.exe với START "My Program Title" /MIN MyProgram.exe, bạn sẽ thấy "Tiêu đề chương trình của tôi" trong NativeMethods.StartupInfo.FromCurrentProcess.lpTitleNativeMethods.StartupInfo.GetInitialWindowStyle() trả lại ProcessWindowStyle.Minimized.

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)] private 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; 
      } 
     } 
    } 
} 
Các vấn đề liên quan