C程序设计鼠标和键盘
一、获取鼠标的窗体/屏幕坐标
protected override void OnMouseMove(MouseEventArgs e) { Point clientMouse = e.Location; //相对窗体坐标 Point screenMouse = PointToScreen(clientMouse); //相对屏幕坐标 this.Text = string.Format("鼠标窗体坐标:({0},{1}) 鼠标屏幕坐标:({2},{3})", clientMouse.X, clientMouse.Y, screenMouse.X, screenMouse.Y); }
该实例重写了鼠标移动事件函数OnMouseMove,利用参数e获取窗体坐标,利用PointToScreen方法获取屏幕坐标。二、鼠标长时间按下事件
鼠标持续按下2秒,弹窗public partial class Form1 : Form { Timer timer = new Timer(); //创建实例 int timeout = 0; //超时时间 MouseEventArgs LongDown; //鼠标长时间按下事件参数 public Form1()//窗体构造函数 { InitializeComponent(); timer.Interval = 1000; //定时器间隔,单位毫秒 timer.Tick += new EventHandler(timer_Tick); //注册timer_Tick事件 } void timer_Tick(object sender, EventArgs e)//每个间隔执行一次 { if (++timeout == 2) OnMouseLongDown(this.LongDown); //鼠标按下2秒,调用长时间按下事件 } protected override void OnMouseDown(MouseEventArgs e) { this.LongDown = e; //鼠标按下事件参数 this.Cursor = Cursors.Hand; //鼠标按下为手型 timeout = 0; //超时时间清0 timer.Start(); //计时器启动 } protected override void OnMouseUp(MouseEventArgs e) { this.Cursor = Cursors.Arrow;//鼠标松开为箭头 timer.Stop(); //计时器停止 } protected virtual void OnMouseLongDown(MouseEventArgs e) { MessageBox.Show("鼠标被长时间按下!"); } }
鼠标按下,启动定时器;
鼠标抬起,停止定时器;
定时器计时后,每秒timeout加1,达到设定时间后触发函数OnMouseLongDown,弹窗。三、根据区域设置鼠标类型
四个区域,对应四种鼠标图标protected override void OnMouseMove(MouseEventArgs e) { if (e.X < ClientSize.Width / 2) if (e.Y < ClientSize.Height / 2) this.Cursor = Cursors.Hand; //左上,鼠标为手形图标 else this.Cursor = Cursors.Help; //左下,鼠标为帮助图标 else if (e.Y < ClientSize.Height / 2) this.Cursor = Cursors.WaitCursor; //右上,鼠标为等待图标 else this.Cursor = Cursors.Cross; //右下,鼠标为十字型图标 }
该实例通过修改窗体的Cursor对象实现鼠标样式的改变。四、创建鼠标图标
protected override void OnLoad(EventArgs e) { Bitmap icon = new Bitmap(100,100);//鼠标图标的大小 Graphics G = Graphics.FromImage(icon); //创建新的绘图 G.SmoothingMode = SmoothingMode.AntiAlias; //消除锯齿 G.Clear(Color.Transparent); //图标背景设为透明 G.FillPie(new SolidBrush(Color.FromArgb(255, Color.Red)) //绘制扇形作为鼠标指针 , new Rectangle(0, 0, icon.Width, icon.Height), 30f, 30f); G.Dispose(); //释放绘图表面 this.Cursor = new Cursor(icon.GetHicon()); //设置新的鼠标对象 icon.Dispose(); }
该实例利用绘制图标自定义鼠标的图标:
1、创建了一个100x100位图对象;
2、在位图中绘制一个扇形形状作为鼠标指针;
3、通过GetHicon方法获取图标句柄,并创建Cursor对象。五、限制鼠标活动范围
抬起,活动范围全屏;按下,活动范围窗体protected override void OnMouseDown(MouseEventArgs e)//鼠标按下 { this.Text = "鼠标按下,活动范围限制为窗体"; Cursor.Clip = new Rectangle(this.Location, this.Size); } protected override void OnMouseUp(MouseEventArgs e)//鼠标抬起 { this.Text = "鼠标抬起,活动范围无限制"; Rectangle clip = new Rectangle(); foreach (var item in Screen.AllScreens) //遍历所有屏幕 clip = Rectangle.Union(clip, item.Bounds);//包含所有屏幕的最小矩形 Cursor.Clip = clip; }
该实例通过调用Cursor类的Clip属性(Rectangle类型)来设置鼠标的活动区域。六、隐藏和显示鼠标指针
按下:隐藏;抬起:显示protected override void OnMouseDown(MouseEventArgs e) { this.Text = "鼠标按下:隐藏"; Cursor.Hide(); //隐藏鼠标 } protected override void OnMouseUp(MouseEventArgs e) { this.Text = "鼠标抬起:显示"; Cursor.Show(); //显示鼠标 }
该实例通过调用Cursor类的Hide和Show方法来实现鼠标的隐藏与显示。七、利用鼠标进行书写
bool isMouseDown = false; //声明Bool变量:鼠标是否按下 Point pointMouse = new Point();//鼠标上一时刻的坐标 protected override void OnMouseDown(MouseEventArgs e) { pointMouse = e.Location; //鼠标上一时刻坐标 isMouseDown = true; //鼠标已经按下 } protected override void OnMouseMove(MouseEventArgs e) { if (isMouseDown) { using (Graphics G = this.CreateGraphics()) //获取窗体绘制表面 { G.SmoothingMode = SmoothingMode.AntiAlias; //消除锯齿 using (Pen pen = new Pen(Color.Red, 3f)) //创建宽度为3像素的黑色画笔 { G.DrawLine(pen, pointMouse, e.Location); //绘制连接两个坐标的线段 pointMouse = e.Location; //重新设置鼠标坐标 } } } } protected override void OnMouseUp(MouseEventArgs e) { isMouseDown = false; //鼠标未按下 } private void button1_Click(object sender, EventArgs e) { this.Invalidate();//清屏 }
该实例通过利用DrawLine方法绘制连续的线段实现书写。
鼠标按下,把实时坐标赋值给pointMouse;
鼠标按下并移动,绘制当前点与pointMouse之间的线段;
鼠标抬起,停止绘制。八、按下组合键实现窗体全屏
Ctrl+Enter组合键实现全屏缩放protected override void OnKeyDown(KeyEventArgs e) { if (e.KeyData == (Keys.Control | Keys.Enter)) //判断键盘按键类型 { if (this.WindowState == FormWindowState.Maximized) //判断窗体是否最大化 { this.WindowState = FormWindowState.Normal; //窗体还原 } else if (this.WindowState == FormWindowState.Normal)//判断窗体是否默认大小 { this.WindowState = FormWindowState.Maximized; //窗体最大化 } } }
该实例通过函数OnKeyDown的KeyEventArgs参数对象的KeyData属性来获取键盘按下的键。通过判断属性值是否为Ctrl+Enter组合键的值来决定是否将窗体最大化。九、屏蔽Alt+F4组合键
protected override void OnKeyDown(KeyEventArgs e) { if (e.KeyData == (Keys.Alt | Keys.F4)) { MessageBox.Show("Alt+F4组合键已被屏蔽,无法关闭当前窗体!"); e.Handled = true; //标记为已处理状态 } }
如果检测到Alt+F4组合键按下,则将参数对象KeyEventArgs的Handled属性设置为true,标记Alt+F4组合键消息已经被处理过。十、使用Shift+方向键调整窗体大小
"Shift+方向"组合键,调节窗体大小protected override void OnKeyDown(KeyEventArgs e) { if (e.KeyData == (Keys.Shift | Keys.Left)) this.Width -= 10; //减小宽度 if (e.KeyData == (Keys.Shift | Keys.Right)) this.Width += 10; //增加宽度 if (e.KeyData == (Keys.Shift | Keys.Up)) this.Height -= 10; //减小高度 if (e.KeyData == (Keys.Shift | Keys.Down)) this.Height += 10; //增加高度 this.Text = "使用Shift+方向键调整窗体大小" + string.Format("({0},{1})", this.Width, this.Height); }十一、录制并回放鼠标移动轨迹
按下Ctrl,记录鼠标轨迹;抬起Ctrl,绘制记录的轨迹Queue mousePoints = new Queue(); //保存鼠标轨迹 bool isCtrlDown = false; //标记Ctrl键是否按下 protected override void OnKeyDown(KeyEventArgs e) { if (e.KeyData == (Keys.LButton | Keys.ShiftKey | Keys.Control)) {//判断Ctrl键按下 isCtrlDown = true; //标记Ctrl键按下 timer1.Start(); //启动计时器 } } private void timer1_Tick(object sender, EventArgs e) { if (isCtrlDown) mousePoints.Enqueue(Cursor.Position); //添加轨迹 else if (mousePoints.Count > 0) //鼠标轨迹数大于0 { Cursor.Position = mousePoints.Dequeue(); //从轨迹中取出一个点设置为鼠标当前值 Graphics g = this.CreateGraphics(); //获取窗体绘图表面 Cursor.Draw(g, new Rectangle(PointToClient(Cursor.Position), Cursor.Size)); //绘制鼠标图标 g.Dispose(); } else timer1.Stop(); //停止录像或回放 } protected override void OnKeyUp(KeyEventArgs e) { if (e.KeyData == (Keys.LButton | Keys.ShiftKey)) //判断Ctrl键抬起 isCtrlDown = false; //标记Ctrl键抬起 }
Ctrl键按下,启动计时器,将鼠标的实时位置添加到鼠标轨迹中。
Ctrl键抬起,将记录的鼠标轨迹逐一出队,调用Cursor的Draw方法来绘制鼠标的动作轨迹,停止计时器。十二、模拟键盘输入
private void button1_Click(object sender, EventArgs e)//按钮1,输入字符 { textBox1.Focus(); //获取文本框焦点 SendKeys.Send("1234ABCD - "); SendKeys.Flush(); //处理所有的Windows消息 } private void button2_Click(object sender, EventArgs e)//按钮2,退格 { textBox1.Focus(); SendKeys.Send("{BS}"); SendKeys.Flush(); } private void button3_Click(object sender, EventArgs e)//按钮3,输入10个A { textBox1.Focus(); SendKeys.Send("{A 10}"); SendKeys.Flush(); } private void button4_Click(object sender, EventArgs e)//按钮4,输入Alt+F4键 { MessageBox.Show("窗口即将关闭!"); SendKeys.Send("%{F4}"); }
通过SendKeys类的Send方法来实现向当前获取焦点的控件发送键盘按键。
参考:《C#程序设计经典300例》
寻找树王辛达布5月8日,辛达布被确定为中国大陆当时已知的最高树,高约76。8米,它位于墨脱的原始森林,身上长满了附生植物5月18日,中国科学院植物研究所郭柯团队在西藏察隅县察隅河两岸山地发现一棵
波音的starliner飞船果然又出了点问题为啥我要说果然?波音的商业载人飞船starliner今天早上发射成功,北京时间5月20日652在卡纳维拉尔角SLC41发射,AtlasVN22火箭把它送到了预定轨道。在飞船发射后的
神奇大西北导游示意图在宝鸡首发5月19日,2022年新版神奇大西北导游示意图在5。19中国旅游日宝鸡分会场启动仪式上正式首发,协作区秘书处在活动现场安排了展示和免费派发,受到广泛好评。我国西北地区包括陕西甘肃宁
15000个美妆博主,也吹不起这家国货之光从国货之光,到濒临退市,完美日记的母公司逸仙电商只用了一年半的时间。逸仙电商自上市之后便一路高歌猛进,2021年2月10日,市值一度达到160。97亿美元,不过很快便开始下滑,跌跌
孙颖莎剪了超短发,见到王皓拍照害羞擦汗!樊振东出镜,被夸可爱5月19日,国乒名帅樊振东主管教练王皓晒出国乒训练动态,让我们看到了新鲜的马龙樊振东王楚钦等男选手,女队奥运冠军孙颖莎也意外出镜,剪了超短发的孙颖莎一度让人认不出来。在王皓晒出的视
30岁还能演中学生的女星,我只服这8位!穿上校服,灵气就来了现在的娱乐圈可怪异了,总是有些爱装嫩的演员。比如之前章子怡在上阳赋里的少女,被大家吐槽眼里尽是掩不住的沧桑感,根本没有少女的灵动和清澈。算了,不提他们了,我们还是来看看娱乐圈一直少
6步搞定麦克风,别再说不会用啦你在唱歌的时候使用麦克风是有诀窍的。应该说有一些注意事项。今天就要来教大家如何使用麦克风。如果你是表演者的话,这些注意事项也要看第一,那么麦克风应该做什么呢,打开电源不要觉得这件事
球形闪电是怎么形成的?你知道闪电还有球形(胖成球的球)的吗?今天我们就趁此机会一起来认识一下球形闪电吧。01球状闪电存在吗?它好像是约有两个拳头大的暗白色火球。后来它靠近了,我看得很清楚。有两次它的外壳
向日葵智能插线板P2上手评测远程开关电脑生活如此方便科技的发展,让人们的生活变得简单,变得方便。随着智能手机等产品的大面积普及,如今人们已经全面进入智能生活,在这其中,离不开广大智能硬件的支持。今天,笔者想和大家聊一款智能插线板,就
百岁国医大师路志正身康体健,还可以出诊,他的养生方法值得借鉴路志正是有名的国医大师,出生于1920年的他今年102岁了。对于一般的百岁老人来说,这个年纪能够基本自理就是莫大的幸运,很多人这个年纪的老人只能在床上完全靠别人照顾。不过,多年精研
晨起第一杯水,很多人没喝对!怎么喝,喝多少,告诉你正确的方法相信大家都听说过早晨起来喝一杯白开水对于身体的新陈代谢有着很好的帮助,所以现在许多人都有清晨起来先喝杯水的习惯,这样既能够促进排便,又能够补充晚间丢失的水分,还能让大脑更快的清醒,