如何使用 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

查看这些帖子,例如:

对于 版本的 PowerShell,请参见例如:
C#/PowerShell] Clipboard Watcher