簡體   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