单击任务栏图标wpf时,在辅助监视器上正确调整大小

我有一个wpf应用程序,并使用WmGetMinMaxInfo管理最大大小:

private static void WmGetMinMaxInfo(IntPtr hwnd, IntPtr lParam)
{
    MINMAXINFO mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO));
    IntPtr monitorContainingApplication = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);

    if (monitorContainingApplication != System.IntPtr.Zero)
    {
        MONITORINFO monitorInfo = new MONITORINFO();
        GetMonitorInfo(monitorContainingApplication, monitorInfo);
        RECT rcWorkArea = monitorInfo.rcWork;
        RECT rcMonitorArea = monitorInfo.rcMonitor;

        mmi.ptMaxPosition.x = Math.Abs(rcWorkArea.left - rcMonitorArea.left);
        mmi.ptMaxPosition.y = Math.Abs(rcWorkArea.top - rcMonitorArea.top);

        mmi.ptMaxSize.x = Math.Abs(rcWorkArea.right - rcWorkArea.left);
        mmi.ptMaxSize.y = Math.Abs(rcWorkArea.bottom - rcWorkArea.top);

        mmi.ptMaxTrackSize.x = mmi.ptMaxSize.x;
        mmi.ptMaxTrackSize.y = mmi.ptMaxSize.y;
        
    }

    Marshal.StructureToPtr(mmi, lParam, true);
}

我的窗口设置为:

WindowStyle="None"
ResizeMode="CanResizeWithGrip" 
AllowsTransparency="True"

当我在最大化状态下最小化应用程序时,以及在任务栏图标上单击返回以返回到最大化窗口应用程序时,我遇到了一个奇怪的问题。

它不采用全屏显示,而是采用主屏幕分辨率。当我在主屏幕和辅助屏幕之间没有相同的分辨率时,我遇到了这种情况(很明显,我的辅助屏幕比第一个屏幕大)。

您有什么想法吗?Windows功能 ?有没有解决的办法?

解决方案:我已经解决了我的问题,即在最小化windowState时不重新计算Kethernet的想法。谢谢 !

private static void WmGetMinMaxInfo(IntPtr hwnd, IntPtr lParam)
{
    MINMAXINFO mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO));
    IntPtr monitorContainingApplication = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);

    if (monitorContainingApplication != System.IntPtr.Zero)
    {
        MONITORINFO monitorInfo = new MONITORINFO();
        GetMonitorInfo(monitorContainingApplication, monitorInfo);
        RECT rcWorkArea = monitorInfo.rcWork;
        RECT rcMonitorArea = monitorInfo.rcMonitor;

        if (Application.Current.MainWindow.WindowState != WindowState.Minimized)
        {
            mmi.ptMaxPosition.x = Math.Abs(rcWorkArea.left - rcMonitorArea.left);
            mmi.ptMaxPosition.y = Math.Abs(rcWorkArea.top - rcMonitorArea.top);

            mmi.ptMaxSize.x = Math.Abs(rcWorkArea.right - rcWorkArea.left);
            mmi.ptMaxSize.y = Math.Abs(rcWorkArea.bottom - rcWorkArea.top);

            mmi.ptMaxTrackSize.x = mmi.ptMaxSize.x;
            mmi.ptMaxTrackSize.y = mmi.ptMaxSize.y;
            lastGoodMaxTrackSize = mmi.ptMaxTrackSize;
            lastGoodMaxPosition = mmi.ptMaxPosition;
            lastGoodMaxSize = mmi.ptMaxSize;
        }
        else
        {
            mmi.ptMaxPosition = lastGoodMaxPosition;
            mmi.ptMaxSize = lastGoodMaxSize;
            mmi.ptMaxTrackSize = lastGoodMaxTrackSize;
        }
        mmi = AdjustWorkingAreaForAutoHide(monitorContainingApplication, mmi);
    }

    Marshal.StructureToPtr(mmi, lParam, true);
}
凯瑟网

我有一个多年以前编写的自定义窗口控件。它仍在积极使用。无论Windows处于哪个显示以及各个DPI是什么,都可以正确处理Windows。

这是我对的实现WmGetMinMaxInfo

我希望这是有帮助的。

private void WmGetMinMaxInfo(IntPtr hwnd, IntPtr lParam)
{
    var mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO));
    var hMonitor = Win32.MonitorFromWindow(hwnd, 1);
    
    if (hMonitor != IntPtr.Zero)
    {
        var monitorInfo = new Win32.MONITORINFO();
        
        Win32.GetMonitorInfo(hMonitor, monitorInfo);
        
        var rcWorkArea = monitorInfo.rcWork;
        var rcMonitorArea = monitorInfo.rcMonitor;
        
        mmi.ptMaxPosition.x = Math.Abs(rcWorkArea.Left - rcMonitorArea.Left);
        mmi.ptMaxPosition.y = Math.Abs(rcWorkArea.Top - rcMonitorArea.Top);
        
        mmi.ptMaxSize.x = Math.Abs(rcWorkArea.Right - rcWorkArea.Left);
        mmi.ptMaxSize.y = Math.Abs(rcWorkArea.Bottom - rcWorkArea.Top);
        
        mmi.ptMinTrackSize.x = (int)(minWidth * hidpiX);
        mmi.ptMinTrackSize.y = (int)(minHeight * hidpiY);

        var window = (Window)HwndSource.FromHwnd(hwnd)?.RootVisual;

        if (window != null)
        {
            if (window.WindowState != WindowState.Minimized)
            {
                mmi.ptMaxTrackSize.x = Win32.GetSystemMetrics(Win32.SystemMetric.SM_CXVIRTUALSCREEN);
                mmi.ptMaxTrackSize.y = Win32.GetSystemMetrics(Win32.SystemMetric.SM_CYVIRTUALSCREEN);
                
                lastGoodMaxTrackSize = mmi.ptMaxTrackSize;
            }
            else if (lastGoodMaxTrackSize.x > 0 && lastGoodMaxTrackSize.y > 0)
            {
                mmi.ptMaxTrackSize = lastGoodMaxTrackSize;
            }
        }
    
        mmi = AdjustWorkingAreaForAutoHide(hMonitor, mmi);
    }

    Marshal.StructureToPtr(mmi, lParam, true);
}

对于hidpiX和hidpiY,我将它们放在OnSourceInitialized事件处理程序中

private void OnSourceInitialized(object sender, EventArgs e)
{
    ...

    var source = PresentationSource.FromVisual((Visual)sender);

    if (source == null) return;

    // Get the X and Y HiDPI factors from the media matrix
    if (source.CompositionTarget != null)
    {
        hidpiX = source.CompositionTarget.TransformToDevice.M11;
        hidpiY = source.CompositionTarget.TransformToDevice.M22;
    }

    ...
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我的任务栏不显示在辅助监视器上?

来自分类Dev

在任务栏上为每个监视器显示相应的图标

来自分类Dev

Windows 10辅助监视器任务栏未隐藏

来自分类Dev

使用任务分组将任务栏放在多台监视器上的实用程序?

来自分类Dev

Windows中任务栏的网络监视器

来自分类Dev

UNIX-多监视器任务栏

来自分类Dev

使用鼠标滚轮在具有多个监视器的任务栏上更改音量

来自分类Dev

如何将任务栏移动到Linux Mint上的其他监视器?

来自分类Dev

仅在DisplayFusion中重新启用一台监视器上的任务栏

来自分类Dev

最大化的窗口位于KDE上带有双监视器的垂直任务栏下

来自分类Dev

最大化的窗口位于KDE上带有双监视器的垂直任务栏下

来自分类Dev

单击任务栏上的图标时,如何使Form1出现/消失?

来自分类Dev

无法在Windows 10上右键单击任务栏图标

来自分类Dev

无法右键单击任务栏上的Windows图标

来自分类Dev

始终在任务栏中显示Windows CPU监视器图形

来自分类Dev

Windows 10:主监视器任务栏未隐藏

来自分类Dev

是否可以在两个监视器之间扩展任务栏?

来自分类Dev

如何在Windows 10中将任务栏移动到默认监视器?

来自分类Dev

多个监视器窗口与一个任务栏重叠

来自分类Dev

如何在任务栏中获取 HDD 运行状态 LED 监视器

来自分类Dev

辅助监视器上的显示窗口

来自分类Dev

辅助监视器上的显示窗口

来自分类Dev

我有4台显示器连接正在运行的窗口。寻求任务栏的实用程序/ mod仅显示在2个监视器上,而不显示在所有4个监视器上

来自分类Dev

从任务栏隐藏Windows应用程序,同时仍在第二个监视器上打开它

来自分类Dev

当我单击任务栏上的图标时,聚焦窗口不会最小化(Windows 10)

来自分类Dev

任务栏上的UWP应用图标

来自分类Dev

如何使任务栏图标的大小与Windows 8上的大小相同?

来自分类Dev

带有垂直任务栏的Windows 8.1多监视器安装程序在跨边界移动时会抓住鼠标

来自分类Dev

有没有办法将任务栏移动到另一台监视器?

Related 相关文章

  1. 1

    为什么我的任务栏不显示在辅助监视器上?

  2. 2

    在任务栏上为每个监视器显示相应的图标

  3. 3

    Windows 10辅助监视器任务栏未隐藏

  4. 4

    使用任务分组将任务栏放在多台监视器上的实用程序?

  5. 5

    Windows中任务栏的网络监视器

  6. 6

    UNIX-多监视器任务栏

  7. 7

    使用鼠标滚轮在具有多个监视器的任务栏上更改音量

  8. 8

    如何将任务栏移动到Linux Mint上的其他监视器?

  9. 9

    仅在DisplayFusion中重新启用一台监视器上的任务栏

  10. 10

    最大化的窗口位于KDE上带有双监视器的垂直任务栏下

  11. 11

    最大化的窗口位于KDE上带有双监视器的垂直任务栏下

  12. 12

    单击任务栏上的图标时,如何使Form1出现/消失?

  13. 13

    无法在Windows 10上右键单击任务栏图标

  14. 14

    无法右键单击任务栏上的Windows图标

  15. 15

    始终在任务栏中显示Windows CPU监视器图形

  16. 16

    Windows 10:主监视器任务栏未隐藏

  17. 17

    是否可以在两个监视器之间扩展任务栏?

  18. 18

    如何在Windows 10中将任务栏移动到默认监视器?

  19. 19

    多个监视器窗口与一个任务栏重叠

  20. 20

    如何在任务栏中获取 HDD 运行状态 LED 监视器

  21. 21

    辅助监视器上的显示窗口

  22. 22

    辅助监视器上的显示窗口

  23. 23

    我有4台显示器连接正在运行的窗口。寻求任务栏的实用程序/ mod仅显示在2个监视器上,而不显示在所有4个监视器上

  24. 24

    从任务栏隐藏Windows应用程序,同时仍在第二个监视器上打开它

  25. 25

    当我单击任务栏上的图标时,聚焦窗口不会最小化(Windows 10)

  26. 26

    任务栏上的UWP应用图标

  27. 27

    如何使任务栏图标的大小与Windows 8上的大小相同?

  28. 28

    带有垂直任务栏的Windows 8.1多监视器安装程序在跨边界移动时会抓住鼠标

  29. 29

    有没有办法将任务栏移动到另一台监视器?

热门标签

归档