WPF最大化避免覆盖任务栏
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;就可以解决最大化避免覆盖任务栏的问题了。
WPF最大化避免覆盖任务栏的更多相关文章
- wpf 自定义窗口,最大化时覆盖任务栏解决方案
原文:wpf 自定义窗口,最大化时覆盖任务栏解决方案 相信很多人使用wpf时会选择自定义美观的窗口,因此会设置WindowStyle="None" 取消自带的标题栏.但这样使用 W ...
- 2句代码轻松实现WPF最大化不遮挡任务栏并且具有边框调节效果
原文:2句代码轻松实现WPF最大化不遮挡任务栏并且具有边框调节效果 相信刚入门的菜鸟跟我一样找遍了百度谷歌解决最大化遮挡任务栏的方法大多方法都是HOOK一大堆API声明 最近在敲代码的时候无意中发现有 ...
- [WPF疑难]避免窗口最大化时遮盖任务栏
原文 [WPF疑难]避免窗口最大化时遮盖任务栏 [WPF疑难]避免窗口最大化时遮盖任务栏 周银辉 WPF窗口最大化时有个很不好的现象是:如果窗口的WindowStyle被直接或间接地设置为None后( ...
- wpf 自定义窗口,最大化时不覆盖任务栏
相信很多人使用wpf时会选择自定义美观的窗口,因此会设置WindowStyle="None" 取消自带的标题栏.但这样使用 WindowState="Maximized& ...
- C# Winform WPF DeskBand 窗体嵌入任务栏,在任务栏显示文字
最近写了个小程序,用于将固态硬盘的写入量等信息显示在任务栏,最开始使用Windows API也可以实现,但是当任务栏托盘增加的时候,会被遮盖,最终采用了DeskBand来实现,填了很多坑. 参考的Gi ...
- 对话框窗口最大化盖住任务栏问题!OnGetMinMaxInfo,WM_GETMINMAXINFO
http://hi.baidu.com/csacer/item/37cd6ac2dec18d360831c6a7 在写程序时,如果包含了标题栏,但是没有包含最大化按钮或者最小话按钮,那么人工用Show ...
- 让view 覆盖导航栏
当我们想做一个弹出式菜单时,想将导航栏也一起盖住不显示的话,可以用如下语句实现: UIView* myView = /* 你自定义的view */; UIWindow* currentWindow = ...
- wpf textblock 会覆盖 button里面字体样式的解决方法 还有button的style覆盖。。datepicker里面的按钮的style
.(button使用contont写的时候) 当.button使用 <button.content><textBlock/></button.content>依然会 ...
- WPF 最大化最小化窗口
public static void FullOrMin(this Window window) { //如果是全屏,则最小化 if (win ...
随机推荐
- STS 3.6.4 SpringMVC 4.1.6 Hibernate 4.3.8 MySQL
开发环境: Java 1.8 Spring Tool Suite 3.6.4 Spring faramework 4.1.6 Hibernate 4.3.8 Maven 2.9 数据库是MySQL 5 ...
- 【前端统计图】echarts实现简单柱状图
图片.png <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...
- 记录一次mysql由5.6升级到5.7出现的异常---Expression #23 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'c.commentCount' which is not functionally dependent on columns in GROUP BY clause;
### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expre ...
- SQL中where语句不能使用直接跟在select后列的别名
由于select语句的执行顺序为: 1. from语句 2. where语句(结合条件) 3. start with语句 4. connect by语句 5. where语句 6. group by语 ...
- css3使用transform属性制作js弹性运动
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- 使用Fiddler对android应用抓包 专题
工作原理 先上个图 此图一目了然,可以看出fiddler在请求中所处的位置,我们就可以确定它能干些什么. WinInet(“Windows Internet”)API帮助程序员使用三个常见的Inter ...
- 高并发场景之RabbitMQ
高并发场景之RabbitMQ 上次我们介绍了在单机.集群下高并发场景可以选择的一些方案,传送门:高并发场景之一般解决方案 但是也发现了一些问题,比如集群下使用ConcurrentQueue或加锁都不能 ...
- database disk image is malformed解决方法
作者:朱金灿 来源:http://blog.csdn.net/clever101 在Hudson上终止一次Job的运行之后,Hudson在服务器上更新源码出现下图的错误: 查了下英文意思,大意是svn ...
- 西门子与三菱PLC报文比较
1.西门子和三菱的几个区别(上位只关心的通讯层面):1. 西门子PLC通讯端口固定102,但是可以连接多个PC端(客户端),三菱PLC通讯端口可以自定义,最多好像8个,但是每个端口只能连接一个客户端: ...
- TextView和EditText中添加图片(ImageSpan)
编辑框中加图片,以前一直以为很复杂,后来发现android有些类已经很好的实现了这些功能. 代码如下: [java] view plaincopy mSubjectDetailView = (Text ...