【问题标题】:console to second display in windows控制台到 Windows 中的第二个显示
【发布时间】:2020-11-25 20:19:24
【问题描述】:

我正在为 Windows 编写一个 MFC 应用程序。 在开发过程中,我使用控制台窗口进行调试输出。 我想要的是设置这个控制台,以便它在启动时默认显示在第二个显示器上。 有可能吗??

【问题讨论】:

  • 除非您有明显的理由登录控制台,否则请考虑使用 OutputDebugString
  • @IInspectable,使用控制台查看 Trace 消息有什么问题?它是“穷人”工具吗? cmd 在所有窗口中无处不在。
  • @tom 一个进程最多可以连接一个控制台。在该控制台已用于其他用途的情况下,您会怎么做?它的设置也有些复杂,并且会干扰稍后尝试附加到控制台的应用程序逻辑。与OutputDebugString 不同,它也会丢失与其他诊断输出相关的上下文。与OutputDebugString 不同的是,您不能轻易禁用跟踪输出。

标签: mfc multiple-monitors windows-console


【解决方案1】:

您可以获得包含您的应用窗口的监视器的句柄:

HMONITOR hMyMonitor = ::MonitorFromWindow(MyHwnd, MONITOR_DEFAULTTOPRIMARY);

然后你可以使用EnumDisplayMonitors function枚举所有监视器

在您的MONITORENUMPROC callback function 中,将其监视器句柄与hMyMonitor 进行比较。如果它不同 - 你找到了另一台显示器。现在可以使用GetMonitorInfoW function 得到MONITORINFO structure,包含

rcWork

一个 RECT 结构,指定显示监视器的工作区域矩形,以虚拟屏幕坐标表示。

最后,您可以使用GetConsoleWindow 获取控制台的句柄,并使用MoveWindow 将其移动到您想要的任何位置

【讨论】:

【解决方案2】:

经过一番摆弄,我最终得到了这个:

#ifdef _DEBUG
    CONSOLE_FONT_INFOEX cfi;
    cfi.cbSize = sizeof(cfi);
    cfi.nFont = 0;
    cfi.dwFontSize.X = 0;                   // Width of each character in the font
    cfi.dwFontSize.Y = 24;                  // Height
    cfi.FontFamily = FF_DONTCARE;
    cfi.FontWeight = FW_NORMAL;

    wcscpy_s(cfi.FaceName, L"Consolas"); // Choose your font

    // Make a console window
    bool o = AllocConsole();
    SetConsoleOutputCP( CP_UTF8 );      // UTF-8 please

    // and a larger font so that I can read it :)
    SetCurrentConsoleFontEx( GetStdHandle( STD_OUTPUT_HANDLE ), FALSE, &cfi );

    HWND hWConsol = GetConsoleWindow();
    ::MoveWindow( hWConsol, -800, 0, 800, 800, true );
#endif

更正的代码,作为魅力 :) 谢谢!

【讨论】:

  • 这太可笑了。您发明了一个函数,其唯一目的是将参数传播到already existing function。这绝对没有目的增加噪音。只需调用该函数即可。
  • 是的,你是对的,但这是我缺少全局命名空间解析前缀“::”的解决方法,我完全忘记了那个。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
相关资源
最近更新 更多