C# WPF 实现鼠标固定在指定范围内运动

简介: 原文:C# WPF 实现鼠标固定在指定范围内运动   一.背景: 需要实现带有三个屏幕,三个屏幕分别显示窗体,但鼠标只能在主窗体中运动,不能移动到其他的两个附屏中。
原文: C# WPF 实现鼠标固定在指定范围内运动

 

一.背景:

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

 

二.实现:

具体实现使用的是user32.dll下的GetWindowRect(int hwnd, ref RECT lpRect)函数。

参考百度百科:https://baike.baidu.com/item/ClipCursor

 

ClipCursor,函数名。该函数把鼠标限制在屏幕上的一个矩形区域内,如果调用SetCursor或用鼠标设置的一个随后的鼠标位置在该矩形区域的外面,则系统自动调整该位置以保持鼠标在矩形区域之内。

函数原型

BOOL ClipCursorCONST RECT * lpRect);

参数

IpRect:指向RECT结构的指针,该结构包含限制矩形区域左上角和右下角的屏幕坐标,如果该指针为NULL(空),则鼠标可以在屏幕的任何区域移动。

返回值

如果成功,返回值非零;如果失败,返回值为零。若想获得更多错误信息,请调用GetLastError

备注

1.光标是一个共享资源,如果一个应用控制了鼠标,在将控制转向另一个应用之前,必须要使用ClipCursor来释放鼠标,该调用过程必须具有对窗口的WINSTA_WRITEATTRIBUTES访问权。

2.此函数为api函数,调用时要函数声明:Private Declare Function ClipCursor Lib "user32" (lpRect As Any) As Long

速查:Windows NT3.1及以上版本;Windows95及以上版本;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 中 外部图标引入iconfont,无法正常显示问题 【小白记录】
本文介绍了在C# WPF应用程序中引入外部iconfont图标时可能遇到的显示问题及其解决方法:1) 检查资源路径和引入格式是否正确,确保字体文件引用格式为“#xxxx”,并正确指向字体文件位置;2) 确保图标资源被包含在程序集中,通过设置字体文件的生成操作为Resource(资源)来实现。
C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】
|
3月前
|
编解码 C# 数据库
C# + WPF 音频播放器 界面优雅,体验良好
【9月更文挑战第18天】这是一个用 C# 和 WPF 实现的音频播放器示例,界面简洁美观,功能丰富。设计包括播放/暂停按钮、进度条、音量控制滑块、歌曲列表和专辑封面显示。功能实现涵盖音频播放、进度条控制、音量调节及歌曲列表管理。通过响应式设计、动画效果、快捷键支持和错误处理,提升用户体验。可根据需求扩展更多功能。
125 3
|
4月前
|
C#
C# WPF 将第三方DLL嵌入 exe
C# WPF 将第三方DLL嵌入 exe
88 0
|
4月前
|
前端开发 C# 容器
WPF/C#:实现导航功能
WPF/C#:实现导航功能
77 0
|
4月前
|
设计模式 测试技术 C#
WPF/C#:在WPF中如何实现依赖注入
WPF/C#:在WPF中如何实现依赖注入
77 0
|
4月前
|
前端开发 C# Windows
WPF/C#:如何实现拖拉元素
WPF/C#:如何实现拖拉元素
51 0
|
4月前
|
存储 C# 索引
WPF/C#:BusinessLayerValidation
WPF/C#:BusinessLayerValidation
35 0
|
4月前
|
C#
WPF/C#:数据绑定到方法
WPF/C#:数据绑定到方法
43 0
|
4月前
|
前端开发 测试技术 C#
WPF/C#:在DataGrid中显示选择框
WPF/C#:在DataGrid中显示选择框
63 0
|
4月前
|
开发框架 .NET C#
WPF/C#:显示分组数据的两种方式
WPF/C#:显示分组数据的两种方式
61 0