WinForm中监听鼠标事件 WinForm中没有按钮,但鼠标左键点击WinForm中任一点时,需要获得鼠标位置,并触发某个函数;右击时同样需求。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 以前没做过WinForm,麻烦说的详细点 参考一下这个:http://msdn.microsoft.com/zh-cn/system.windows.forms.control.mouseposition(VS.85).aspx http://blog.csdn.net/sohighthesky/archive/2009/04/15/4074757.aspx 不需要钩子的么mouseclick事件private void Form1_MouseClick(object sender, MouseEventArgs e){ if (e.Button == MouseButtons.Right || e.Button == MouseButtons.Left) { Point p = MousePosition;//获取位置 //其他需要执行的代码 }} MousePosition获得的好像不是窗体中鼠标的位置?和鼠标实际位置有一个偏移值? 如果窗体被控件覆盖,鼠标点击到控件上是不会触发Form的MouseClick事件 摘要: 获取鼠标光标的位置(以屏幕坐标表示)。返回结果: 一个 System.Drawing.Point,它包含鼠标光标相对于屏幕左上角的坐标。ms是这样说的可以把所有控件的mouseclick都订阅到你的处理函数 MouseEventArgs中也有表示鼠标位置的point Location可以试试看有什么不同 经过试验MousePosition中的似乎是以银幕左上为0坐标的坐标值MouseEventArgs中的point Location是以窗口最左上为0坐标的坐标值 所有控件的MouseClick都注册,你不觉得太多了么。 public Form1(){ this.MouseClick += new MouseEventHandler(Form1_MouseClick);}void Form1_MouseClick(object sender, MouseEventArgs e){ this.Text = e.Location.ToString();} 用钩子或mouseleft(right)click事件实现都可以.. 所有控件都要响应,还有什么其他办法么其实写起来也就一句话么foreach (var item in this.Controls){ ((Control)item).MouseClick += new MouseEventHandler(Form1_MouseClick);} MouseClick事件的参数中就带有坐标。如果是Click事件,MousePosition可获取坐标,这是屏幕坐标,可使用PointToClient方法转换为相对坐标。 private void Form1_MouseClick(object sender, MouseEventArgs e) { int x = e.X; int y = e.Y; }这样就可以了。不过,这个是相对的坐标。如果想获取屏幕的坐标。好像还是要转换的 用API GetCursorPos()获取鼠标的位置 GetWindowRect()获得窗口的区域,然后根据区域判断,鼠标落下时触发什么事件 楼主没做过VC++的开发,消息循环要了解,windows应用程序的运行原理要了解。给个参考: #region 重写快捷键响应 protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { switch (keyData) { case Keys.F4: //F4 键 打开设置窗体 LoginForm lgfm = new LoginForm(); if (lgfm.ShowDialog() == DialogResult.OK) { TestForm testForm = new TestForm(); testForm.Show(); } return true; case Keys.Escape://ESC键退出程序 Application.Exit(); return true; } return base.ProcessCmdKey(ref msg, keyData); } #endregion 用API GetCursorPos()获取鼠标的位置 GetWindowRect获得窗体的范围 然后根据鼠标的位置和区域判断触发的事件。 如果是想点击鼠标的任意键都会触发的话,你可以重写 Point。 里面捕获 windows消息,然后判断到,就 可以做你想做的事情乐。 错了,重写WndProc方法。。 /// <summary> /// windows消息窗体 屏蔽鼠标操作 /// </summary> /// <param name="m"></param> protected override void WndProc(ref Message m) { if (m.Msg == 0x201 || m.Msg == 0x202 || m.Msg == 0x203 || m.Msg == 0x204 || m.Msg == 0x205 || m.Msg == 0x206 || m.Msg == 0x207 || m.Msg == 0x208 || m.Msg == 0x209) { return; } base.WndProc(ref m); } vs2010 安装与部署(自定义操作问题) 一个搜索的问题! (購)報表設計器 winform怎么找出图片上确定的位置? hashtable 问题 SQl 存储过程如何转换为oracle存储过程呢 怎么用winfrm程序对用javascript编码的中文进行解码? 谁能贴点代码给我:点击datagrid 的某行在combobox中显示当前行的某个字段的名称。谢谢!!!! 问一个很弱智的问题.net能做游戏吗? 使用 Socket.Receive 方法接收資料時要如何判斷資料已全部接收完畢?? = =、过来瞅瞅这个情况。小弟不才,郁闷到这了 jquery
mouseclick事件
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right || e.Button == MouseButtons.Left)
{
Point p = MousePosition;//获取位置
//其他需要执行的代码
}}
如果窗体被控件覆盖,鼠标点击到控件上是不会触发Form的MouseClick事件
获取鼠标光标的位置(以屏幕坐标表示)。
返回结果:
一个 System.Drawing.Point,它包含鼠标光标相对于屏幕左上角的坐标。ms是这样说的可以把所有控件的mouseclick都订阅到你的处理函数
可以试试看有什么不同
MouseEventArgs中的point Location是以窗口最左上为0坐标的坐标值
所有控件的MouseClick都注册,你不觉得太多了么。
{
this.MouseClick += new MouseEventHandler(Form1_MouseClick);
}
void Form1_MouseClick(object sender, MouseEventArgs e)
{
this.Text = e.Location.ToString();
}
其实写起来也就一句话么
foreach (var item in this.Controls)
{
((Control)item).MouseClick += new MouseEventHandler(Form1_MouseClick);
}
如果是Click事件,MousePosition可获取坐标,这是屏幕坐标,可使用PointToClient方法转换为相对坐标。
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
int x = e.X;
int y = e.Y;
}
这样就可以了。不过,这个是相对的坐标。如果想获取屏幕的坐标。好像还是要转换的
给个参考: #region 重写快捷键响应
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
switch (keyData)
{
case Keys.F4: //F4 键 打开设置窗体
LoginForm lgfm = new LoginForm();
if (lgfm.ShowDialog() == DialogResult.OK)
{
TestForm testForm = new TestForm();
testForm.Show();
}
return true;
case Keys.Escape://ESC键退出程序
Application.Exit();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
#endregion
。。 /// <summary>
/// windows消息窗体 屏蔽鼠标操作
/// </summary>
/// <param name="m"></param>
protected override void WndProc(ref Message m)
{ if (m.Msg == 0x201 || m.Msg == 0x202 || m.Msg == 0x203 || m.Msg == 0x204 || m.Msg == 0x205 || m.Msg == 0x206 || m.Msg == 0x207 || m.Msg == 0x208 || m.Msg == 0x209)
{
return;
}
base.WndProc(ref m); }