为什么鼠标钩子proc执行了两次。 [英] why is the mouse hook proc executed two times.

查看:130
本文介绍了为什么鼠标钩子proc执行了两次。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我设置了一个鼠标挂钩来阻止消息WM_LBUTTONUP,但是对于我的suprive,钩子proc再次执行。为什么会发生?





I set a mouse hook to hold up the message WM_LBUTTONUP,but to my suprive ,the hook proc is executed once again.why does it happen ?


public partial class Form1 : Form
{
   MOUSEHOOK mouseHook = new MOUSEHOOK();
   MOUSEHOOK.HookHandle hookhandle = null;
   MOUSEHOOK.MouseHookStruct mhs = new MOUSEHOOK.MouseHookStruct();
       
   public Form1()
   {
      InitializeComponent();
   }
   private void Form1_Load(object sender, EventArgs e)
   {
      hookhandle = new MOUSEHOOK.HookHandle(HookProc);
      if (true == mouseHook.InstallHook(hookhandle))
      {
         Console.WriteLine("successed");
      }
      Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString());//10 
      Console.WriteLine(AppDomain.GetCurrentThreadId().ToString());//2588
   }
 
   //hook procedure 
   int HookProc(int nCode, int wParam, IntPtr lParam)
   {
      Marshal.PtrToStructure(lParam, mhs);
      switch (wParam)
      {
         case MOUSEHOOK.WM_LBUTTONUP:
            Console.WriteLine("how many times to enter?");//here print the sentence two times,
            break;
         default :
            break;
      }
 
      return MOUSEHOOK.CallNextHookEx(0, nCode, wParam, lParam);
   }
}

//hook class
public class MOUSEHOOK
{
   [DllImport("user32.dll")]
   private static extern int SetWindowsHookEx(int idHook, HookHandle HookProc, IntPtr hMod, int dwThreadId);
   //cancel
   [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
   private static extern bool UnhookWindowsHookEx(int idHook);
   //call next hook proc
   [DllImport("user32.dll")]
   public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);
   [DllImport("kernel32.dll")]
   public static extern int GetCurrentThreadId();
 
   [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 const int WH_MOUSE = 7;
   public const int WM_MOUSEMOVE = 0x200;
   public const int WM_LBUTTONDOWN = 0x201;
   public const int WM_LBUTTONUP = 0x202;
   public const int WM_NCLBUTTONDOWN = 0xA1;
   public const int WM_NCLBUTTONUP = 0xA2;
   public const int WM_NCMOUSEMOVE = 0xA0;
   public MouseHookStruct mhs = new MouseHookStruct();
   public int hhook;
   public delegate int HookHandle(int nCode, int wParam, IntPtr lParam);
 
   public bool InstallHook(HookHandle MouseProc)
   {
      hhook = SetWindowsHookEx(WH_MOUSE, MouseProc, IntPtr.Zero, GetCurrentThreadId());//AppDomain.GetCurrentThreadId()
      if (hhook != 0)
         return true;
      return false;
   }
   public void UnInstallHook()
   {
      bool ret = false;
      if (hhook != 0)
         ret = UnhookWindowsHookEx(hhook);
      if (ret)
         hhook = 0;
   }
}







推荐答案

这篇关于为什么鼠标钩子proc执行了两次。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆