c#グローバルマウスイベント

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(); 
        }

コードをコピー

17件の元の記事を公開 228のような 330,000以上を訪問

おすすめ

転載: blog.csdn.net/cxu123321/article/details/105490016