如何在Visual Studio控制台应用程序中禁用控制台窗口的关闭按钮?

22

我需要禁用在C#编写的Visual Studio控制台应用程序中控制台窗口的关闭按钮。我希望该应用程序能一直运行直到完成,用户无法通过关闭控制台窗口来停止它。我正在使用Visual Studio 2010。


1
您还需要在任务栏上的应用程序上禁用鼠标右键并选择“关闭”。也许还需要禁用任务管理器? - RvdK
1个回答

66

以下是一个示例,用于禁用控制台窗口的关闭按钮:

class Program
{
    private const int MF_BYCOMMAND = 0x00000000;
    public const int SC_CLOSE = 0xF060;

    [DllImport("user32.dll")]
    public static extern int DeleteMenu(IntPtr hMenu, int nPosition, int wFlags);

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

    [DllImport("kernel32.dll", ExactSpelling = true)]
    private static extern IntPtr GetConsoleWindow();

    static void Main(string[] args)
    {
        DeleteMenu(GetSystemMenu(GetConsoleWindow(), false),SC_CLOSE, MF_BYCOMMAND);
        Console.Read();
    }
}

6
尝试在任务栏中右键点击应用程序,然后选择关闭,这样怎么样? - RvdK
1
谢谢。运行得很好。虽然,正如PowerRoy指出的那样,控制台窗口仍然可以从任务栏关闭,但我对给定的解决方案感到满意。您能否简要解释一下代码实际在做什么? - vjain27
1
@vjain27:所有的东西都在 MSDN 上 :) GetConsoleWindow 检索与调用进程关联的控制台使用的窗口句柄。GetSystemMenu 返回窗口菜单的句柄。最后,您可以在这里找到常量。并且DeleteMenu删除指定的菜单项。 - Renatas M.
@PowerRoy:我在某个地方读到说这很难做。但也许是可能的 - 我不知道 :) 也许你可以尝试将你的应用程序发送到系统托盘? - Renatas M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接