1

是否可以在不删除标题栏和/或图标的情况下禁用标题栏上的右键单击上下文菜单?如果是,如何?

图片

我正在使用 PowerShell。

我找到了这两个帖子,但它们是专门用 C# 编写的。我没有足够的 C# 经验来使用 PowerShell 正确实现它:
防止在右键单击表单标题栏时显示系统上下文菜单
如何处理表单标题右键单击

我有检测鼠标事件的基本代码,但我不确定如何实现它来检测仅在 TitleBar 上的鼠标右键单击。

$window.Add_MouseDown(
        {
            if (($_.Button.ToString() -eq "Right")) {
                # Code here
            }
        }
    )

任何有关 PowerShell 代码的帮助将不胜感激。

4

1 回答 1

0

您可以覆盖 WndProc、捕获WM_INITMENUPOPUP(或)并取消向窗口WM_ENTERMENULOOP发送消息的弹出菜单。WM_CANCELMODE

如果您不想在选择 TitleBar 图标时阻止 System Menu 出现,您可以检查 Mouse position,如果鼠标不在 Titlebar 图标占用的区域,则仅取消 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

于 2021-03-29T18:47:15.137 回答