定位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(右)

当我从节点模块系统信息中获取信息时,我得到每个显示器的坐标如下:

我遇到的问题是,当通过 x 和 y 使用这些相同的值时,它们确实在每台显示器上设置了 window。但是当代码通过 SetParent 行时,坐标变得无关紧要,我得到以下结果:

如果我将 -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);

我对每个坐标进行了硬编码,这些坐标被相应地翻译并设置在相关的显示器上。