将一个窗口移动到第二个屏幕后,当我最小化同一个窗口并再次重新打开它时,它会回到第一个监视器



标题几乎解释了这一切。在使用MoveWindow功能后,窗口确实会转到第二个监视器,在最小化应用程序并再次打开后,窗口会重新出现在第一个屏幕上。我猜有一个功能可以对窗口说,窗口现在在第二个屏幕上,而不是第一个屏幕,但我似乎找不到它。

RECT applicationRect;
HWND applicationHWND;
applicationHWND = GetForegroundWindow();
GetWindowRect(applicationHWND, &applicationRect);
const int width = abs( abs(applicationRect.right) - abs(applicationRect.left) );
const int height = abs( abs(applicationRect.bottom) - abs(applicationRect.top) );
short screen = 0;
if(applicationRect.left < -8){//Posible left screen
if(abs(applicationRect.left) > abs(applicationRect.right))screen = 1;
else screen = 0;
}
const int newleft = (screen == 0)*(applicationRect.left - 1920) + (screen == 1)*(applicationRect.left + 1920);
MoveWindow(applicationHWND, newleft, applicationRect.top, width, height, false);

这是将窗口移动到另一个屏幕的功能。

现在我可以重现它,当目标窗口最大化时就会发生这种情况。在这种情况下,MoveWindow不能改变正常位置值(即WINDOWPLACEMENT.rcNormalPosition(。当窗口恢复到最大值时,将根据该值进行恢复(在哪个监视器中检测(。您需要先检查窗口是否最大化,然后调用SetWindowPlacement来更改此位置。除了最大化窗口外,还可以使用SetWindowPlacement而不是MoveWindow

#include <windows.h>
#include <iostream>
int main()
{
RECT applicationRect;
HWND applicationHWND;
BOOL ret = 0;
applicationHWND = GetForegroundWindow();
GetWindowRect(applicationHWND, &applicationRect);
const int width = abs(abs(applicationRect.right) - abs(applicationRect.left));
const int height = abs(abs(applicationRect.bottom) - abs(applicationRect.top));
short screen = 0;
if (applicationRect.left < -8) {//Posible left screen
if (abs(applicationRect.left) > abs(applicationRect.right))screen = 1;
else screen = 0;
}
const int newleft = (screen == 0) * (applicationRect.left - 1920) + (screen == 1) * (applicationRect.left + 1920);
WINDOWPLACEMENT place = {};
place.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(applicationHWND, &place);
if (place.showCmd == SW_SHOWMAXIMIZED)
{
MoveWindow(applicationHWND, newleft, applicationRect.top, width, height, false);
}
place.rcNormalPosition.left = (screen == 0) * (place.rcNormalPosition.left - 1920) + (screen == 1) * (place.rcNormalPosition.left + 1920);
place.rcNormalPosition.right = (screen == 0) * (place.rcNormalPosition.right - 1920) + (screen == 1) * (place.rcNormalPosition.right + 1920);
place.flags |= WPF_ASYNCWINDOWPLACEMENT;
ret = SetWindowPlacement(applicationHWND, &place);
}

最新更新