【问题标题】:C# full screen console?C#全屏控制台?
【发布时间】:2011-05-24 07:29:01
【问题描述】:

我已经看到 Windows 可以在更新视频驱动程序时切换到非常基本的控制台界面,我还看到像 Borland C++ 这样的程序这样做。
我真的很想知道如何使用 C#(或 VB.NET,如果您愿意的话)中的控制台应用程序来实现这一点,而且我不介意使用 P/Invoke(我敢打赌我必须!)。

【问题讨论】:

  • 如果应用程序应该是全屏的,我会考虑创建一个 Windows 应用程序而不是控制台应用程序。除非你有要求说它必须是一个控制台应用程序,否则真的没有理由不使用窗口。
  • 是的,我将使用带有类似控制台控件的全屏表单。
  • 我的方法很好用,你怎么说它不起作用?
  • 在 Windows Vista 或 Windows 七上试用。另外,我一直在寻找一种单独使用控制台的方法。
  • 您可以检查 CYGWIN 做事的方式。我使用 minty,它的控制台是窗口化的,并且有一个占据整个屏幕的最大化。

标签: c# console pinvoke console-application fullscreen


【解决方案1】:

在旧版本的 Windows 中,您可以使用 Alt-Enter 将任何控制台全屏显示(如果我没记错的话)。

在 Vista 中引入桌面窗口管理器和通过 GPU 进行全屏合成后,删除了全屏控制台窗口功能。

(更新显卡驱动时,显卡子系统正在重置,你看到的不是控制台窗口,而是显卡默认启动到文本模式。)

【讨论】:

  • 谢谢,这是最完整的(我可以这么说吗?)答案!
  • Alt+Enter 仍然适用于 Windows 10 的控制台窗口。
  • @MatheusRocha,在我的 Win10 中,ALT-Enter 执行最大化但不是全屏。
  • @Xonatron 某些配置可能会阻止全屏窗口。默认情况下(在 Win10 的全新更新安装上测试)Alt+Enter 使控制台窗口全屏显示。您是否搜索过任何可能控制此行为的配置或注册表项?
  • @MatheusRocha 尝试做一个 alt-tab:控制台窗口保持不变:它被最大化而没有标题栏。在较旧的 Windows 中,屏幕模式更改为文本和 alt-tab 退出恢复控制台窗口。根据问题(显卡切换到文本模式),今天发生的不是旧的“全屏文本模式”。
【解决方案2】:

Windows 7 不支持全屏控制台应用程序。在 XP 上你可以使用 SetConsoleDisplayMode,你需要 P/Invoke 到这个,但它相对简单。我知道在 win 7 x64 上这个函数会失败,错误 120 This function is not spported on this system

要获得控制台句柄,您可以使用来自this answer 的一些代码。

【讨论】:

  • 在 CMD (x86, Windows 7) 上我得到一个设备驱动程序不支持的错误。
  • @Vercas:实际上,它依赖于设备驱动程序。是否支持在操作系统代码中,而不是在驱动程序中,但不同的操作系统代码路径用于旧显示驱动程序(存在支持)与 WDDM(不支持全屏)。
【解决方案3】:

您可以右键单击控制台,单击属性,然后在选项盘中将其设置为全屏。您可以保存此更改以保持不变。

【讨论】:

  • 这在 Windows 7(和 Vista)上是否仍然可用?
  • @Hans 不幸的是,在这种情况下确实如此。
  • @Jason Down,我有 XP sp3,我不知道 7,@Vercas,@Hans Passant,它在 XP 中工作得很好,因为你可以将它设置为持久化,它很有用对于独立应用,因为不需要每次运行一个程序都做,安装后就做。
  • @Vercas,小心点,你应该设置.net框架的控制台,而不是通常的命令提示符,进入框架的安装文件夹并找到它。
  • @Saeed 它在 Windows Vista 和 Windows 7 上不起作用,所以这是一个死因。
【解决方案4】:

您的意思是完全卸载 GUI,还是更改屏幕分辨率,例如当您安装新的设备驱动程序时,Windows 会变为 800x600/8bpp,而不是您的正常分辨率?如果你想要一个全屏控制台,我帮不了你,但如果你想改变你的屏幕分辨率等,看看http://www.c-sharpcorner.com/UploadFile/GemingLeader/display-settings08262009094802AM/display-settings.aspx

【讨论】:

  • 呃...这是我另一个问题的答案。
【解决方案5】:

也许我的implementation here 可能会有所帮助。请注意,这不适用于缺少文本模式驱动程序支持的 Windows 系统。

using System;
using System.IO;
using System.Collections.Generic; //for dictionary
using System.Runtime.InteropServices; //for P/Invoke DLLImport

class App
{

        /// <summary>
        /// Contains native methods imported as unmanaged code.
        /// </summary>
        internal static class DllImports
        {
            [StructLayout(LayoutKind.Sequential)]
            public struct COORD
            {

                public short X;
                public short Y;
                public COORD(short x, short y) { 
                    this.X = x;
                    this.Y = y;
                }

            }
            [DllImport("kernel32.dll")]
            public static extern IntPtr GetStdHandle(int handle);
            [DllImport("kernel32.dll", SetLastError = true)]
            public static extern bool SetConsoleDisplayMode(
                IntPtr ConsoleOutput
                ,uint Flags
                ,out COORD NewScreenBufferDimensions
                );
        }
        /// Main App's Entry point
        public static void Main (string[] args)
        {
            IntPtr hConsole = DllImports.GetStdHandle(-11);   // get console handle
            DllImports.COORD xy = new DllImports.COORD(100,100);
            DllImports.SetConsoleDisplayMode(hConsole, 1, out xy); // set the console to fullscreen
            //SetConsoleDisplayMode(hConsole, 2);   // set the console to windowed

        }
}

【讨论】:

    猜你喜欢
    • 2013-06-12
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多