WinForm中监听鼠标事件

WinForm中没有按钮,但鼠标左键点击WinForm中任一点时,需要获得鼠标位置,并触发某个函数;右击时同样需求。
...全文
1499 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
a184485789 2010-08-12
  • 打赏
  • 举报
回复
我的想法和楼上相同,为什么还需要钩子
k0mmDu 2010-08-12
  • 打赏
  • 举报
回复
不需要钩子的么
mouseclick事件
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right || e.Button == MouseButtons.Left)
{
Point p = MousePosition;//获取位置
//其他需要执行的代码
}

}
huwen7565833 2010-08-12
  • 打赏
  • 举报
回复
可以用钩子
chunquanwang 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hs1983 的回复:]
参考一下这个:http://msdn.microsoft.com/zh-cn/system.windows.forms.control.mouseposition(VS.85).aspx
[/Quote]
ding
  • 打赏
  • 举报
回复
以前没做过WinForm,麻烦说的详细点
maole413149 2010-08-12
  • 打赏
  • 举报
回复
错了,重写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);

}
maole413149 2010-08-12
  • 打赏
  • 举报
回复
如果是想点击鼠标的任意键都会触发的话,你可以重写 Point。 里面捕获 windows消息,然后判断到,就 可以做你想做的事情乐。
xrongzhen 2010-08-12
  • 打赏
  • 举报
回复
用API GetCursorPos()获取鼠标的位置 GetWindowRect获得窗体的范围 然后根据鼠标的位置和区域判断触发的事件。
walkghost 2010-08-12
  • 打赏
  • 举报
回复
楼主没做过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

xrongzhen 2010-08-12
  • 打赏
  • 举报
回复
用API GetCursorPos()获取鼠标的位置 GetWindowRect()获得窗口的区域,然后根据区域判断,鼠标落下时触发什么事件
ipots 2010-08-12
  • 打赏
  • 举报
回复
这好像也太简单了吧。接个分。
Ram_ningbi 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 dancingbit 的回复:]

MouseClick事件的参数中就带有坐标。
如果是Click事件,MousePosition可获取坐标,这是屏幕坐标,可使用PointToClient方法转换为相对坐标。
[/Quote]
不好意思。引用错误。请楼主删除。请见谅
Ram_ningbi 2010-08-12
  • 打赏
  • 举报
回复

private void Form1_MouseClick(object sender, MouseEventArgs e)
{
int x = e.X;
int y = e.Y;
}
这样就可以了。不过,这个是相对的坐标。如果想获取屏幕的坐标。好像还是要转换的
Ram_ningbi 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chunquanwang 的回复:]

引用 2 楼 hs1983 的回复:
参考一下这个:http://msdn.microsoft.com/zh-cn/system.windows.forms.control.mouseposition(VS.85).aspx

ding
[/Quote]
如果楼主说想做外挂的话还可以考虑
dancingbit 2010-08-12
  • 打赏
  • 举报
回复
MouseClick事件的参数中就带有坐标。
如果是Click事件,MousePosition可获取坐标,这是屏幕坐标,可使用PointToClient方法转换为相对坐标。
k0mmDu 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 shefei121 的回复:]

引用 11 楼 k0mmdu 的回复:

引用 8 楼 isline 的回复:

MousePosition获得的好像不是窗体中鼠标的位置?和鼠标实际位置有一个偏移值?

摘要:
获取鼠标光标的位置(以屏幕坐标表示)。
返回结果:
一个 System.Drawing.Point,它包含鼠标光标相对于屏幕左上角的坐标。ms是这样说的

引用 9 楼 shefei121 的回复……
[/Quote]
所有控件都要响应,还有什么其他办法么
其实写起来也就一句话么
foreach (var item in this.Controls)
{
((Control)item).MouseClick += new MouseEventHandler(Form1_MouseClick);
}
liuh6 2010-08-12
  • 打赏
  • 举报
回复
用钩子或mouseleft(right)click事件实现都可以..
gomoku 2010-08-12
  • 打赏
  • 举报
回复
public Form1()
{
this.MouseClick += new MouseEventHandler(Form1_MouseClick);
}
void Form1_MouseClick(object sender, MouseEventArgs e)
{
this.Text = e.Location.ToString();
}
加载更多回复(7)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧