2010-08-11 77 views
2

具体而言,不只是通过删除按钮,但完全禁用最大化。这意味着在Windows 7中双击标题栏或将标题栏拖动到屏幕顶部将不起作用。尽管如此,我仍然希望这个窗口很大。我可以防止WPF中的窗口最大化吗?

+1

所以它的可调整大小?这并不意味着我可以手动将它拖动到屏幕的全尺寸,并基本上最大化? 使窗口不能最大化的重点是什么?关于你的窗口有那么重要,我可以将它拉长到全屏,但不能简单地使用我永远用来做同样的按钮? – 2010-08-11 16:02:10

+3

为什么人们在StackOverflow上一直这样做?与其回答一个问题,他们开始质疑为什么这是必需的。这没有帮助。 只要接受它作为软件的一个要求,并且如果你知道如何保持它的独立性,就可以回答它。在这种情况下,原因是因为客户想要支付我几千欧元来做到这一点。 – 2010-08-13 16:25:47

回答

2

看看CanMinimize字段。

+0

这不符合我的要求。我想禁用最大化,但允许调整大小。 CanMinimize可以防止调整大小。 – 2010-08-11 14:53:05

+0

...并且在没有错误时改变人们的拼写是不礼貌的。我们不是所有美国人,你知道;) – 2010-08-11 14:56:57

+1

对不起,尽管它的价值,“最大化”匹配的MSDN文档:) – 2010-08-11 15:31:35

1

从系统菜单中删除最大化应该足够了。我不知道这是否会为Win7“对接”工作,让我知道如果它。

这里有一个辅助类的文章,修改一个窗口的系统菜单: http://www.codeguru.com/csharp/csharp/cs_misc/userinterface/article.php/c9327/

它假设的WinForms,但只因为你需要一个窗口句柄。在WPF中,这可以通过WindowInteropHelper获得。

更新

此代码是UI框架不可知

using System; 
using System.ComponentModel; 
using System.Runtime.InteropServices; 

[Flags] 
public enum SystemMenuFlags 
{ 
    Unchecked = 0x0000, 
    String = 0x0000, 
    Disabled = 0x0002, 
    Grayed = 0x0001, 
    Checked = 0x0008, 
    Popup = 0x0010, 
    BarBreak = 0x0020, 
    Break = 0x0040, 
    ByPosition = 0x0400, 
    ByCommand = 0x0000, 
    Separator = 0x0800, 
} 

public enum SystemMenuCommand 
{ 
    Size = 0xF000, 
    Move = 0xF010, 
    Minimize = 0xF020, 
    Maximize = 0xF030, 
    Close = 0xF060, 
    Restore = 0xF120, 
} 

public class SystemMenu 
{ 
    private IntPtr _menuHandle = IntPtr.Zero; 
    public IntPtr MenuHandle { get { return _menuHandle; } } 
    private readonly IntPtr _windowHandle; 
    public IntPtr WindowHandle { get { return _windowHandle; } } 


    public SystemMenu(IntPtr windowHandle) 
    { 
     if (windowHandle == IntPtr.Zero) 
      throw new InvalidOperationException("The handle must point to a real window. Create only after your window object has created a real window."); 
     _windowHandle = windowHandle; 
     IntPtr menuHandle = GetSystemMenu(windowHandle, 0); 
     if (menuHandle == IntPtr.Zero) 
      throw new InvalidOperationException("The specified window does not have a system menu."); 
     _menuHandle = menuHandle; 
    } 

    private SystemMenu(IntPtr windowHandle, IntPtr menuHandle) 
    { 
     _windowHandle = windowHandle; 
     _menuHandle = menuHandle; 
    } 

    public static SystemMenu FromHandle(IntPtr windowHandle) 
    { 
     if (windowHandle == IntPtr.Zero) 
      throw new InvalidOperationException("The handle must point to a real window. Call FromHandle only after your window object has created a real window."); 
     IntPtr menuHandle = GetSystemMenu(windowHandle, 0); 
     if (menuHandle == IntPtr.Zero) 
      return null; 
     return new SystemMenu(windowHandle, menuHandle); 
    } 

    public int Count 
    { 
     get 
     { 
      int count = GetMenuItemCount(MenuHandle); 
      if (count < 0) 
       throw new Win32Exception(Marshal.GetLastWin32Error()); 
      return count; 
     } 
    } 

    private int GetItemPosition(SystemMenuCommand command) 
    { 
     int count = Count; 
     for (int position = 0; position < count; position++) 
     { 
      int id = GetMenuItemID(MenuHandle, position); 
      if ((SystemMenuCommand)id == command) 
       return position; 
     } 

     return -1; 
    } 

    public void InsertItem(int position, int id, string text) 
    { 
     if (String.IsNullOrEmpty(text)) 
      throw new ArgumentNullException("text"); 
     if (!IsValidMenuIdValue(id)) 
      throw new ArgumentOutOfRangeException("id", "Valid range for menu id is [0 .. 0xF000]"); 
     if (InsertMenu(MenuHandle, position, (Int32)(SystemMenuFlags.ByPosition | SystemMenuFlags.String), id, text) == 0) 
      throw new Win32Exception(Marshal.GetLastWin32Error()); 
    } 

    public void InsertSeparator(int position) 
    { 
     if (InsertMenu(MenuHandle, position, (Int32)(SystemMenuFlags.ByPosition | SystemMenuFlags.Separator), 0, String.Empty) == 0) 
      throw new Win32Exception(Marshal.GetLastWin32Error()); 
    } 

    public void InsertItemBefore(SystemMenuCommand command, int id, string text) 
    { 
     if (String.IsNullOrEmpty(text)) 
      throw new ArgumentNullException("text"); 
     if (!IsValidMenuIdValue(id)) 
      throw new ArgumentOutOfRangeException("id", "Valid range for menu id is [0 .. 0xF000]"); 
     if (InsertMenu(MenuHandle, (int)command, (Int32)(SystemMenuFlags.ByCommand | SystemMenuFlags.String), id, text) == 0) 
      throw new Win32Exception(Marshal.GetLastWin32Error()); 
    } 

    public void InsertSeparatorBefore(SystemMenuCommand command) 
    { 
     if (InsertMenu(MenuHandle, (int)command, (Int32)(SystemMenuFlags.ByCommand | SystemMenuFlags.Separator), 0, String.Empty) == 0) 
      throw new Win32Exception(Marshal.GetLastWin32Error()); 
    } 

    public void InsertItemAfter(SystemMenuCommand command, int id, string text) 
    { 
     if (String.IsNullOrEmpty(text)) 
      throw new ArgumentNullException("text"); 
     if (!IsValidMenuIdValue(id)) 
      throw new ArgumentOutOfRangeException("id", "Valid range for menu id is [0 .. 0xF000]"); 
     int position = GetItemPosition(command); 
     InsertItem(position + 1, id, text); 
    } 

    public void InsertSeparatorAfter(SystemMenuCommand command) 
    { 
     int position = GetItemPosition(command); 
     InsertSeparator(position + 1); 
    } 

    public void AppendSeparator() 
    { 
     if (AppendMenu(MenuHandle, (int)SystemMenuFlags.Separator, 0, String.Empty) == 0) 
      throw new Win32Exception(Marshal.GetLastWin32Error()); 
    } 

    public void AppendItem(int id, string text) 
    { 
     if (String.IsNullOrEmpty(text)) 
      throw new ArgumentNullException("text"); 
     if (!IsValidMenuIdValue(id)) 
      throw new ArgumentOutOfRangeException("id", "Valid range for menu id is [0 .. 0xF000]"); 
     if (AppendMenu(MenuHandle, (int)SystemMenuFlags.String, id, text) == 0) 
      throw new Win32Exception(Marshal.GetLastWin32Error()); 
    } 

    public void RemoveItem(int position) 
    { 
     if (RemoveMenu(MenuHandle, position, (int)SystemMenuFlags.ByPosition) == 0) 
      throw new Win32Exception(Marshal.GetLastWin32Error()); 
    } 

    public void RemoveItem(SystemMenuCommand command) 
    { 
     if (RemoveMenu(MenuHandle, (int)command, (int)SystemMenuFlags.ByCommand) == 0) 
      throw new Win32Exception(Marshal.GetLastWin32Error()); 
    } 

    public void Reset() 
    { 
     GetSystemMenu(WindowHandle, 1); 
     _menuHandle = GetSystemMenu(WindowHandle, 0); 
    } 

    public static bool IsValidMenuIdValue(int id) 
    { 
     return id > 0 && id < 0xF000; 
    } 

    #region p/Invoke 

    [DllImport("User32")] 
    extern static IntPtr GetSystemMenu(IntPtr hWnd, int bRevert); 
    [DllImport("User32", CharSet = CharSet.Auto, SetLastError = true)] 
    extern static int AppendMenu(IntPtr hMenu, int uFlags, int uIDNewItem, string lpNewItem); 
    [DllImport("User32", CharSet = CharSet.Auto, SetLastError = true)] 
    extern static int InsertMenu(IntPtr hMenu, int uPosition, int uFlags, int uIDNewItem, string lpNewItem); 
    [DllImport("User32", SetLastError = true)] 
    extern static int RemoveMenu(IntPtr hMenu, int uPosition, int uFlags); 
    [DllImport("User32", SetLastError = true)] 
    extern static int GetMenuItemCount(IntPtr hMenu); 
    [DllImport("User32")] 
    extern static int GetMenuItemID(IntPtr hMenu, int nPos); 

    #endregion 
}