c++ - 如何防止控制台窗口超出屏幕?

标签 c++ windows winapi console

如果控制台应用程序启动并且系统为它创建控制台窗口,但有时这个窗口是在这样的坐标中创建的,它的一些内容会滑出右屏幕边缘。然后用户必须使用鼠标来显示所有内容。

如何应对? 什么功能用于检测控制台窗口的右上角坐标? 然后我将能够检查它是否在屏幕之外并将窗口移动到所需的距离。

移动窗口用什么函数? 或者也许有一种解决方案可以防止窗口移出屏幕?

最佳答案

这是一个完全支持多显示器和任务栏的实现,它可以按照您的描述进行操作。

#include <Windows.h>

int main()
{
  ClampConsoleToScreen();
  return 0;
}

void ClampConsoleToScreen()
{
  HWND window = GetConsoleWindow();
  RECT windowRect;
  GetWindowRect(window, &windowRect);
  HMONITOR monitor = MonitorFromWindow(window, MONITOR_DEFAULTTOPRIMARY);
  MONITORINFO mi;
  memset(&mi, 0, sizeof(mi));
  mi.cbSize = sizeof(mi);
  GetMonitorInfo(monitor, &mi);

  int adj, any;

  adj = 0;
  any = 0;
  if (windowRect.right > mi.rcWork.right)
  {
    // Get negative adjustment value to move it left onto screen
    adj = mi.rcWork.right - windowRect.right;
  }
  if (windowRect.left < mi.rcWork.left)
  {
    // Get positive adjustment value to move it right onto screen
    adj = mi.rcWork.left - windowRect.left;
  }
  windowRect.left += adj;
  windowRect.right += adj;
  any |= adj;

  adj = 0;
  if (windowRect.bottom > mi.rcWork.bottom)
  {
    // Get negative adjustment value to move it up onto screen
    adj = mi.rcWork.bottom - windowRect.bottom;
  }
  if (windowRect.top < mi.rcWork.top)
  {
    // Get positive adjustment value to move it down onto screen
    adj = mi.rcWork.top - windowRect.top;
  }
  windowRect.top += adj;
  windowRect.bottom += adj;
  any |= adj;

  if (any)
  {
    MoveWindow(window,
      windowRect.left,
      windowRect.top,
      windowRect.right - windowRect.left,
      windowRect.bottom - windowRect.top, TRUE);
  }
}

关于c++ - 如何防止控制台窗口超出屏幕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10850377/

相关文章:

r - 命令行 - 适用于 Windows 的 Awk 命令

c++ - 定义 _HAS_TRADITIONAL_STL 以启用 STL 功能是否安全?

c - 为什么当前目录改变

c++ - 使用 EVR 直接使用 Media Foundation 显示相机设备捕获的帧

c++ - 我怎样才能在计算机上找到 MS Word 的版本?

c# - 如何在 C# 中调用 GetVirtualDiskInformation

c++ - Incredibuild 链接

c++ - 在 C++、结构或类中应该使用什么来创建链接列表

c++ - 英特尔线程构建模块性能不佳

c++ - 模板化类,如何表示为另一个类的成员变量而不使此类模板化