您可以覆盖 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