关于Form鼠标位置和状态捕捉

问题描述

想在form中捕捉鼠标的位置和状态。现在是这样做的:用了两个Button和两个Label来试验效果。在几个控件的MouseMove事件中读取鼠标的位置,然后显示在Label中。在几个控件的MouseDown事件中读取是左键还是右键按下。在几个控件的MouseUp事件中读取是左键还是右键松开。在几个控件的MouseEnter事件中将焦点设为自身。情况是这样的:鼠标的位置能捕捉到并显示出来。然后分别按下左右键能区分(左键按下、右键按下、左右按下、没有键按下)四中状态,显示出来。鼠标位置能区分(button1内部、button2内部、button外面)三个状态,显示出来。但是问题来了:当鼠标左键按下,保持按住状态,滑动鼠标,鼠标的XY坐标能读取出来,但是不能区分(button1内部、button2内部、button外面)三个状态了。但是如果按住左键,按住右键之后。这时松开其中一个键(另一个保持按住),滑动鼠标,就能读坐标出来,也能分区域了。具体就是鼠标按下之后不能切换区域了,但是送开鼠标后是可以的,和是否有鼠标键按住无关。下面是完整的实现代码:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespaceWinMine_CSharp_V1{publicpartialclassMainForm:Form{privatestringLocationName="None";privateboolMouseLeftDown;privateboolMouseRightDown;publicMainForm(){InitializeComponent();}privatevoidForm1_MouseMove(objectsender,MouseEventArgse){RefreshLabel();}privatevoidbutton1_MouseMove(objectsender,MouseEventArgse){RefreshLabel();}privatevoidbutton2_MouseMove(objectsender,MouseEventArgse){RefreshLabel();}privatevoidRefreshLabel(){//读鼠标相对窗口坐标LocationLabel.Text=this.PointToClient(Control.MousePosition).ToString();//判断鼠标左右键的状态if(MouseLeftDown&&MouseRightDown){StateLabel.Text=LocationName+"doubledown.";}elseif(MouseLeftDown){StateLabel.Text=LocationName+"leftdown.";}elseif(MouseRightDown){StateLabel.Text=LocationName+"rightdown.";}else{StateLabel.Text=LocationName+"None.";}}/**************设置鼠标进入时间函数***********************/privatevoidbutton1_MouseEnter(objectsender,EventArgse){LocationName="Button1";button1.Focus();RefreshLabel();}privatevoidbutton2_MouseEnter(objectsender,EventArgse){LocationName="Button2";button2.Focus();RefreshLabel();}privatevoidForm1_MouseEnter(objectsender,EventArgse){LocationName="None";this.Focus();RefreshLabel();}/**************设置鼠标按下抬起时间函数***********************/privatevoidbutton1_MouseDown(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Left){MouseLeftDown=true;;}elseif(e.Button==MouseButtons.Right){MouseRightDown=true;}RefreshLabel();}privatevoidbutton1_MouseUp(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Left){MouseLeftDown=false;;}elseif(e.Button==MouseButtons.Right){MouseRightDown=false;}RefreshLabel();}privatevoidbutton2_MouseDown(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Left){MouseLeftDown=true;;}elseif(e.Button==MouseButtons.Right){MouseRightDown=true;}RefreshLabel();}privatevoidbutton2_MouseUp(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Left){MouseLeftDown=false;;}elseif(e.Button==MouseButtons.Right){MouseRightDown=false;}RefreshLabel();}privatevoidForm1_MouseUp(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Left){MouseLeftDown=false;;}elseif(e.Button==MouseButtons.Right){MouseRightDown=false;}RefreshLabel();}privatevoidForm1_MouseDown(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Left){MouseLeftDown=true;;}elseif(e.Button==MouseButtons.Right){MouseRightDown=true;}RefreshLabel();}}}

解决方案

解决方案二:
默认捕获鼠标了
解决方案三:
似乎挺厉害的
解决方案四:
你要做什么?你直接说你想要做什么就好了。你绕得太远了。
解决方案五:
引用3楼wawd74520的回复:

你要做什么?你直接说你想要做什么就好了。你绕得太远了。

我想在左键按下去并一直按住的时候,鼠标移进BUTTON2,能触发一个MouseEnter事件。现在的情况是左键按住,鼠标移进去不会触发MouseEnter,但是左右键都按住,松开其中一个键,另一个保持按住的时候,移进去会触发MouseEnter.想知道为什么同样是保持按住一个键的时候,有的可以触发Enter,有的不可以
解决方案六:
你这个需求好像不太对劲。你是要drop事件么。文件拖拽接收类似的功能。
解决方案七:
引用5楼wawd74520的回复:

你这个需求好像不太对劲。你是要drop事件么。文件拖拽接收类似的功能。

其实我需要的功能我可以实现的,就是我可以在MouseMove里面判断坐标,是可以确定鼠标移进某个控件的效果。但是我想把一个按钮封装起来,按钮类的内部就用MouseEnter的事件把事情处理掉,不用借助外面来取坐标然后结合按钮自身的坐标和大小来判断是否移入了按钮。
解决方案八:
他这个也不像是drop,逻辑有点绕
解决方案九:
引用7楼aspower_的回复:

他这个也不像是drop,逻辑有点绕

最初的目的是button1、button2、form1三个控件的MouseEnter事件里面分别判断鼠标进哪了。然后问题在与鼠标按下去不放,然后移动的时候,不知道鼠标进哪个控件了
解决方案十:
其实其它界面都是这样的。比如你点击按钮1。不松开。进入按钮2.按钮2是没任何效果的。大多数界面都是这样子的。不用自己去判断在哪里。

时间: 2024-10-27 05:13:15

关于Form鼠标位置和状态捕捉的相关文章

JS魔法堂:关于元素位置和鼠标位置的属性

一.关于鼠标位置的属性   1. 触发鼠标事件的区域       盒子模型中的border,padding,content区域会触发鼠标事件,点击margin区域将不触发鼠标事件.   2. 鼠标事件对象MouseEvent下的属性       [a].  evt.pageX/Y :以页面左上角为参考点,表示当前触发点离页面左上角的水平和垂直距离.       注意:1. IE5.5~8不支持该属性,polyfill方法pageX = clientX + scrollLeft          

javascript获取鼠标位置部分火狐,ie

var xPos;  var yPos;  document.onmousemove = mouseMove;          function mouseMove(ev) {              ev = ev  window.event;              var mousePos = mouseCoords(ev);              xPos = mousePos.x;              yPos = mousePos.y;          }     

WPF学习备忘(2)WPF获取和设置鼠标位置与progressbar的使用方法

一.WPF 中获取和设置鼠标位置 方法一:WPF方法 Point p = Mouse.GetPosition (e.Source as FrameworkElement); Point p = (e.Source as FrameworkElement).PointToScreen(pp); 方法二: API方法 /// <summary> /// 设置鼠标的坐标 /// </summary> /// <param name="x">横坐标</

Windows中如何获取键盘和鼠标处于空闲状态的时间

本文配套源码 在编写程序的过程中,我遇到了这样的需求:在基于Windows 9x 或 Windows NT4.0 的程序中,要求确定键盘.鼠标处于空闲状态的时间.查询了有关资料文档以后,发现Windows 9x和Windows NT4.0 没有提供API或系统调用来实现这样的功能.但是,在Windows 2000中提供了一个新的函数:GetLastInputInfo(),这个函数使用结构 LASTINPUTINFO 作为参数:LASTINPUTINFO lpi; lpi.cbSize = siz

在WPF里面实现以鼠标位置为中心缩放移动图片

在以前的文章使用WPF Resource以及Transform等技术实现鼠标控制图片缩放和移动的效果里面,介绍了如何在WPF里面移动和放大缩小图片,程序也支持使用滚轮的方式缩放图片.然而前面文章里介绍的缩放功能只能以图片中心为原点来实现,但是这种功能往往并不是客户想要的,我们看图片的时候,往往都喜欢以鼠标放在图片的焦点为原点进行图片的缩放. 咋看起来,实现这个功能也不是很难, ScaleTransform类里面定义了CenterX和CenterY两个属性就是用来设置缩放的原点坐标的.将这两个属性

这个银行木马可通过鼠标位置和时间戳实现沙箱逃逸

Forcepoint安全研究员称,Ursnif银行木马又出新变种,融入基于鼠标位置和文件时间戳的反沙箱功能,可盗取雷鸟(Thunderbird)邮件客户端数据.     Ursnif恶意软件家族至少自2013年起便已面世,主要用于盗取包含密码在内的敏感信息.最近的变种被观察到在测试各种沙箱逃逸技术. 新发现的变种通过恶意邮件投放,邮件附件为加密Word文档,正文则给出了该文档的明文密码.恶意文档中包含数个经过混淆处理的VBS文件,旨在通过WMI加载恶意DLL.     该附件一被解密,就会释放出

基于JavaScript获取鼠标位置的各种方法_javascript技巧

在一些DOM操作中我们经常会跟元素的位置打交道,鼠标交互式一个经常用到的方面,令人失望的是不同的浏览器下会有不同的结果甚至是有的浏览器下没结果,这篇文章就上鼠标点击位置坐标获取做一些简单的总结,没特殊声明代码在IE8,FireFox,Chrome下进行测试兼容 鼠标点击位置坐标 相对于屏幕 如果是涉及到鼠标点击确定位置相对比较简单,获取到鼠标点击事件后,事件screenX,screenY获取的是点击位置相对于屏幕的左边距与上边距,不考虑iframe因素,不同浏览器下表现的还算一致. functi

JavaScript中获取鼠标位置相关属性总结_javascript技巧

javascript并没有mouse对象,获取鼠标坐标要靠强大的event对象. 我们通过监听document的mousemove,就可以实时获得鼠标位置. 但是!!event中和鼠标相关的属性太多了,很让人头大!如下: event.layerX event.layerY event.clientX event.clientY event.pageX event.pageY event.offsetX event.offsetY event.screenX event.screenY event

js判断鼠标位置是否在某个div中的方法_javascript技巧

本文实例讲述了js判断鼠标位置是否在某个div中的方法.分享给大家供大家参考,具体如下: div的onmouseout事件让div消失时,会出现这样的情况,就是当鼠标移至div中的其它内容时,此时也判定为离开div,会触发 onmouseout事件,这样div中的内容就不能操作了.解决的办法是当触发onmouseout事件时,先判断鼠标是否在div内,如果在,说明鼠 标并没有离开div,就不删除div,否则,删除之.OK,现在问题解决了. 就是找到该div左上角和右下角坐标,判断鼠标的坐标是否在