博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF最大化避免覆盖任务栏
阅读量:4709 次
发布时间:2019-06-10

本文共 3873 字,大约阅读时间需要 12 分钟。

原文:

WPF当窗体WindowStyle=”None”时,最大化会覆盖掉任务栏。如何解决这个问题呢?

我在Google里面搜到一篇文章,要用到Win32 API,通过让WPF窗体WM_GETMINMAXINFO消息挂接一个钩子来处理。

 

 public static void RepairWindowBehavior(Window wpfWindow)

    
{
        
if
(wpfWindow ==
null
)
            
return
;
  
        
wpfWindow.SourceInitialized +=
delegate
        
{
            
IntPtr handle = (
new
WindowInteropHelper(wpfWindow)).Handle;
            
HwndSource source = HwndSource.FromHwnd(handle);
            
if
(source !=
null
)
            
{
                
source.AddHook(WindowProc);
            
}
        
};
    
}
  
    
private
static
IntPtr WindowProc(IntPtr hwnd,
int
msg, IntPtr wParam, IntPtr lParam,
ref
bool
handled)
    
{
        
switch
(msg)
        
{
            
case
0x0024:
                
WmGetMinMaxInfo(hwnd, lParam);
                
handled =
true
;
                
break
;
        
}
  
        
return
(IntPtr)0;
    
}
  
    
private
static
void
WmGetMinMaxInfo(IntPtr hwnd, IntPtr lParam)
    
{
        
MINMAXINFO mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam,
typeof
(MINMAXINFO));
  
        
int
MONITOR_DEFAULTTONEAREST = 0x00000002;
        
IntPtr monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
  
        
if
(monitor != IntPtr.Zero)
        
{
            
MONITORINFO monitorInfo =
new
MONITORINFO();
            
GetMonitorInfo(monitor, 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);
        
}
  
        
Marshal.StructureToPtr(mmi, lParam,
true
);
    
}
  
    
[DllImport(
"user32"
)]
    
internal
static
extern
bool
GetMonitorInfo(IntPtr hMonitor, MONITORINFO lpmi);
    
[DllImport(
"User32"
)]
    
internal
static
extern
IntPtr MonitorFromWindow(IntPtr handle,
int
flags);
  
    
#region Nested type: MINMAXINFO
    
[StructLayout(LayoutKind.Sequential)]
    
internal
struct
MINMAXINFO
    
{
        
public
POINT ptReserved;
        
public
POINT ptMaxSize;
        
public
POINT ptMaxPosition;
        
public
POINT ptMinTrackSize;
        
public
POINT ptMaxTrackSize;
    
}
    
#endregion
  
    
#region Nested type: MONITORINFO
    
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    
internal
class
MONITORINFO
    
{
        
public
int
cbSize = Marshal.SizeOf(
typeof
(MONITORINFO));
        
public
RECT rcMonitor;
        
public
RECT rcWork;
        
public
int
dwFlags;
    
}
    
#endregion
  
    
#region Nested type: POINT
    
[StructLayout(LayoutKind.Sequential)]
    
internal
struct
POINT
    
{
        
public
int
x;
        
public
int
y;
        
public
POINT(
int
x,
int
y)
        
{
            
this
.x = x;
            
this
.y = y;
        
}
    
}
    
#endregion
  
    
#region Nested type: RECT
    
[StructLayout(LayoutKind.Sequential, Pack = 0)]
    
internal
struct
RECT
    
{
        
public
int
left;
        
public
int
top;
        
public
int
right;
        
public
int
bottom;
  
        
public
static
readonly
RECT Empty;
  
        
public
int
Width
        
{
            
get
{
return
Math.Abs(right - left); }
        
}
        
public
int
Height
        
{
            
get
{
return
bottom - top; }
        
}
  
        
public
RECT(
int
left,
int
top,
int
right,
int
bottom)
        
{
            
this
.left = left;
            
this
.top = top;
            
this
.right = right;
            
this
.bottom = bottom;
        
}
  
        
public
RECT(RECT rcSrc)
        
{
            
left = rcSrc.left;
            
top = rcSrc.top;
            
right = rcSrc.right;
            
bottom = rcSrc.bottom;
        
}
  
        
public
bool
IsEmpty
        
{
            
get
            
{
                
return
left >= right || top >= bottom;
            
}
        
}
  
        
public
override
string
ToString()
        
{
            
if
(
this
== Empty)
            
{
                
return
"RECT {Empty}"
;
            
}
            
return
"RECT { left : "
+ left +
" / top : "
+ top +
" / right : "
+ right +
" / bottom : "
+ bottom +
" }"
;
        
}
  
        
public
override
bool
Equals(
object
obj)
        
{
            
if
(!(obj
is
Rect))
            
{
                
return
false
;
            
}
            
return
(
this
== (RECT)obj);
        
}
  
        
public
override
int
GetHashCode()
        
{
            
return
left.GetHashCode() + top.GetHashCode() + right.GetHashCode() + bottom.GetHashCode();
        
}
  
        
public
static
bool
operator
==(RECT rect1, RECT rect2)
        
{
            
return
(rect1.left == rect2.left && rect1.top == rect2.top && rect1.right == rect2.right && rect1.bottom == rect2.bottom);
        
}
  
        
public
static
bool
operator
!=(RECT rect1, RECT rect2)
        
{
            
return
!(rect1 == rect2);
        
}
    
}
    
#endregion
}

通过调用WindowHelper.RepairWindowBehavior(Window)方法注册Win32消息事件,以后调用this.WindowState = WindowState.Maximized;就可以解决最大化避免覆盖任务栏的问题了。

posted on
2018-06-14 17:16 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lonelyxmas/p/9183996.html

你可能感兴趣的文章
dcm4chee 修改默认(0002,0013) ImplementationVersionName
查看>>
maven3在eclipse3.4.2中创建java web项目
查看>>
Building Tablet PC Applications ROB JARRETT
查看>>
Adobe® Reader®.插件开发
查看>>
【POJ 3461】Oulipo
查看>>
Alpha 冲刺 (5/10)
查看>>
使用Siege进行WEB压力测试
查看>>
斑马为什么有条纹?
查看>>
android多层树形结构列表学习笔记
查看>>
Android_去掉EditText控件周围橙色高亮区域
查看>>
《构建之法》第一、二、十六章阅读笔记
查看>>
Git Stash用法
查看>>
sql server 2008学习8 sql server存储和索引结构
查看>>
Jquery radio选中
查看>>
memcached 细究(三)
查看>>
IT常用单词
查看>>
拓扑排序
查看>>
NYOJ--32--SEARCH--组合数
查看>>
gulpfile 压缩模板
查看>>
【34.14%】【BZOJ 3110】 [Zjoi2013]K大数查询
查看>>