繁体   English   中英

WorkerW下定位Windows

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM