微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SetWindowPos 全屏镀铬

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?