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