定位Windows在WorkerW下
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 行时,坐标变得无关紧要,我得到以下结果:
Window 显示 1 显示在显示 3
Window 显示 2 显示在显示 1
Window 显示 3 不显示
如果我将 -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);
我对每个坐标进行了硬编码,这些坐标被相应地翻译并设置在相关的显示器上。
我正在尝试实现某些目标并出现意外行为,经过一天的研究,我怀疑这与客户端坐标和屏幕坐标之间的差异有关。但是本人是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 行时,坐标变得无关紧要,我得到以下结果:
Window 显示 1 显示在显示 3
Window 显示 2 显示在显示 1
Window 显示 3 不显示
如果我将 -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);
我对每个坐标进行了硬编码,这些坐标被相应地翻译并设置在相关的显示器上。