问题描述
想在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是没任何效果的。大多数界面都是这样子的。不用自己去判断在哪里。