【问题标题】:How to prevent the Console window being resized in VB.NET?如何防止在 VB.NET 中调整控制台窗口的大小?
【发布时间】:2016-11-05 14:59:18
【问题描述】:

我需要阻止我的控制台程序的用户调整窗口大小,只允许以编程方式对其进行更改。如果用户改变宽度,一切都会搞砸。另外,我想禁用最大化按钮。在控制台中是否可以使用其中任何一种?

This answer 巧妙地介绍了如何在 WinForms 中禁用调整表单大小,但它不适用于控制台。

【问题讨论】:

  • 您链接到的答案不适用于并且不能适用于控制台应用程序。显着的区别在于控制台应用程序不拥有自己的控制台窗口,而是使用由外部 Windows 进程提供的控制台窗口(曾经是 csrss,现在是 conhost - Console Host)。

标签: vb.net visual-studio-2015 resize console-application window-resize


【解决方案1】:

我想出了一个解决方案,可以防止重新调整控制台窗口应用程序的大小(通过拖动角边框或单击最大化或最小化按钮)。以下代码以完整的 VB.Net 控制台应用程序(即模块)的形式编写:

Module Module1

    Private Const MF_BYCOMMAND As Integer = &H0
    Public Const SC_CLOSE As Integer = &HF060
    Public Const SC_MINIMIZE As Integer = &HF020
    Public Const SC_MAXIMIZE As Integer = &HF030
    Public Const SC_SIZE As Integer = &HF000

    Friend Declare Function DeleteMenu Lib "user32.dll" (ByVal hMenu As IntPtr, ByVal nPosition As Integer, ByVal wFlags As Integer) As Integer
    Friend Declare Function GetSystemMenu Lib "user32.dll" (hWnd As IntPtr, bRevert As Boolean) As IntPtr


    Sub Main()

        Dim handle As IntPtr
        handle = Process.GetCurrentProcess.MainWindowHandle ' Get the handle to the console window

        Dim sysMenu As IntPtr
        sysMenu = GetSystemMenu(handle, False) ' Get the handle to the system menu of the console window

        If handle <> IntPtr.Zero Then
            DeleteMenu(sysMenu, SC_CLOSE, MF_BYCOMMAND) ' To prevent user from closing console window
            DeleteMenu(sysMenu, SC_MINIMIZE, MF_BYCOMMAND) 'To prevent user from minimizing console window
            DeleteMenu(sysMenu, SC_MAXIMIZE, MF_BYCOMMAND) 'To prevent user from maximizing console window
            DeleteMenu(sysMenu, SC_SIZE, MF_BYCOMMAND) 'To prevent the use from re-sizing console window
        End If

        Do Until (Console.ReadKey.Key = ConsoleKey.Escape)
            'This loop keeps the console window open until you press escape      
        Loop

    End Sub

End Module

我根据 Stack Overflow 问题/答案得出这个答案:"Disable the maximize and minimize buttons of a c# console [closed]"

如果这对您不起作用,请告诉我。祝你好运!

【讨论】:

  • 这应该非常接近,但我不知道通过拖动边框调整控制台大小时它是否有效。 (作为旁注,Windows 10 中改进的控制台还允许水平调整大小,而不仅仅是垂直 - windows resize 段落Console Improvements in the Windows 10 Technical Preview)。
  • 它工作得很好,它阻止我调整边框大小和最大化窗口。只有两个问题:我也无法手动关闭程序(X 被空白),如果我将窗口捕捉到一个角落,它仍然会弄乱所有的 GUI。但后者可能是特定于 Windows 的问题。无论如何,我接受,因为你的答案有效。但如果你能告诉我如何解决无法关闭程序的问题,那就太棒了。
  • 要允许用户通过单击“X”关闭控制台,只需注释掉第一个“DeleteMenu”条目(带有 SC_CLOSE 的条目)。
  • 感谢您的帮助!
【解决方案2】:

我想评论接受的答案,但我缺乏声誉......

要防止控制台窗口在您将其捕捉到角落时调整大小,您可以使用

Console.SetBufferSize(80, 24) ' or whatever size you're using...

【讨论】:

  • 什么是缓冲区,它与窗口大小有何不同?
  • +1。这相当于 C++ 的SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), { 80, 24 });。对于简单的调整大小限制来说已经足够了。 (已接受的答案在 C++ 中不起作用,而这有效,因此 +1 表示两种语言的“兼容性和简单性”)
猜你喜欢
  • 2019-09-23
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多