[英]Positioning Windows under WorkerW
我正在尝试实现某些目标并出现意外行为,经过一天的研究,我怀疑这与客户端坐标和屏幕坐标之间的差异有关。 但我来自 web 背景,对 C++ 的理解和经验非常有限。
所以下面是我想要工作的代码:
bool wallpaper::attach(Napi::Buffer<void *> handle, int x, int y) {
HWND target = static_cast<HWND>(*reinterpret_cast<void **>(handle.Data()));
HWND progman = FindWindowA("Progman", NULL);
LRESULT result = SendMessageTimeoutA(
progman,
0x052C,
NULL,
NULL,
SMTO_NORMAL,
1000,
NULL);
EnumWindows(&FindWorkerW, reinterpret_cast<LPARAM>(&workerw));
SetWindowPos(
target,
workerw,
x,
y,
NULL,
NULL,
SWP_NOSIZE
);
SetParent(target, workerw);
// ShowWindow(target, SW_SHOWMAXIMIZED);
return true;
}
我设置了三台显示器,每台显示器的分辨率为 1980x1080,水平相邻。 设置顺序如下:
显示器 3(左)
显示器 1(中)
显示器 2(右)
当我从节点模块系统信息中获取信息时,我得到每个显示器的坐标,如下所示:
显示 1 0, 0
显示 2 1920, 0
显示 3 -1920, 0
我遇到的问题是,当通过 x 和 y 使用这些相同的值时,它们确实在每个监视器上设置了 window。 但是当代码通过 SetParent 行时,坐标变得无关紧要,我得到以下结果:
显示器 1 的 Window 显示在显示器 3 上
显示器 2 的 Window 在显示器 1 上显示
显示器 3 的 Window 不显示
如果虽然我将 -1920 值硬编码为 3840,但它确实在显示器 2 上显示了显示器 3 的 Window。
我已经阅读并看到了以下方法,ClientToScreen、ScreenToClient、MapWindowPoints。 但我无法确切了解如何为我的用例调整这些。
如果有人愿意向我提示正确的方向(我读到了客户端和屏幕坐标之间的差异,但我仍然不理解它,并且 ClientToScreen 方法返回的值等都是 LONG 格式)。
在花了一天时间阅读并尝试理解 C++ 概念和 Windows 提供的功能之后,下面的代码对我有用
POINT pt = {};
pt.x = 0;
pt.y = 0;
SetParent(hwnd, workerw);
ScreenToClient(workerw, &pt);
SetWindowPos(hwnd, HWND_TOP, pt.x, pt.y, NULL, NULL, SWP_NOSIZE);
我确实对每个坐标进行了硬编码,这些坐标正在相应地翻译并设置在相关显示器上。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.