RaUI/Source/MyDb/_SCREEN_CAPTURE/MouseHook.cs
鑫Intel a3f978b187 ### 2021-06-12更新
------
#### Itrycn_Project2    V1.0.2106.1201
- *.[新增]新增加入皮肤功能。
- *.[新增]对话框全部使用皮肤。
- *.[新增]新增加入扫描模板,快速开发扫描功能。
- *.[改进]公共变量进行区分设置,更加规范。
2021-06-12 22:09:49 +08:00

239 lines
7.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;
#pragma warning disable CS0649 // 命名样式
namespace _SCREEN_CAPTURE
{
/// <summary>
///
/// </summary>
internal class MouseHook
{
#region Win32
/// <summary>
///
/// </summary>
/// <param name="idHook"></param>
/// <param name="lpfn"></param>
/// <param name="hmod"></param>
/// <param name="dwThreadid"></param>
/// <returns></returns>
[DllImport("user32.dll")] //设置钩子 第二个参数为回调函数指针
public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hmod, int dwThreadid);
/// <summary>
///
/// </summary>
/// <param name="hHook"></param>
/// <param name="nCode"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
[DllImport("user32.dll")] //传递到下一个钩子
public static extern int CallNextHookEx(IntPtr hHook, int nCode, IntPtr wParam, IntPtr lParam);
/// <summary>
///
/// </summary>
/// <param name="hHook"></param>
/// <returns></returns>
[DllImport("user32.dll")] //卸载钩子
public static extern bool UnhookWindowsHookEx(IntPtr hHook);
/// <summary>
///
/// </summary>
/// <param name="lpModuleName"></param>
/// <returns></returns>
[DllImport("kernel32.dll")] //获取模块句柄
public static extern IntPtr GetModuleHandle(string lpModuleName);
private const int WH_MOUSE_LL = 14;//全局鼠标Hook 7是局部的 13全局键盘 2局部键盘
private const uint WM_LBUTTONDOWN = 0x201;
private const uint WM_LBUTTONUP = 0x202;
private const uint WM_RBUTTONDOWN = 0x204;
private const uint WM_RBUTTONUP = 0x205;
/// <summary>
///
/// </summary>
public struct POINT
{
/// <summary>
///
/// </summary>
public int X;
/// <summary>
///
/// </summary>
public int Y;
}
/// <summary>
/// 鼠标结构信息
/// </summary>
public struct MSLLHOOTSTRUCT
{
/// <summary>
///
/// </summary>
public POINT pt;
/// <summary>
///
/// </summary>
public int mouseData;
/// <summary>
///
/// </summary>
public int flags;
/// <summary>
///
/// </summary>
public int time;
/// <summary>
///
/// </summary>
public int dwExtraInfo;
}
#endregion
/// <summary>
///
/// </summary>
/// <param name="nCode"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public delegate void MHookEventHandler(object sender, MHookEventArgs e);
/// <summary>
///
/// </summary>
public event MHookEventHandler MHookEvent;
private IntPtr hHook = IntPtr.Zero;
/// <summary>
///
/// </summary>
public IntPtr HHook {
get { return hHook; }
}
GCHandle gc;
//Hook回调函数
private int MouseHookProcedure(int nCode, IntPtr wParam, IntPtr lParam) {
if (nCode >= 0 && MHookEvent != null) {
MSLLHOOTSTRUCT stMSLL = (MSLLHOOTSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOTSTRUCT));
ButtonStatus btnStatus = ButtonStatus.None;
if (wParam == (IntPtr)WM_LBUTTONDOWN)
btnStatus = ButtonStatus.LeftDown;
else if (wParam == (IntPtr)WM_LBUTTONUP)
btnStatus = ButtonStatus.LeftUp;
else if (wParam == (IntPtr)WM_RBUTTONDOWN)
btnStatus = ButtonStatus.RightDown;
else if (wParam == (IntPtr)WM_RBUTTONUP)
btnStatus = ButtonStatus.RightUp;
MHookEvent(this, new MHookEventArgs(btnStatus, stMSLL.pt.X, stMSLL.pt.Y));
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
/// <summary>
/// 设置Hook
/// </summary>
/// <returns></returns>
public bool SetHook() {
if (hHook != IntPtr.Zero)
return false;
HookProc mouseCallBack = new HookProc(MouseHookProcedure);
hHook = SetWindowsHookEx(WH_MOUSE_LL, mouseCallBack,
GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
if (hHook != IntPtr.Zero) {
gc = GCHandle.Alloc(mouseCallBack);
return true;
}
return false;
}
/// <summary>
/// 卸载Hook
/// </summary>
/// <returns></returns>
public bool UnLoadHook() {
if (hHook == IntPtr.Zero)
return false;
if (UnhookWindowsHookEx(hHook)) {
hHook = IntPtr.Zero;
gc.Free();
return true;
}
return false;
}
}
/// <summary>
/// 鼠标状态枚举值
/// </summary>
internal enum ButtonStatus {
/// <summary>
///
/// </summary>
LeftDown,
/// <summary>
///
/// </summary>
LeftUp,
/// <summary>
///
/// </summary>
RightDown,
/// <summary>
///
/// </summary>
RightUp,
/// <summary>
///
/// </summary>
None }
/// <summary>
/// 事件参数
/// </summary>
internal class MHookEventArgs : EventArgs
{
private readonly ButtonStatus mButton;
/// <summary>
///
/// </summary>
public ButtonStatus MButton {
get { return mButton; }
}
private readonly int x;
/// <summary>
///
/// </summary>
public int X {
get { return x; }
}
private readonly int y;
/// <summary>
///
/// </summary>
public int Y {
get { return y; }
}
/// <summary>
///
/// </summary>
/// <param name="btn"></param>
/// <param name="cx"></param>
/// <param name="cy"></param>
public MHookEventArgs(ButtonStatus btn, int cx, int cy) {
this.mButton = btn;
this.x = cx;
this.y = cy;
}
}
}