使用 WindowChrome.WindowChrome 禁用上下文菜单
Disable Context Menu with WindowChrome.WindowChrome
如果我使用 WindowChrome.WindowChrome 样式,我将无法禁用上下文菜单。
请让我知道您解决此问题的意见。
如果没有 WindowChrome,我可以使用相同的代码禁用上下文菜单。
<Window x:Class="ConextMenu_Sample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<WindowChrome.WindowChrome>
<WindowChrome CaptionHeight="35"
CornerRadius="0"
ResizeBorderThickness="5"
UseAeroCaptionButtons="False" />
</WindowChrome.WindowChrome>
<Grid>
</Grid>
</Window>
代码隐藏
public partial class MainWindow : Window
{
private const uint WP_SYSTEMMENU = 0x02;
private const uint WM_SYSTEMMENU = 0xa4;
public MainWindow()
{
InitializeComponent();
Loaded += OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
IntPtr windIntPtr = new WindowInteropHelper(this).Handle;
HwndSource hwndSource = HwndSource.FromHwnd(windIntPtr);
hwndSource.AddHook(new HwndSourceHook(WndProc));
}
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam, ref bool handled)
{
if ((msg == WM_SYSTEMMENU) && (wparam.ToInt32() == WP_SYSTEMMENU))
{
handled = true;
}
return IntPtr.Zero;
}
}
使用此代码:
你需要设置windowstyle 属性 None.
属性:- WindowStyle = "None"
<Window x:Class="ConextMenu_Sample.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" WindowStyle="None">
[或]
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam, ref bool handled)
{
if ((msg == WM_SYSTEMMENU) && (wparam.ToInt32() == WP_SYSTEMMENU))
{
handled = false; // Change the Boolean Value to false //
}
return IntPtr.Zero;
}
也许你不需要这个,但我解决了它并想分享给需要它的人。
if (((msg == WM_SYSTEMMENU) && (wParam.ToInt32() == WP_SYSTEMMENU)) || msg == 165){
//ShowContextMenu();
handled = true;
}
如果我使用 WindowChrome.WindowChrome 样式,我将无法禁用上下文菜单。 请让我知道您解决此问题的意见。 如果没有 WindowChrome,我可以使用相同的代码禁用上下文菜单。
<Window x:Class="ConextMenu_Sample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<WindowChrome.WindowChrome>
<WindowChrome CaptionHeight="35"
CornerRadius="0"
ResizeBorderThickness="5"
UseAeroCaptionButtons="False" />
</WindowChrome.WindowChrome>
<Grid>
</Grid>
</Window>
代码隐藏
public partial class MainWindow : Window
{
private const uint WP_SYSTEMMENU = 0x02;
private const uint WM_SYSTEMMENU = 0xa4;
public MainWindow()
{
InitializeComponent();
Loaded += OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
IntPtr windIntPtr = new WindowInteropHelper(this).Handle;
HwndSource hwndSource = HwndSource.FromHwnd(windIntPtr);
hwndSource.AddHook(new HwndSourceHook(WndProc));
}
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam, ref bool handled)
{
if ((msg == WM_SYSTEMMENU) && (wparam.ToInt32() == WP_SYSTEMMENU))
{
handled = true;
}
return IntPtr.Zero;
}
}
使用此代码:
你需要设置windowstyle 属性 None.
属性:- WindowStyle = "None"
<Window x:Class="ConextMenu_Sample.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" WindowStyle="None">
[或]
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam, ref bool handled)
{
if ((msg == WM_SYSTEMMENU) && (wparam.ToInt32() == WP_SYSTEMMENU))
{
handled = false; // Change the Boolean Value to false //
}
return IntPtr.Zero;
}
也许你不需要这个,但我解决了它并想分享给需要它的人。
if (((msg == WM_SYSTEMMENU) && (wParam.ToInt32() == WP_SYSTEMMENU)) || msg == 165){
//ShowContextMenu();
handled = true;
}