如何使用 PowerShell 禁用 Windows 表单标题栏上的右键单击上下文菜单
How to disable the right click context menu on the title bar of a Windows Form using PowerShell
是否可以在不删除标题栏 and/or 图标的情况下禁用标题栏上的 right-click 上下文菜单?如果是,如何?
我正在使用 PowerShell。
我找到了这两个帖子,但它们是专门用 C# 编写的。我没有足够的 C# 经验来使用 PowerShell 正确地实现它:
How to handle Form caption right click
我有检测鼠标事件的基本代码,但我不确定如何实现它来仅检测在 TitleBar 上的鼠标右键单击。
$window.Add_MouseDown(
{
if (($_.Button.ToString() -eq "Right")) {
# Code here
}
}
)
如能提供有关 PowerShell 代码的任何帮助,我们将不胜感激。
您可以覆盖 WndProc,将 WM_INITMENUPOPUP
(or WM_ENTERMENULOOP
) and cancel the Popup Menu sending a WM_CANCELMODE
消息捕获到 Window。
如果不想在selectTitleBar图标时不显示System Menu,可以检查Mouse位置,只有当鼠标不在占用区域时才取消Popup通过标题栏图标。
无论如何(如果您决定完全禁止弹出菜单),这不会阻止 ContexMenuStrip 出现在客户区(不同的消息)。
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, int lParam);
private const int WM_CANCELMODE = 0x001F;
private const int WM_INITMENUPOPUP = 0x0117;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg) {
case WM_INITMENUPOPUP:
// If the high word is set to 1, the PopupMenu is the Window Menu
if (m.LParam.ToInt32() >> 16 == 1) {
if (MousePosition.X - this.Bounds.X > SystemInformation.MenuButtonSize.Width) {
SendMessage(this.Handle, WM_CANCELMODE, 0, 0);
}
}
m.Result = IntPtr.Zero;
break;
}
}
您可以在 Powershell 中执行 C# 代码:
$source = @"[...code...]"
// [...]
$assemblies = ("System.Windows.Forms", "System.Runtime.InteropServices")
Add-Type -ReferencedAssemblies $assemblies -TypeDefinition $source -Language CSharp
查看这些帖子,例如:
- Use the upgraded FolderBrowserDialog (“Vista style”) in Powershell
- Powershell: Sync Scrolling of two Richtextboxes
- Checking what closed your Windows Form in Powershell
对于 旧 版本的 PowerShell,请参见例如:
C#/PowerShell] Clipboard Watcher
是否可以在不删除标题栏 and/or 图标的情况下禁用标题栏上的 right-click 上下文菜单?如果是,如何?
我正在使用 PowerShell。
我找到了这两个帖子,但它们是专门用 C# 编写的。我没有足够的 C# 经验来使用 PowerShell 正确地实现它:
How to handle Form caption right click
我有检测鼠标事件的基本代码,但我不确定如何实现它来仅检测在 TitleBar 上的鼠标右键单击。
$window.Add_MouseDown(
{
if (($_.Button.ToString() -eq "Right")) {
# Code here
}
}
)
如能提供有关 PowerShell 代码的任何帮助,我们将不胜感激。
您可以覆盖 WndProc,将 WM_INITMENUPOPUP
(or WM_ENTERMENULOOP
) and cancel the Popup Menu sending a WM_CANCELMODE
消息捕获到 Window。
如果不想在selectTitleBar图标时不显示System Menu,可以检查Mouse位置,只有当鼠标不在占用区域时才取消Popup通过标题栏图标。
无论如何(如果您决定完全禁止弹出菜单),这不会阻止 ContexMenuStrip 出现在客户区(不同的消息)。
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, int lParam);
private const int WM_CANCELMODE = 0x001F;
private const int WM_INITMENUPOPUP = 0x0117;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg) {
case WM_INITMENUPOPUP:
// If the high word is set to 1, the PopupMenu is the Window Menu
if (m.LParam.ToInt32() >> 16 == 1) {
if (MousePosition.X - this.Bounds.X > SystemInformation.MenuButtonSize.Width) {
SendMessage(this.Handle, WM_CANCELMODE, 0, 0);
}
}
m.Result = IntPtr.Zero;
break;
}
}
您可以在 Powershell 中执行 C# 代码:
$source = @"[...code...]"
// [...]
$assemblies = ("System.Windows.Forms", "System.Runtime.InteropServices")
Add-Type -ReferencedAssemblies $assemblies -TypeDefinition $source -Language CSharp
查看这些帖子,例如:
- Use the upgraded FolderBrowserDialog (“Vista style”) in Powershell
- Powershell: Sync Scrolling of two Richtextboxes
- Checking what closed your Windows Form in Powershell
对于 旧 版本的 PowerShell,请参见例如:
C#/PowerShell] Clipboard Watcher