C# WPF 实现鼠标固定在指定范围内运动
一.背景:
需要实现带有三个屏幕,三个屏幕分别显示窗体,但鼠标只能在主窗体中运动,不能移动到其他的两个附屏中。
二.实现:
具体实现使用的是user32.dll下的GetWindowRect(int hwnd,
ref RECT lpRect)函数。
参考百度百科:https://baike.baidu.com/item/ClipCursor
ClipCursor,函数名。该函数把鼠标限制在屏幕上的一个矩形区域内,如果调用SetCursor或用鼠标设置的一个随后的鼠标位置在该矩形区域的外面,则系统自动调整该位置以保持鼠标在矩形区域之内。
函数原型
BOOL ClipCursor(CONST RECT * lpRect);
参数
IpRect:指向RECT结构的指针,该结构包含限制矩形区域左上角和右下角的屏幕坐标,如果该指针为NULL(空),则鼠标可以在屏幕的任何区域移动。
返回值
如果成功,返回值非零;如果失败,返回值为零。若想获得更多错误信息,请调用GetLastError。
备注
1.光标是一个共享资源,如果一个应用控制了鼠标,在将控制转向另一个应用之前,必须要使用ClipCursor来释放鼠标,该调用过程必须具有对窗口的WINSTA_WRITEATTRIBUTES访问权。
2.此函数为api函数,调用时要函数声明:Private Declare Function ClipCursor Lib "user32" (lpRect
 As Any) As Long
及以上版本;Windows
 CE:不支持;头文件:winuser.h;库文件;user32.lib。
三.代码
我主要实现的是限定屏幕,所以提供的接口直接和屏幕有关,其他的具体情况具体分析。
using System;
using System.Linq;
using System.Runtime.InteropServices;
namespace Tool.ClipCursor
{
class ClipCursorHelper
{
[DllImport("user32.dll")]
static extern bool ClipCursor(ref RECT lpRect);
        [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint =
"GetWindowRect")]
        extern static int GetWindowRect(int hwnd,
ref RECT lpRect);
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
            public RECT(Int32 left,
Int32 top,
Int32 right, Int32 bottom)
{
Left = left;
Top = top;
Right = right;
Bottom = bottom;
}
}
/// <summary>
/// 设置鼠标显示在主屏范围内
/// </summary>
/// <returns></returns>
public static bool SetCursorInPrimaryScreen()
{
System.Windows.Forms.Screen screen = System.Windows.Forms.Screen.AllScreens.OrderBy(t => t.WorkingArea.X).First();
            RECT rect =
new RECT(screen.Bounds.X, screen.Bounds.Y, screen.Bounds.Right+screen.Bounds.X, screen.Bounds.Bottom);
return ClipCursor(ref rect);
}
/// <summary>
/// 恢复鼠标显示,可以所以屏幕的任何位置
/// </summary>
/// <returns></returns>
public static bool Default()
{
System.Windows.Forms.Screen screen = System.Windows.Forms.Screen.AllScreens.OrderByDescending(t => t.WorkingArea.X).First();
            RECT rect =
new RECT(0, 0, screen.Bounds.Right+ screen.Bounds.X, screen.Bounds.Bottom);
return ClipCursor(ref rect);
}
}
}
四.遇到的问题
1、在调试过程中发现每次窗体切换(如生成新的窗体),鼠标的范围又都返回到可以在任意位置使用,所以在每当生成窗体的时候都需要调一下上面的接口;
2、当使用Alt+Tab切换任务后,鼠标的限定范围也会不起作用,目前还无法解决;
但目前已经满足需要,网友知道如何避免上述两种问题的望交流学习。
C# WPF 实现鼠标固定在指定范围内运动的更多相关文章
- WPF 程序鼠标在窗口之外的时候,控件拿到的鼠标位置在哪里?
		
原文:WPF 程序鼠标在窗口之外的时候,控件拿到的鼠标位置在哪里? 在 WPF 程序中,我们有 Mouse.GetPosition(IInputElement relativeTo) 方法可以拿到鼠标 ...
 - WPF绑定文本时使用指定格式文本
		
原文:WPF绑定文本时使用指定格式文本 Text="{Binding PlayletModel.characters,StringFormat=Cast : {0}}" Strin ...
 - WPF 跟随鼠标动画 by wgscd
		
WPF 跟随鼠标动画 by wgscd <UserControl x:Class="WpfApplication1.Spark" xmlns="http://sch ...
 - WPF 使用鼠标拖动一个控件的实现[2018.7.15]
		
原文:WPF 使用鼠标拖动一个控件的实现[2018.7.15] Q:已经把一个Shape和一个TextBlock组合起来放到了一个Grid中,现在想要实现用鼠标拖动这个Grid到任意位置的功能,如何做 ...
 - WPF 获取鼠标屏幕位置、窗口位置、控件位置
		
原文:WPF 获取鼠标屏幕位置.窗口位置.控件位置 public struct POINT { public int X; public int Y; public POINT(int x, int ...
 - wpf 判断鼠标在一段时间内是否移动
		
原文:wpf 判断鼠标在一段时间内是否移动 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/config_man/article/details/74 ...
 - [WPF]自定义鼠标指针
		
原文:[WPF]自定义鼠标指针 [WPF]自定义鼠标指针 周银辉 看看WPF Cursor类的两个构造函数吧: * f)); g.Flush(); g.D ...
 - [WPF]获取鼠标指针下的元素
		
原文:[WPF]获取鼠标指针下的元素 [WPF]获取鼠标指针下的元素 周银辉 以前写过一些GetElementUnderMouse之类的函数,要用到坐标换算而显得有些麻烦(特别是当元素有XXXTr ...
 - 《Programming WPF》翻译 第3章 3.内嵌控件
		
原文:<Programming WPF>翻译 第3章 3.内嵌控件 WPF提供了一系列内嵌控件.其中大多数符合标准的你已经熟悉的Windows控件类型.注意到没有一个是包装在旧的Win32 ...
 
随机推荐
- MySql Order By 多个字段 排序规则
			
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xlxxcc/article/details/52250963 说在前面 突发奇想,想了解一下mysq ...
 - 原生js螺旋运动
			
window.onload=function(){ var oSpiral=document.getElementById('spiral'); var oUl=oSpiral.getElements ...
 - 从0開始学习 GitHub 系列之「07.GitHub 常见的几种操作」
			
之前写了一个 GitHub 系列,反响非常不错,突然发现居然还落下点东西没写,前段时间 GitHub 也改版了,借此机会补充下. 我们都说开源社区最大的魅力是人人多能够參与进去,发挥众人的力量,让一个 ...
 - dmalloc用法快速入门
			
原文链接 常用内存泄露检测手段有 1 mtrace 2 memwatch 3 mpatrol 4 dmalloc 5 dbgmem 6 valgrind 7 Electric Fence dmallo ...
 - AlphaImageLoader用法
			
在 IE6 中,能够非常方便地利用 img 的 src 属性,实现本地图片预览,然而在 IE7 中,这样的办法却行不通.须要用 AlphaImageLoader. AlphaImageLoader 说 ...
 - 怎样在log4j.xml配置文件中引入变量:小公司经验较多的我和阿里UC等大公司经验较多的Boss,一些技术交流和探讨
			
从最初学习使用log4j的时候,网上和书本上主要都是使用"log4j.properties"这种属性格式,配置日志.多年以来,一直使用这种格式,总的来说,简单.够用. 而有十 ...
 - 【t060】可怜的波特
			
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 哈里波特在姨夫家遭受非人待遇,他被迫做很多事.有一次,姨夫有给了他一大堆家务.哈里知道每件做完家务的时 ...
 - 有奖试读&征文--当青春遇上互联网,是否能点燃你的创业梦
			
时至今日,互联网已经切入我们每一个人的工作.生活和学习的每一个角落.利用互联网这个工具,有人游戏,有人购物,有人上课,有人交友,而有那么一部分人去利用它完毕人生最完美的逆袭.相信每一个人心中都有个创业 ...
 - Dll注入技术之消息钩子
			
转自:黑客反病毒 DLL注入技术之消息钩子注入 消息钩子注入原理是利用Windows 系统中SetWindowsHookEx()这个API,他可以拦截目标进程的消息到指定的DLL中导出的函数,利用这个 ...
 - Android中自定义View和自定义动画
			
Android FrameWork 层给我们提供了很多界面组件,但是在实际的商业开发中这些组件往往并不能完全满足我们的需求,这时候我们就需要自定义我们自己的视图和动画. 我们要重写系统的View就必须 ...