前提・実現したいこと
WPFのWindowスタイル「閉じる・最大化・最小化」を動的に非アクティブ or 非表示にしたいと考えています。よろしくお願いいたします。
下記のサイトをベースに、ビヘイビアを使用してボタンを押した際に切り替える予定です。
https://b.amberfrog.net/post/88379654924/window-behavior
コードを見てみると、WinAPIのWM_SYSCOMMANDの値にて、切り替えているように考えたのですが、最大化・最小化の値を指定しても、「閉じる」同様非アクティブになりません。
自分の理解が違っているのでしょうか。。
よろしくお願いいたします。
発生している問題・エラーメッセージ
サンプルコード通りの「閉じる」は非アクティブにできるが、最大化・最小化の非アクティブ化が出来ない
該当のソースコード
CloseButtonBehavior
C#
1 2 [DllImport("user32.dll")] 3 private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert); 4 5 [DllImport("user32.dll")] 6 private static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable); 7 8 private const uint SC_CLOSE = 0xF060; 9 private const uint SC_MAXIMIZE = 0xF030; //最大化 10 private const uint SC_MINIMIZE = 0xF020; //最小化 11 12 private const uint MF_BYCOMMAND = 0x00000000; 13 private const uint MF_GRAYED = 0x00000001; 14 private const uint MF_ENABLED = 0x00000000; 15 16 public static readonly DependencyProperty IsWindowCloseProperty = DependencyProperty.Register( 17 "IsWindowCloseEnable", typeof(bool), typeof(CloseButtonBehavior), new PropertyMetadata(true, new PropertyChangedCallback(OnPropertyChanged))); 18 19 public bool IsWindowCloseEnable 20 { 21 get { return (bool)this.GetValue(IsWindowCloseProperty); } 22 set { this.SetValue(IsWindowCloseProperty, value); } 23 } 24 25 private static void OnPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 26 { 27 var self = obj as CloseButtonBehavior; 28 if (self != null) 29 { 30 self.Apply(); 31 } 32 } 33 34 private void Apply() 35 { 36 if (AssociatedObject == null) 37 { 38 return; 39 } 40 var hwnd = new WindowInteropHelper(AssociatedObject).Handle; 41 IntPtr hMenu = GetSystemMenu(hwnd, false); 42 if (hMenu != IntPtr.Zero) 43 { 44 if (IsWindowCloseEnable) 45 { 46 EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND | MF_ENABLED); 47 EnableMenuItem(hMenu, SC_MAXIMIZE, MF_BYCOMMAND | MF_ENABLED);//追記した(最大化ボタンのつもり) 48 EnableMenuItem(hMenu, SC_MINIMIZE, MF_BYCOMMAND | MF_ENABLED);//追記した(最小化ボタンのつもり) 49 } 50 else 51 { 52 EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND | MF_GRAYED); 53 EnableMenuItem(hMenu, SC_MAXIMIZE, MF_BYCOMMAND | MF_GRAYED);//追記した(最大化ボタンのつもり) 54 EnableMenuItem(hMenu, SC_MINIMIZE, MF_BYCOMMAND | MF_GRAYED);//追記した(最小化ボタンのつもり) 55 } 56 } 57 }
xaml
1<Window x:Class="CloseButtonBehavior.Views.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 5 xmlns:b="clr-namespace:CloseButtonBehavior.Behaviors" 6 Title="Close Button Behavior Sample" 7 Height="80" Width="400"> 8 <i:Interaction.Behaviors> 9 <b:CloseButtonBehavior IsWindowCloseEnable="{Binding ElementName=CloseCheck, Path=IsChecked}"/> 10 </i:Interaction.Behaviors> 11 <Grid> 12 <CheckBox x:Name="CloseCheck" 13 Content="閉じるボタンを有効にする" 14 IsChecked="True" 15 VerticalAlignment="Center"/> 16 </Grid> 17</Window>
試したこと
Win32 APIの値を調査
https://docs.microsoft.com/en-us/windows/win32/menurc/wm-syscommand
補足情報(FW/ツールのバージョンなど)
環境:VisualStudio2019 pro
OS:Windows10
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/24 23:17
2021/12/01 23:46