如何解决SetWindowPos 全屏镀铬
我想将任何窗口移动到任何给定的屏幕,保持窗口状态和大小,使其成为前景窗口。
相关代码如下:
public override void MovetoScreen(string screenName) {
Screen screen = Screen.AllScreens.FirstOrDefault((s) => s.DeviceName.Equals(screenName));
if (screen == null)
return;
List<IntPtr> hwnds = // get hwnds
foreach (IntPtr hwnd in hwnds) {
if (!NativeMethods.IsWindowVisible(hwnd))
continue;
// if the window has no area continue
NativeMethods.GetwindowRect(hwnd,out NativeStructs.RECT rect);
if (this.GetArea(rect) == 0)
continue;
string title = NativeMethods.GetwindowTitle(hwnd);
if (string.IsNullOrEmpty(title))
continue;
this.ShowWindow(hwnd,screen);
}
}
private void ShowWindow(IntPtr hwnd,Screen screen) {
// if the window is minimized,restore its actual state the get the correct window-rect
long style = NativeMethods.getwindowlong(hwnd,NativeDeFinitions.GWL_STYLE);
bool minimized = (style & NativeDeFinitions.WS_MINIMIZE) == NativeDeFinitions.WS_MINIMIZE;
if (minimized)
NativeMethods.ShowWindow(hwnd,NativeDeFinitions.SW_RESTORE);
// Remove fullscreen mode if set
style = NativeMethods.getwindowlong(hwnd,NativeDeFinitions.GWL_STYLE);
bool fullscreen = (style & NativeDeFinitions.WS_OVERLAPPEDWINDOW) != NativeDeFinitions.WS_OVERLAPPEDWINDOW;
if (fullscreen)
NativeMethods.SetwindowLong(hwnd,NativeDeFinitions.GWL_STYLE,style | NativeDeFinitions.WS_OVERLAPPEDWINDOW);
// Make window normal if maximized to move it
style = NativeMethods.getwindowlong(hwnd,NativeDeFinitions.GWL_STYLE);
bool maximized = (style & NativeDeFinitions.WS_MAXIMIZE) == NativeDeFinitions.WS_MAXIMIZE;
if (maximized)
NativeMethods.ShowWindow(hwnd,NativeDeFinitions.SW_RESTORE);
// set window position. Remain relative screen position.
this.GetScreenPos(hwnd,out int x,out int y);
NativeMethods.SetwindowPos(
hwnd,IntPtr.Zero,screen.Bounds.X + x,screen.Bounds.Y + y,NativeDeFinitions.SWP_NOZORDER | NativeDeFinitions.SWP_NOOWNERZORDER | NativeDeFinitions.SWP_NOSIZE | NativeDeFinitions.SWP_FRAMECHANGED
);
// make window maximized again after move
if (maximized)
NativeMethods.ShowWindow(hwnd,NativeDeFinitions.SW_MAXIMIZE);
// Restore fullscreen mode if it was set.
if (fullscreen)
NativeMethods.SetwindowLong(hwnd,style & ~NativeDeFinitions.WS_OVERLAPPEDWINDOW);
NativeMethods.SetForegroundWindow(hwnd);
}
问题是chrome浏览器的窗口在全屏模式(F11或Youtube-Fullscreen)下不移动,它只改变窗口状态并保持在同一位置。其他浏览器(Edge、Firefox、Opera)可以移动,但退出全屏模式时会返回原始屏幕。
我错过了什么吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。