c#怎么监听程序窗体外的鼠标点击事件啊?

s15885823584 2014-10-10 02:17:16
我在网上找到一个例子,自己试了一下,鼠标的移动监听可以实现,点击监听实现不了。具体代码如下:

第一个类:
 public class Win32Api
{
[StructLayout(LayoutKind.Sequential)]
public class POINT
{
public int x;
public int y;
}
[StructLayout(LayoutKind.Sequential)]
public class MouseHookStruct
{
public POINT pt;
public int hwnd;
public int wHitTestCode;
public int dwExtraInfo;
}
public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
//安装钩子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
//卸载钩子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
//调用下一个钩子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);
}



第二个类:
 public class MouseHook
{

private Point point;
private Point Point
{
get { return point; }
set
{
if (point != value)
{
point = value;
if (MouseMoveEvent != null)
{
var e = new MouseEventArgs(MouseButtons.Left, 0, point.X, point.Y, 0);
MouseMoveEvent(this, e);
}
}
}
}
private int hHook;
public const int WH_MOUSE_LL = 14;
public Win32Api.HookProc hProc;
public MouseHook()
{
this.Point = new Point();
}
public int SetHook()
{
hProc = new Win32Api.HookProc(MouseHookProc);
hHook = Win32Api.SetWindowsHookEx(WH_MOUSE_LL, hProc, IntPtr.Zero,0);
return hHook;
}
public void UnHook()
{
Win32Api.UnhookWindowsHookEx(hHook);
}
private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
Win32Api.MouseHookStruct MyMouseHookStruct = (Win32Api.MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.MouseHookStruct));
if (nCode < 0)
{
return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);
}
else
{
this.Point = new Point(MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y);
return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);
}
}
//委托+事件(把钩到的消息封装为事件,由调用者处理)
public delegate void MouseMoveHandler(object sender, MouseEventArgs e);
public event MouseMoveHandler MouseMoveEvent;

public delegate void MouseClickHandler(object sender, MouseEventArgs e);
public event MouseClickHandler MouseClickEvent;
}



操作:

 public partial class getLocationForm : Form
{
public getLocationForm(int[] location)
{
InitializeComponent();
}

MouseHook mh;
private void getLocationForm_Load(object sender, EventArgs e)
{
mh = new MouseHook();
mh.SetHook();
mh.MouseMoveEvent += mh_MouseMoveEvent;
mh.MouseClickEvent += mh_MouseClickEvent;

}

private void mh_MouseClickEvent(object sender, MouseEventArgs e)
{
MessageBox.Show(e.X + "-" + e.Y);
}

private void mh_MouseMoveEvent(object sender, MouseEventArgs e)
{
int x = e.Location.X;
int y = e.Location.Y;
textBox1.Text = x + "";
textBox2.Text = y + "";
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
mh.UnHook();
}

}



也就是说移动鼠标时能执行private void mh_MouseMoveEvent(object sender, MouseEventArgs e)这个函数里的内容,但鼠标点击时不能执行 private void mh_MouseClickEvent(object sender, MouseEventArgs e)这个函数的内容。

问题就是怎么改才能实现鼠标点击监听呢?
...全文
4191 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_29475157 2016-07-08
  • 打赏
  • 举报
回复
!!!!!!!
Blue布丁 2014-10-11
  • 打赏
  • 举报
回复
MouseClickEvent的方法没写对吧
notax 2014-10-11
  • 打赏
  • 举报
回复
再指定MouseButtons.Left

private void mh_MouseClickEvent(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                MessageBox.Show(e.X + "-" + e.Y);
            }
        }
notax 2014-10-11
  • 打赏
  • 举报
回复
改了改 MouseEventArgs(MouseButtons.None,再加个MouseClickEvent(this, e);就行

    public class MouseHook
    {
        private Point point;
        private Point Point
        {
            get { return point; }
            set
            {
                if (point != value)
                {
                    point = value;
                    if (MouseMoveEvent != null)
                    {
                        var e = new MouseEventArgs(MouseButtons.None, 0, point.X, point.Y, 0);
                        MouseMoveEvent(this, e);
                    }
                }
            }
        }
        private int hHook;
        private const int WM_LBUTTONDOWN = 0x201;
        public const int WH_MOUSE_LL = 14;
        public Win32Api.HookProc hProc;
        public MouseHook()
        {
            this.Point = new Point();
        }
        public int SetHook()
        {
            hProc = new Win32Api.HookProc(MouseHookProc);
            hHook = Win32Api.SetWindowsHookEx(WH_MOUSE_LL, hProc, IntPtr.Zero, 0);
            return hHook;
        }
        public void UnHook()
        {
            Win32Api.UnhookWindowsHookEx(hHook);
        }
        private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
        {
            Win32Api.MouseHookStruct MyMouseHookStruct = (Win32Api.MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.MouseHookStruct));
            if (nCode < 0)
            {
                return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);
            }
            else
            {
                if (MouseClickEvent != null)
                {
                    MouseButtons button = MouseButtons.None;
                    int clickCount = 0;
                    switch ((Int32)wParam)
                    {
                        case WM_LBUTTONDOWN: 
                            button = MouseButtons.Left;
                            clickCount = 1;
                            break;
                    }

                    var e = new MouseEventArgs(button, clickCount, point.X, point.Y, 0);
                    MouseClickEvent(this, e);
                }
                this.Point = new Point(MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y);
                return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);
            }
        }
    
        public delegate void MouseMoveHandler(object sender, MouseEventArgs e);
        public event MouseMoveHandler MouseMoveEvent;

        public delegate void MouseClickHandler(object sender, MouseEventArgs e);
        public event MouseClickHandler MouseClickEvent;
    }
jy251 2014-10-10
  • 打赏
  • 举报
回复
你的代码里面,我上面赋值的那句话 你就处理了 this.Point = new Point(MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y); 之触发了move的event
jy251 2014-10-10
  • 打赏
  • 举报
回复
错了,是这里 Win32Api.MouseHookStruct MyMouseHookStruct = (Win32Api.MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.MouseHookStruct)); 看了一晚上的帖子了···
jy251 2014-10-10
  • 打赏
  • 举报
回复
hHook = Win32Api.SetWindowsHookEx(WH_MOUSE_LL, hProc, IntPtr.Zero,0); 你只写了hook鼠标移动
於黾 2014-10-10
  • 打赏
  • 举报
回复
我发现越是菜鸟,越喜欢研究些高大上的东西,比如IE直接操作客户机,修改其他程序的内存变量,进程通信,截获系统鼠标事件什么的 就不敢先从基础开始研究嘛
s15885823584 2014-10-10
  • 打赏
  • 举报
回复
楼上各位,在哪儿加语句啊,怎么加,求赐教啊,楼主是菜鸟
Forty2 2014-10-10
  • 打赏
  • 举报
回复
提示一下:MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)中的wParam就是鼠标动作,可以是 WM_LBUTTONDOWN, WM_MOUSEMOVE, WM_MOUSEWHEEL等等。 如果你志在搬代码而不求甚解,...
bdmh 2014-10-10
  • 打赏
  • 举报
回复
你应该在hook的回调中判断是否有鼠标按下,然后执行click委托
gxingmin 2014-10-10
  • 打赏
  • 举报
回复
你MouseHook类里对MouseMoveEvent事件处理了,没对 MouseClickEvent事件处理
bdmh 2014-10-10
  • 打赏
  • 举报
回复
你在private Point Point中只执行了move委托,你在哪执行了click委托啊

111,107

社区成员

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

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

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