【问题标题】:How prevent console window from extending beyond screen?如何防止控制台窗口超出屏幕?
【发布时间】:2012-06-06 16:48:51
【问题描述】:

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

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

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

【问题讨论】:

  • 你不能只使用 GetConsoleWindow() 吗?
  • 您的应用程序是如何启动的?快捷方式/api?

标签: c++ windows winapi console


【解决方案1】:

这是一个完全多显示器感知和任务栏感知的实现,可以满足您的描述。

#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);
  }
}

【讨论】:

  • 在实现时,它不会尝试调整大小以保持“在监视器内”约束,如果宽度或高度过大,左上角将获胜。如果需要,添加宽度/高度调整非常简单。
  • 它找到离当前控制台窗口位置最近的监视器,如果窗口完全离开所有屏幕,则选择主监视器。获取该显示器的工作区域(工作区域不包括任务栏,即使它在顶部等)并调整工作区域每个边缘的窗口位置,将显示器完全推入工作区域,顶部和左侧边缘获胜冲突。
猜你喜欢
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多