博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# WPF 实现鼠标固定在指定范围内运动
阅读量:6800 次
发布时间:2019-06-26

本文共 2171 字,大约阅读时间需要 7 分钟。

原文:

 

一.背景:

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

 

二.实现:

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

参考百度百科:

 

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切换任务后,鼠标的限定范围也会不起作用,目前还无法解决;

但目前已经满足需要,网友知道如何避免上述两种问题的望交流学习。

转载地址:http://wyywl.baihongyu.com/

你可能感兴趣的文章
cms无法登陆
查看>>
JavaScript中事件处理
查看>>
VSTO 向office文档中插入内容
查看>>
【百度地图API】关于如何进行城市切换的三种方式
查看>>
How to provide highlighting with Spring data elasticsearch
查看>>
MongoDB 游标
查看>>
即将搭载人工智能芯片的华为Mate10,究竟会为业界带来什么?
查看>>
Linux在应用层读写寄存器的方法。。。
查看>>
区分execl与system——应用程序中执行命令
查看>>
Android实现登录小demo
查看>>
AgentWeb是基于Android WebView一个功能完善小型浏览器库
查看>>
开放数据中心联盟推8个云计算应用模型
查看>>
学习数据分析的“里程碑”是什么?
查看>>
零点之战!探访阿里巴巴8大技术专家,提前揭秘2017双11关键技术
查看>>
国家开发银行统一软件环境USE解决方案
查看>>
数据科学与DevOps之间的差距还有救吗?
查看>>
程序员必须知道的10大基础实用算法及其讲解
查看>>
信息化一周回顾:金融业大数据十大趋势
查看>>
Http、TCP/IP协议与Socket之间的区别
查看>>
ARM工控主板在驾考驾培智能终端的使用
查看>>