仅在WPF中窗口的标题栏上隐藏最小化按钮

时间:2014-03-12 15:47:57

标签: .net wpf winapi

我有一个WPF应用程序,可以拆除窗户,我希望能够隐藏最小化按钮(在撕下) - 我不想隐藏最大化,只有最小化。 This所以问题显示了如何隐藏BOTH,但是当我改为代码只是为了隐藏最小化它显示但是被禁用。

这只会禁用按钮:

 internal static void HideMinimizeButtons(this Window window)
 {
     var hwnd = new WindowInteropHelper(window).Handle;
     var currentStyle = GetWindowLong(hwnd, GWL_STYLE);

     SetWindowLong(hwnd, GWL_STYLE, (currentStyle & ~WS_MINIMIZEBOX));
 }

我怎样才能让它隐藏最小化按钮?

1 个答案:

答案 0 :(得分:3)

AFAIK“最小”和“最大”按钮可以作为一组隐藏,但不能单独隐藏。

即使在Windows窗体时代,MimimizeBox属性也是如此。

this.MinimizeBox = false;  // still visible, but disabled
this.MaximizeBox = false;  // add this line and both buttons disappear 

系统菜单是另一回事。可以使用此代码隐藏菜单项。

<强> CODE

public partial class MainWindow : Window {
    private const int MF_BYPOSITION = 0x400;

    [DllImport("User32")]
    private static extern int RemoveMenu(IntPtr hMenu, int position, int flags);
    [DllImport("User32")]
    private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool revert);
    [DllImport("User32")]
    private static extern int GetMenuItemCount(IntPtr hWnd);

    private enum SystemMenu : int {
      Restore,
      Move,
      Size,
      Minimize,
      Maximize
    }

    public MainWindow() {
      InitializeComponent();

      this.Loaded += MainWindow_Loaded;
    }

    private void MainWindow_Loaded(object sender, RoutedEventArgs e) {
      WindowInteropHelper helper = new WindowInteropHelper(this);
      IntPtr menuPtr = GetSystemMenu(helper.Handle, false);
      int menuItemCount = GetMenuItemCount(menuPtr);
      RemoveMenu(menuPtr, (int)SystemMenu.Minimize, MF_BYPOSITION);
    }
}

截屏之前

enter image description here

截屏后

enter image description here

使用

SetWindowLong(hwnd, GWL_STYLE, (currentStyle & ~WS_MINIMIZEBOX));

禁用菜单和按钮。

这可以防止用户最小化撕下窗口,但是没有你想要的外观。

我见过用于解决这个问题的替换标题栏,但要做好正确的工作还有很多工作。