C 利用钩子控制鼠标【月儿原创】

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

               

C#利用钩子控制鼠标

作者:清清月儿

主页:http://blog.csdn.net/21aspnet/           时间:2007.5.11

工作中有这样的需求,某个控件panel的子控件textbox要实现只留鼠标右键copy,注意同时还不能影响其它panel的子控件textbox,怎么办?
答案是只有用钩子,在codeporject上找到这么一个钩子。

如图所示,第一个文本框只有copy功能。

C 利用钩子控制鼠标【月儿原创】_第1张图片


UserActivityHook.cs


using  System;
using  System.Runtime.InteropServices;
using  System.Reflection;
using  System.Threading;
using  System.Windows.Forms;
using  System.ComponentModel;

namespace  gma.System.Windows
... {
 
/**//// 
 
/// This class allows you to tap keyboard and mouse and / or to detect their activity even when an 
 
/// application runes in background or does not have any user interface at all. This class raises 
 
/// common .NET events with KeyEventArgs and MouseEventArgs so you can easily retrieve any information you need.
 
/// 

 public class UserActivityHook
 
...{
  
Windows structure definitions#region Windows structure definitions

  
/**//// 
  
/// The POINT structure defines the x- and y- coordinates of a point. 
  
/// 

  
/// 
  
/// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/rectangl_0tiq.asp
  
/// 

  [StructLayout(LayoutKind.Sequential)]
   
private class POINT
  
...{
   
/**//// 
   
/// Specifies the x-coordinate of the point. 
   
/// 

   public int x;
   
/**//// 
   
/// Specifies the y-coordinate of the point. 
   
/// 

   public int y;
  }


  
/**//// 
  
/// The MOUSEHOOKSTRUCT structure contains information about a mouse event passed to a WH_MOUSE hook procedure, MouseProc. 
  
/// 

  
/// 
  
/// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookstructures/cwpstruct.asp
  
/// 

  [StructLayout(LayoutKind.Sequential)]
   
private class MouseHookStruct
  
...{
   
/**//// 
   
/// Specifies a POINT structure that contains the x- and y-coordinates of the cursor, in screen coordinates. 
   
/// 

   public POINT pt;
   
/**//// 
   
/// Handle to the window that will receive the mouse message corresponding to the mouse event. 
   
/// 

   public int hwnd;
   
/**//// 
   
/// Specifies the hit-test value. For a list of hit-test values, see the description of the WM_NCHITTEST message. 
   
/// 

   public int wHitTestCode;
   
/**//// 
   
/// Specifies extra information associated with the message. 
   
/// 

   public int dwExtraInfo;
  }


  
/**//// 
  
/// The MSLLHOOKSTRUCT structure contains information about a low-level keyboard input event. 
  
/// 

  [StructLayout(LayoutKind.Sequential)]
   
private class MouseLLHookStruct
  
...{
   
/**//// 
   
/// Specifies a POINT structure that contains the x- and y-coordinates of the cursor, in screen coordinates. 
   
/// 

   public POINT pt;
   
/**//// 
   
/// If the message is WM_MOUSEWHEEL, the high-order word of this member is the wheel delta. 
   
/// The low-order word is reserved. A positive value indicates that the wheel was rotated forward, 
   
/// away from the user; a negative value indicates that the wheel was rotated backward, toward the user. 
   
/// One wheel click is defined as WHEEL_DELTA, which is 120. 
   
///If the message is WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK, WM_NCXBUTTONDOWN, WM_NCXBUTTONUP,
   
/// or WM_NCXBUTTONDBLCLK, the high-order word specifies which X button was pressed or released, 
   
/// and the low-order word is reserved. This value can be one or more of the following values. Otherwise, mouseData is not used. 
   
///XBUTTON1
   
///The first X button was pressed or released.
   
///XBUTTON2
   
///The second X button was pressed or released.
   
/// 

   public int mouseData;
   
/**//// 
   
/// Specifies the event-injected flag. An application can use the following value to test the mouse flags. Value Purpose 
   
///LLMHF_INJECTED Test the event-injected flag.  
   
///0
   
///Specifies whether the event was injected. The value is 1 if the event was injected; otherwise, it is 0.
   
///1-15
   
///Reserved.
   
/// 

   public int flags;
   
/**//// 
   
/// Specifies the time stamp for this message.
   
/// 

   public int time;
   
/**//// 
   
/// Specifies extra information associated with the message. 
   
/// 

   public int dwExtraInfo;
  }



  
/**//// 
  
/// The KBDLLHOOKSTRUCT structure contains information about a low-level keyboard input event. 
  
/// 

  
/// 
  
/// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookstructures/cwpstruct.asp
  
/// 

  [StructLayout(LayoutKind.Sequential)]
   
private class KeyboardHookStruct
  
...{
   
/**//// 
   
/// Specifies a virtual-key code. The code must be a value in the range 1 to 254. 
   
/// 

   public int vkCode;
   
/**//// 
   
/// Specifies a hardware scan code for the key. 
   
/// 

   public int scanCode;
   
/**//// 
   
/// Specifies the extended-key flag, event-injected flag, context code, and transition-state flag.
   
/// 

   public int flags;
   
/**//// 
   
/// Specifies the time stamp for this message.
   
/// 

   public int time;
   
/**//// 
   
/// Specifies extra information associated with the message. 
   
/// 

   public int dwExtraInfo;
  }

  
#endregion


  
Windows function imports#region Windows function imports
  
/**//// 
  
/// The SetWindowsHookEx function installs an application-defined hook procedure into a hook chain. 
  
/// You would install a hook procedure to monitor the system for certain types of events. These events 
  
/// are associated either with a specific thread or with all threads in the same desktop as the calling thread. 
  
/// 

  
/// 
  
/// [in] Specifies the type of hook procedure to be installed. This parameter can be one of the following values.
  
/// 
  
/// 
  
/// [in] Pointer to the hook procedure. If the dwThreadId parameter is zero or specifies the identifier of a 
  
/// thread created by a different process, the lpfn parameter must point to a hook procedure in a dynamic-link 
  
/// library (DLL). Otherwise, lpfn can point to a hook procedure in the code associated with the current process.
  
/// 
  
/// 
  
/// [in] Handle to the DLL containing the hook procedure pointed to by the lpfn parameter. 
  
/// The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by 
  
/// the current process and if the hook procedure is within the code associated with the current process. 
  
/// 
  
/// 
  
/// [in] Specifies the identifier of the thread with which the hook procedure is to be associated. 
  
/// If this parameter is zero, the hook procedure is associated with all existing threads running in the 
  
/// same desktop as the calling thread. 
  
/// 
  
/// 
  
/// If the function succeeds, the return value is the handle to the hook procedure.
  
/// If the function fails, the return value is NULL. To get extended error information, call GetLastError.
  
/// 
  
/// 
  
/// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.asp
  
/// 

  [DllImport("user32.dll", CharSet = CharSet.Auto,
    CallingConvention 
= CallingConvention.StdCall, SetLastError = true)]
  
private static extern int SetWindowsHookEx(
   
int idHook,
   HookProc lpfn,
   IntPtr hMod,
   
int dwThreadId);

  
/**//// 
  
/// The UnhookWindowsHookEx function removes a hook procedure installed in a hook chain by the SetWindowsHookEx function. 
  
/// 

  
/// 
  
/// [in] Handle to the hook to be removed. This parameter is a hook handle obtained by a previous call to SetWindowsHookEx. 
  
/// 
  
/// 
  
/// If the function succeeds, the return value is nonzero.
  
/// If the function fails, the return value is zero. To get extended error information, call GetLastError.
  
/// 
  
/// 
  
/// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.asp
  
/// 

  [DllImport("user32.dll", CharSet = CharSet.Auto,
    CallingConvention 
= CallingConvention.StdCall, SetLastError = true)]
  
private static extern int UnhookWindowsHookEx(int idHook);

  
/**//// 
  
/// The CallNextHookEx function passes the hook information to the next hook procedure in the current hook chain. 
  
/// A hook procedure can call this function either before or after processing the hook information. 
  
/// 

  
/// Ignored.
  
/// 
  
/// [in] Specifies the hook code passed to the current hook procedure. 
  
/// The next hook procedure uses this code to determine how to process the hook information.
  
/// 
  
/// 
  
/// [in] Specifies the wParam value passed to the current hook procedure. 
  
/// The meaning of this parameter depends on the type of hook associated with the current hook chain. 
  
/// 
  
/// 
  
/// [in] Specifies the lParam value passed to the current hook procedure. 
  
/// The meaning of this parameter depends on the type of hook associated with the current hook chain. 
  
/// 

你可能感兴趣的:(C 利用钩子控制鼠标【月儿原创】)