WPF全局隐藏鼠标 Jun, 2015
前些日子使用WPF实现了一个填平两个屏幕间缝隙的小程序,在那里面需要让光标在两个屏幕间的时候将其隐藏。
在一个程序内部隐藏鼠标很容易,在WPF中只需设置Mouse.OverrideCursor = Cursors.None
。
但是当程序最小化后鼠标还能隐藏着实费了一番功夫。
大致有如下几种思路。
-
将系统的光标图标设置为一个blank.cur的空图标,要显示时再替换回来,这样就可以全局隐藏鼠标,具体方法可以看这里。 但是这种方法有一些问题,一个是需要将系统所有状态的光标图标都替换为空图标,十分繁琐; 而且非常危险,因为一旦你的程序在隐藏鼠标时崩溃,那么鼠标就消失了! 只有重启才能重新显示鼠标。
-
要隐藏鼠标时将鼠标的位置一直设置在右下角。 这样虽然看不见鼠标了,但是有时会触发侧边栏,尤其是Win8的右边栏; 同时无法知道用户此时已经将光标移动到哪里了,因此也不是非常好用。
-
最后终于找到了一种十分讨巧的方法。 就是在要隐藏光标的范围内新建一个透明窗口,然后在这个窗口上将光标隐藏。 大致代码如下:
Window cursorWin;
private void cursorWinInit()
{
cursorWin = new Window();
cursorWin.Left = bound - (W + hideBuffer);
cursorWin.Top = 0;
cursorWin.Width = 2 * (W + hideBuffer);
cursorWin.Height = maxHeight;
cursorWin.ShowInTaskbar = false; //禁止在任务栏显示
cursorWin.WindowStyle = WindowStyle.None; //无边框
cursorWin.AllowsTransparency = true; //透明
cursorWin.Topmost = true; //置顶
cursorWin.Background = new SolidColorBrush(Color.FromArgb(1, 0, 0, 0)); //透明
}
private void myHideCursor()
{
cursorWin.Dispatcher.Invoke(
new Action(
delegate
{
cursorWin.Show();
Mouse.OverrideCursor = Cursors.None;
}));
}
private void myShowCursor()
{
cursorWin.Dispatcher.Invoke(
new Action(
delegate
{
cursorWin.Hide();
Mouse.OverrideCursor = null;
}));
}