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