c++ 如何禁用控制台窗口上下文菜单中的"关闭“项?

tcomlyy6  于 2023-02-01  发布在  其他
关注(0)|答案(3)|浏览(273)

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

UPD

我使用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"按钮,但"关闭"项仍处于启用状态,可以启动:

w1jd8yoj

w1jd8yoj1#

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

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

yvfmudvl

yvfmudvl2#

HWND hwndConsole = ::GetConsoleWindow();
HMENU hMenu = ::GetSystemMenu(hwndConsole, FALSE);
::DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND);

wh6knrhe

wh6knrhe3#

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

相关问题