c#グローバルマウスイベント
1.Win32Api
パブリッククラスWin32Api { [StructLayout(LayoutKind.Sequential)] パブリッククラス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; } パブリックデリゲート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); }
2.マウスフック
パブリッククラス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 static int hMouseHook = 0; private const int WM_MOUSEMOVE = 0x200; プライベートconst int WM_LBUTTONDOWN = 0x201; プライベートconst int WM_RBUTTONDOWN = 0x204; プライベートconst int WM_MBUTTONDOWN = 0x207; プライベートconst int WM_LBUTTONUP = 0x202; プライベートconst int WM_RBUTTONUP = 0x205; プライベートconst int WM_MBUTTONUP = 0x208; プライベートconst int WM_LBUTTONDBLCLK = 0x203; プライベートconst int WM_RBUTTONDBLCLK = 0x206; プライベートconst int WM_MBUTTONDBLCLK = 0x209; 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); 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) { Win32Api.CallNextHookEx(hHook、nCode、wParam、lParam);を返します。 button = MouseButtons.Right; } else { MouseButtons button = MouseButtons.None; int clickCount = 0; スイッチ((Int32)wParam) { ケースWM_LBUTTONDOWN: ボタン= MouseButtons.Left; clickCount = 1; MouseDownEvent(this、new MouseEventArgs(button、clickCount、point.X、point.Y、0)); ブレーク; ケースWM_RBUTTONDOWN: MouseDownEvent(this、new MouseEventArgs(button、clickCount、point.X、point.Y、0)); clickCount = 1; ケースWM_RBUTTONUP: ブレーク; case WM_MBUTTONDOWN: button = MouseButtons.Middle; clickCount = 1; MouseDownEvent(this、new MouseEventArgs(button、clickCount、point.X、point.Y、0)); ブレーク; ケースWM_LBUTTONUP: ボタン= MouseButtons.Left; clickCount = 1; MouseUpEvent(this、new MouseEventArgs(button、clickCount、point.X、point.Y、0)); ブレーク; button = MouseButtons.Right; clickCount = 1; MouseUpEvent(this、new MouseEventArgs(button、clickCount、point.X、point.Y、0)); ブレーク; case WM_MBUTTONUP: button = MouseButtons.Middle; clickCount = 1; MouseUpEvent(this、new MouseEventArgs(button、clickCount、point.X、point.Y、0)); ブレーク; } this.Point = new Point(MyMouseHookStruct.pt.x、MyMouseHookStruct.pt.y); Win32Api.CallNextHookEx(hHook、nCode、wParam、lParam);を返します。 } } パブリックデリゲートvoid MouseMoveHandler(object sender、MouseEventArgs e); パブリックイベントMouseMoveHandler MouseMoveEvent; パブリックデリゲートvoid MouseClickHandler(object sender、MouseEventArgs e); パブリックイベントMouseClickHandler MouseClickEvent; パブリックデリゲートvoid MouseDownHandler(object sender、MouseEventArgs e); パブリックイベントMouseDownHandler MouseDownEvent; パブリックデリゲートvoid MouseUpHandler(object sender、MouseEventArgs e); パブリックイベントMouseUpHandler MouseUpEvent; }
3.電話する
MouseHook mh; Private void Form1_Load(object sender、EventArgs e) { mh = new MouseHook(); mh.SetHook(); mh.MouseDownEvent + = mh_MouseDownEvent; mh.MouseUpEvent + = mh_MouseUpEvent; } bool LeftTag = false; bool RightTag = false; ポイントp1 =新しいPoint(0,0); ポイントp2 =新しいPoint(0、0); //下鼠标键触発的事件 private void mh_MouseDownEvent(object sender、MouseEventArgs e) { if(e.Button == MouseButtons.Left) { LeftTag = true; richTextBox1.AppendText( "左ボタンが押されました\ n"); } if(e.Button == MouseButtons.Right) { RightTag = true; richTextBox1.AppendText( "Right clicked \ n"); } p1 = e.Location; } //マウスボタンを離すとトリガーされるイベント private void mh_MouseUpEvent(object sender、MouseEventArgs e) { p2 = e.Location; double value = Math.Sqrt(Math.Abs(p1.X-p2.X)* Math.Abs(p1.X-p2.X)+ Math。 Abs(p1.Y-p2.Y)* Math.Abs(p1.Y-p2.Y)); // if(LeftTag && RightTag && value> 100) // { // MessageBox.Show( "ok"); // } if(e.Button == MouseButtons。左) { richTextBox1.AppendText( "左ボタンが解放された\ n"); } if(e.Button == MouseButtons.Right) { richTextBox1.AppendText( "右ボタンが解放された\ n"); } richTextBox1.AppendText( "移動"+ Value +" distance \ n "); RightTag = false; LeftTag = false; p1 = new Point(0、0); p2 = new Point(0、0); } private void Form1_FormClosed(object sender、FormClosedEventArgs e ) { mh.UnHook(); }