【问题标题】:How to disable the `Close` item of console window context menu?如何禁用控制台窗口上下文菜单的“关闭”项?
【发布时间】:2016-07-29 16:10:40
【问题描述】:

Windows 7
如何禁用控制台窗口上下文菜单的Close项?

更新

我使用 C# 中的 PInvoke:

const uint MF_BYCOMMAND = 0x00000000;
const uint MF_GRAYED = 0x00000001;
const uint SC_CLOSE = 0xF060;
const uint MF_DISABLED = 0x00000002;

[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();

[DllImport("user32.dll")]
static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

[DllImport("User32.dll", SetLastError = true)]
static extern uint EnableMenuItem(IntPtr hMenu, uint itemId, uint uEnable);

...

// Disable the close button and "Close" context menu item of the Console window
IntPtr hwnd = GetConsoleWindow();
IntPtr hmenu = GetSystemMenu(hwnd, false);
uint hWindow = EnableMenuItem(hmenu, SC_CLOSE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);

我的代码禁用了“X”按钮,但“关闭”项仍然启用并且可以启动:

【问题讨论】:

  • GetSystemMenu 然后是带有 CLOSE 标识符的 DeleteMenu
  • @AlexK.:这完全删除了菜单条目。 EnableMenuItem 可用于禁用菜单项。
  • 为什么要删除这个选项?好像有点可疑……
  • @DenisAnisimov,你的变种也很好,工作正常。谢谢。

标签: c# c++ winapi


【解决方案1】:

SC_CLOSE 是要禁用的相应标识符。 EnableMenuItem 禁用 X 按钮和菜单项,但该技巧似乎不起作用(旧操作系统?)。删除菜单项确实有效,包括 X 框(非客户区处理程序可能无法检查菜单项的状态并应用禁用状态;而禁用的菜单项被重新启用并再次可用)。

const HMENU hMenu = GetSystemMenu(GetConsoleWindow(), FALSE);
//EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND);

【讨论】:

  • 此代码禁用“X”按钮,但“关闭”项仍处于启用状态并可以启动。
  • 我在 C# 中使用 pinvoke。也许我为MF_BYCOMMANDSC_CLOSEMF_DISABLED 设置了错误的值?我使用这样的值:const uint SC_CLOSE = 0xF060; const uint MF_DISABLED = 0x00000002; const uint MF_BYCOMMAND = 0x00000000; 是否正确?
  • MF_BYCOMMAND | MF_DISABLED | MF_GRAYED0 | 0x02 | 0x01。禁用标志不会强制隐式变灰。
  • 是的,我使用相同的值,但仍然启用“关闭”上下文菜单项。
  • 我在我的主题中添加了 UPD。
【解决方案2】:

我刚刚写了一个名为 librs 的类库,你可以在https://www.dllme.com/dll/files/librs_dll.htmlhttp://plweb.pluginweb.ml/viewpage/librs.dll 上下载它,你可以写它librs.menucontrol.DisableAll(); 已经更新了。

【讨论】:

    猜你喜欢
    • 2015-05-29
    • 2012-05-02
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 2012-10-14
    • 1970-01-01
    相关资源
    最近更新 更多