Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#WPF在任务栏高度更改时自动调整窗口大小_Wpf_Maximize Window - Fatal编程技术网

C#WPF在任务栏高度更改时自动调整窗口大小

C#WPF在任务栏高度更改时自动调整窗口大小,wpf,maximize-window,Wpf,Maximize Window,我有一个WPF窗口,它具有以下属性: -ResizeMode=NoResize -WindowStyle=None 我制作了普通窗口的所有功能,但我不知道如何在任务栏高度改变时使窗口自动调整大小(当它最大化时)。(如Microsoft Visual Studio 2017窗口) 我可以手动最大化我的窗口,但若我隐藏任务栏,我的窗口和屏幕底部之间会有一个空白 工作区域发生变化时是否触发任何事件 处理窗口的WM_GETMINMAXINFO消息,并执行任何需要重新调整大小的操作 public

我有一个WPF窗口,它具有以下属性:

-ResizeMode=NoResize

-WindowStyle=None

我制作了普通窗口的所有功能,但我不知道如何在任务栏高度改变时使窗口自动调整大小(当它最大化时)。(如Microsoft Visual Studio 2017窗口)

我可以手动最大化我的窗口,但若我隐藏任务栏,我的窗口和屏幕底部之间会有一个空白


工作区域发生变化时是否触发任何事件

处理窗口的WM_GETMINMAXINFO消息,并执行任何需要重新调整大小的操作

    public MainWindow()
    {
        InitializeComponent();
        SourceInitialized += new EventHandler(win_SourceInitialized);
    }

    private void win_SourceInitialized(object sender, EventArgs e)
    {
        System.IntPtr handle = (new WinInterop.WindowInteropHelper(this)).Handle;
        WinInterop.HwndSource.FromHwnd(handle).AddHook(new WinInterop.HwndSourceHook(WindowProc));
    }

    private const int WM_GETMINMAXINFO = 0x0024;
    private static System.IntPtr WindowProc(
          System.IntPtr hwnd,
          int msg,
          System.IntPtr wParam,
          System.IntPtr lParam,
          ref bool handled)
    {
        switch (msg)
        {
            case WM_GETMINMAXINFO: //https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-getminmaxinfo
                WmGetMinMaxInfo(hwnd, lParam); // <------  Do what you need to here   ---------->
                handled = true;
                break;
        }

        return (System.IntPtr)0;
    }
public主窗口()
{
初始化组件();
SourceInitialized+=新事件处理程序(win_SourceInitialized);
}
私有void win_SourceInitialized(对象发送方,事件参数e)
{
System.IntPtr handle=(新的WinInterop.WindowInteropHelper(this)).handle;
WinInterop.HwndSource.FromHwnd(handle.AddHook)(新的WinInterop.HwndSourceHook(WindowProc));
}
私有常量int WM_GETMINMAXINFO=0x0024;
专用静态系统.IntPtr WindowProc(
System.IntPtr hwnd,
int msg,
System.IntPtr wParam,
System.IntPtr LPRAM,
参考文件(已处理)
{
开关(msg)
{
案例WM_GETMINMAXINFO://https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-getminmaxinfo
WmGetMinMaxInfo(hwnd,lParam);//
已处理=正确;
打破
}
返回(System.IntPtr)0;
}
请注意,如果您是一个无边界、不可调整大小的窗口,则可能还需要获取监视器信息(通过Win32 GetMonitorInfo),并将应用程序限制在其所在监视器的工作区域内。在我们的系统上,windows无法正确调整1900x1200监视器的窗口大小(这使它太高了,因此我们必须根据监视器信息设置MaxHeight,并注意如果通过继续观看WM_GETMINMAXINFO消息来调整任务栏的大小,则会改变MaxHeight)

如果您也有这些问题,本博客可能会对此有所帮助:


为您的窗口处理WM_GETMINMAXINFO消息,并执行任何需要重新调整大小的操作

    public MainWindow()
    {
        InitializeComponent();
        SourceInitialized += new EventHandler(win_SourceInitialized);
    }

    private void win_SourceInitialized(object sender, EventArgs e)
    {
        System.IntPtr handle = (new WinInterop.WindowInteropHelper(this)).Handle;
        WinInterop.HwndSource.FromHwnd(handle).AddHook(new WinInterop.HwndSourceHook(WindowProc));
    }

    private const int WM_GETMINMAXINFO = 0x0024;
    private static System.IntPtr WindowProc(
          System.IntPtr hwnd,
          int msg,
          System.IntPtr wParam,
          System.IntPtr lParam,
          ref bool handled)
    {
        switch (msg)
        {
            case WM_GETMINMAXINFO: //https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-getminmaxinfo
                WmGetMinMaxInfo(hwnd, lParam); // <------  Do what you need to here   ---------->
                handled = true;
                break;
        }

        return (System.IntPtr)0;
    }
public主窗口()
{
初始化组件();
SourceInitialized+=新事件处理程序(win_SourceInitialized);
}
私有void win_SourceInitialized(对象发送方,事件参数e)
{
System.IntPtr handle=(新的WinInterop.WindowInteropHelper(this)).handle;
WinInterop.HwndSource.FromHwnd(handle.AddHook)(新的WinInterop.HwndSourceHook(WindowProc));
}
私有常量int WM_GETMINMAXINFO=0x0024;
专用静态系统.IntPtr WindowProc(
System.IntPtr hwnd,
int msg,
System.IntPtr wParam,
System.IntPtr LPRAM,
参考文件(已处理)
{
开关(msg)
{
案例WM_GETMINMAXINFO://https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-getminmaxinfo
WmGetMinMaxInfo(hwnd,lParam);//
已处理=正确;
打破
}
返回(System.IntPtr)0;
}
请注意,如果您是一个无边界、不可调整大小的窗口,则可能还需要获取监视器信息(通过Win32 GetMonitorInfo),并将应用程序限制在其所在监视器的工作区域内。在我们的系统上,windows无法正确调整1900x1200监视器的窗口大小(这使它太高了,因此我们必须根据监视器信息设置MaxHeight,并注意如果通过继续观看WM_GETMINMAXINFO消息来调整任务栏的大小,则会改变MaxHeight)

如果您也有这些问题,本博客可能会对此有所帮助: