一.背景:

需要实现带有三个屏幕,三个屏幕分别显示窗体,但鼠标只能在主窗体中运动,不能移动到其他的两个附屏中。

二.实现:

具体实现使用的是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 NT:3.1及以上版本;Windows:95及以上版本;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 实现鼠标固定在指定范围内运动相关推荐

  1. [WPF]自定义鼠标指针

    [WPF]自定义鼠标指针 原文:[WPF]自定义鼠标指针 [WPF]自定义鼠标指针 周银辉 看看WPF Cursor类的两个构造函数吧: public Cursor(Stream cursorStre ...

  2. python selenium 鼠标移动到指定元素,并点击对应的元素

    在使用selenium 爬去网页信息的时候,我们经常会遇到这样的一个问题.就是某一关键字或者元素,必须是鼠标悬浮上,才会出现,然后才能点击.那下面,我们就用python实现这一功能. 举例来说: 假设 ...

  3. js鼠标移动到指定位置_Python: pyautogui模块之鼠标控制

    文章背景:PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,利用它可以实现自动化任务.pyautogui模块中包含了一些函数,可以模拟鼠标移动.按键和 ...

  4. WPF 获取鼠标屏幕位置、窗口位置、控件位置

    原文:WPF 获取鼠标屏幕位置.窗口位置.控件位置 public struct POINT{public int X;public int Y;public POINT(int x, int y){t ...

  5. WPF之鼠标滑动切换图片

    原文:WPF之鼠标滑动切换图片 在网上找了一会儿也没找到我想要的效果,还是自己动手,丰衣足食吧. 需求:当前面板中只显示一张图片,图片栏的下部有用来显示当前图片处于图片队列中的位置的圆球,并且点击下部 ...

  6. 在多个指定区间内生成随机数,且随机数总和固定算法

    在多个指定区间内生成随机数,且随机数总和固定算法 一.介绍 最近项目上遇到了一个需求就是在多个指定区间内生成总和恒定的随机数. 示例:在[1-3].[4-20].[24-100]区间上分别生成一个随机 ...

  7. WPF中的TreeView选中指定节点

    WPF 中的 TreeView 选中 指定 节点 基本原理 TreeView节点一般包装了一个自定义的对象,这个对象包含ID.DisplayName等各类属性.我的一个项目里有TreeView加载后默 ...

  8. CSS便签样式效果,鼠标移动到指定便签显示隐藏内容

    css便签样式效果,鼠标移动到指定便签显示隐藏内容 这是效果图欢迎大家一起交流学习 这里放了源码 <!DOCTYPE html> <html lang="zh"& ...

  9. WPF 使用鼠标滚轮控制ListBox水平滚动条滚动

    我们都知道在WPF中鼠标滚轮可以控制垂直滚动条滚动,但没有什么属性设置可以让它控制水平滚动条滚动,所以我们需要自己去实现水平滚动. 首先,在ListBox的Mousewheel事件中获得ListBox ...

最新文章

  1. 读写分离原来这么简单,一个小注解就够了
  2. java代码_阿里资深工程师教你如何优化 Java 代码!
  3. 极简PaddlePaddle的房价预测Demo
  4. camera理论基础和工作原理【转】
  5. 拼多多“京东化”:自建物流重农卖菜是赚谁的钱?
  6. 天地图 热力图_arcgis js 3.x使用webgl绘制热力图
  7. mysql数据的引用_MySQL数据库入门:mysql操作和程序引用
  8. linux 双机直连设置
  9. 干掉搜狗输入法云代理SogouCloud.exe
  10. 盘点Chrome 灵魂插件!爱了爱了!
  11. C#调用Python模块
  12. 【Python CheckiO 题解】Remove Accents
  13. 培养宝贝惊人记忆力10妙招哦
  14. (213)initial是否可综合?
  15. 快速修改数组的某个值_我用Python,3分钟快速实现,9种经典排序算法的可视化...
  16. 阿里字节面试题,多线程打印程序
  17. 中国中产阶层占全球三成 财富增长动力来自房产
  18. iOS开发UIScrollView常见属性和方法
  19. 航天金税开票导入导出txt格式
  20. 甲骨文提供非常良心的永久免费云主机空间

热门文章

  1. istio1.0.4快速部署与体验
  2. EBU6304 Software Engineering 知识点总结_4 analysis, design, implementation, testing
  3. 怎么改装汽车音响?有什么注意事项?
  4. 使用百度统计API接口抓取数据
  5. 【成功案例】风起亚洲助力,创业比赛夺冠
  6. laravel笔记-安装
  7. 这些虚幻引擎渲染技巧,不看真的后悔
  8. TCP长连接和短连接的区别
  9. 常用设计模式——创建者模式
  10. C语言 | 两种方法解决五人分鱼