【问题标题】:How to get the desktop Rect while using ATL?使用 ATL 时如何获取桌面 Rect?
【发布时间】:2017-11-06 17:17:23
【问题描述】:

我想从对话框中获取整个桌面的 Rect,而 ATL 已将 GetWindowRect(HWND hWnd, LPRECT lpRect) 覆盖为 GetWindowRect(LPRECT lpRect) 并假定当前对话框窗口,因此它只是用自己的尺寸填充 lpRect

如何获取桌面窗口的 Rect?我尝试使用GetDesktopWindow(),但它返回一个HWND,我仍然无法从中找到矩形。

【问题讨论】:

    标签: c++ atl


    【解决方案1】:

    对于初学者,如果您想绕过 ATL 的 CWindow::GetWindowRect(LPRECT) 成员,可以使用 ::GetWindowRect(hWnd, lpRect);

    桌面不一定是矩形的,因为您的系统可能是多显示器。


    (来源:s-msft.com

    如果忽略多显示器方面,可以使用 GetSystemMetrics(SM_CXSCREEN) + GetSystemMetrics(SM_CYSCREEN)(或GetSystemMetrics(SM_CXVIRTUALSCREEN) + GetSystemMetrics(SM_CYVIRTUALSCREEN))或SystemParametersInfo(SPI_GETWORKAREA, ...) API。 ATL 不提供任何快捷方式,这些必须是直接 API 调用。

    使用多显示器系统,您可以enumerate monitors 并为每个枚举的显示器获得一个工作区。它们共同构成桌面:

    要枚举计算机上的所有设备,请调用EnumDisplayDevices 函数。返回的信息还指示哪个监视器是桌面的一部分。

    【讨论】:

      【解决方案2】:

      我在the MSDN page of CWindow 上找到了这个 sn-p,它似乎可以满足您的要求:

      HWND hWnd  = ::GetDesktopWindow();
      CWindow myWindow;
      myWindow.Attach(hWnd);
      

      在这之后,你应该可以使用

      myWindow.GetWindowRect(lpRect)
      

      【讨论】:

        猜你喜欢
        • 2016-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多