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 ...
随机推荐
- hdu 4811 数学 不难
http://acm.hdu.edu.cn/showproblem.php? pid=4811 由于看到ball[0]>=2 && ball[1]>=2 && ...
- Swift--使图片360° 周期旋转
UIImageView+Extension.swift import UIKit extension UIImageView { // 360度旋转图片 func rotate360Degree() ...
- tc
[em_Compare]cmd=d:\Apps\BeyondCompare4\now\BCompare.exeparam="""%X%P%S"" &q ...
- python 升级pip
废话少说,直接上图,希望谅解我的懒惰!:)
- [Now] Update an application hosted with Zeit’s Now
Because now deploys are immutable, you can’t push changes to a running instance - you just push a ne ...
- ios开发缓存处理类NSCash类的了解与使用
一:NSCash的基本了解 #import "ViewController.h" @interface ViewController ()<NSCacheDelegate&g ...
- 安装hadoop1.2.1集群环境 分类: A1_HADOOP 2014-08-29 15:49 1444人阅读 评论(0) 收藏
一.规划 (一)硬件资源 10.171.29.191 master 10.173.54.84 slave1 10.171.114.223 slave2 (二)基本资料 用户: jediael 目录 ...
- 解决IE6下PNG透明的JS插件:DD_belatedPNG.js
DD_belatedPNG是一款解决IE6下PNG透明的JS插件,支持background-position和background-repeat属性,支持伪类.使用方法: <!--[if lte ...
- 开发自己的PHP MVC框架(一)
这个教程能够使大家掌握用mvc模式开发php应用的基本概念.此教程分为三个部分.如今这篇是第一部分. 如今市面上有非常多流行的框架供大家使用.可是我们也能够自己动手开发一个mvc框架.採用mvc模式能 ...
- 利用QPainter绘制各种图形(Shape, Pen 宽带,颜色,风格,Cap,Join,刷子)
利用QPainter绘制各种图形 Qt的二维图形引擎是基于QPainter类的.QPainter既可以绘制几何形状(点.线.矩形.椭圆.弧形.弦形.饼状图.多边形和贝塞尔曲线),也可以绘制像素映射.图 ...