zoukankan      html  css  js  c++  java
  • 模拟鼠标/键盘 .NET实现

     
    namespace WinFormsApp_ImitateMouseAndKeyboard
    {
     
        /// <summary>
        /// Mouse 的摘要说明。
        /// </summary>
        public class Mouse
        {
            internal const byte SM_MOUSEPRESENT = 19;
            internal const byte SM_CMOUSEBUTTONS = 43;
            internal const byte SM_MOUSEWHEELPRESENT = 75;
     
            public const int MOUSEEVENTF_LEFTDOWN = 0x2;
            public const int MOUSEEVENTF_LEFTUP = 0x4;
            public const int MOUSEEVENTF_MIDDLEDOWN = 0x20;
            public const int MOUSEEVENTF_MIDDLEUP = 0x40;
            public const int MOUSEEVENTF_MOVE = 0x1;
            public const int MOUSEEVENTF_RIGHTDOWN = 0x8;
            public const int MOUSEEVENTF_RIGHTUP = 0x10;
     
            public struct POINTAPI
            {
                public int x;
                public int y;
            }
     
            public struct RECT
            {
                public int left;
                public int top;
                public int right;
                public int bottom;
            }
     
            [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SwapMouseButton")]
            public extern static int SwapMouseButton(int bSwap);
     
            [System.Runtime.InteropServices.DllImport("user32", EntryPoint = "ClipCursor")]
            public extern static int ClipCursor(ref RECT lpRect);
     
            [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "GetCursorPos")]
            public extern static int GetCursorPos(ref POINTAPI lpPoint);
     
            [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "ShowCursor")]
            public extern static bool ShowCursor(bool bShow);
     
            [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "EnableWindow")]
            public extern static int EnableWindow(int hwnd, int fEnable);
     
            [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "GetWindowRect")]
            public extern static int GetWindowRect(int hwnd, ref RECT lpRect);
     
            [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetCursorPos")]
            public extern static int SetCursorPos(int x, int y);
     
            [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "GetSystemMetrics")]
            public extern static int GetSystemMetrics(int nIndex);
     
            [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetDoubleClickTime")]
            public extern static int SetDoubleClickTime(int wCount);
     
            [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "GetDoubleClickTime")]
            public extern static int GetDoubleClickTime();
     
            [System.Runtime.InteropServices.DllImport("kernel32.DLL", EntryPoint = "Sleep")]
            public extern static void Sleep(int dwMilliseconds);
     
            [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "mouse_event")]
            public static extern void mouse_event(
                 int dwFlags,
                 int dx,
                 int dy,
                 int cButtons,
                 int dwExtraInfo
                 );
     
            //得到鼠标相对与全屏的坐标,不是相对与你的Form的,且与你的分辨率有关系
     
            public static int FullScreenPosition_X
            {
                get
                {
                    POINTAPI _POINTAPI = new POINTAPI();
     
                    GetCursorPos(ref _POINTAPI);
     
                    return _POINTAPI.x;
                }
            }
     
            public static int FullScreenPosition_Y
            {
                get
                {
                    POINTAPI _POINTAPI = new POINTAPI();
     
                    GetCursorPos(ref _POINTAPI);
     
                    return _POINTAPI.y;
                }
            }
     
            // 隐藏 显示 鼠标
     
            public static void Hide()
            {
                ShowCursor(false);
            }
     
            public static void Show()
            {
                ShowCursor(true);
            }
     
            // 将鼠标锁定在你的Form里 不过你得将你的Form先锁了,Form Resize 就失效了
     
            public static void Lock(System.Windows.Forms.Form ObjectForm)
            {
                RECT _FormRect = new RECT();
     
                GetWindowRect(ObjectForm.Handle.ToInt32(), ref _FormRect);
     
                ClipCursor(ref _FormRect);
            }
     
            public static void UnLock()
            {
                RECT _ScreenRect = new RECT();
     
                _ScreenRect.top = 0;
                _ScreenRect.left = 0;
                _ScreenRect.bottom = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Bottom;
                _ScreenRect.right = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Right;
     
                ClipCursor(ref _ScreenRect);
            }
     
            // 鼠标失效,不过失效的好像不只是鼠标,小心哦
     
            public static void Disable(System.Windows.Forms.Form ObjectForm)
            {
                EnableWindow(ObjectForm.Handle.ToInt32(), 0);
            }
     
            public static void Enable(System.Windows.Forms.Form ObjectForm)
            {
                EnableWindow(ObjectForm.Handle.ToInt32(), 1);
            }
     
            // 鼠标自己移动 很想动画哦 参数是2个控件的handle
            // 看这个方法前,先用凉水擦把脸。。。 反正我写的时候 头晕
     
            public static void Move(int From_Handle_ToInt32, int To_Handle_ToInt32)
            {
                RECT rectFrom = new RECT();
                RECT rectTo = new RECT();
     
                int i;
     
                GetWindowRect(From_Handle_ToInt32, ref rectFrom);
                GetWindowRect(To_Handle_ToInt32, ref rectTo);
     
                if ((rectFrom.left + rectFrom.right) / 2 - (rectTo.left + rectTo.right) / 2 > 0)
                {
                    for (i = (rectFrom.left + rectFrom.right) / 2; i >= (rectTo.left + rectTo.right) / 2; i--)
                    {
                        SetCursorPos(i, (rectFrom.top + rectFrom.bottom) / 2);
                        Sleep(1);
                    }
                }
                else
                {
                    for (i = (rectFrom.left + rectFrom.right) / 2; i <= (rectTo.left + rectTo.right) / 2; i++)
                    {
                        SetCursorPos(i, (rectFrom.top + rectFrom.bottom) / 2);
                        Sleep(1);
                    }
                }
     
                if ((rectFrom.top + rectFrom.bottom) / 2 - (rectTo.top + rectTo.bottom) / 2 > 0)
                {
                    for (i = (rectFrom.top + rectFrom.bottom) / 2; i >= (rectTo.top + rectTo.bottom) / 2; i--)
                    {
                        SetCursorPos((rectTo.left + rectTo.right) / 2, i);
                        Sleep(1);
                    }
                }
                else
                {
                    for (i = (rectFrom.top + rectFrom.bottom) / 2; i <= (rectTo.top + rectTo.bottom) / 2; i++)
                    {
                        SetCursorPos((rectTo.left + rectTo.right) / 2, i);
                        Sleep(1);
                    }
                }
            }
     
            // 得到你的鼠标类型
     
            public static string Type
            {
                get
                {
                    if (GetSystemMetrics(SM_MOUSEPRESENT) == 0)
                    {
                        return "本计算机尚未安装鼠标";
                    }
                    else
                    {
                        if (GetSystemMetrics(SM_MOUSEWHEELPRESENT) != 0)
                        {
                            return GetSystemMetrics(SM_CMOUSEBUTTONS) + "键滚轮鼠标";
                        }
                        else
                        {
                            return GetSystemMetrics(SM_CMOUSEBUTTONS) + "键鼠标";
                        }
                    }
                }
            }
     
            // 设置鼠标双击时间
     
            public static void DoubleClickTime_Set(int MouseDoubleClickTime)
            {
                SetDoubleClickTime(MouseDoubleClickTime);
            }
     
            public static string DoubleClickTime_Get()
            {
                return GetDoubleClickTime().ToString();
            }
     
            // 设置鼠标默认主键 我是没有见过谁左手用鼠标
     
            public static void DefaultRightButton()
            {
                SwapMouseButton(1);
            }
     
            public static void DefaultLeftButton()
            {
                SwapMouseButton(0);
            }
            private static void LeftDown()
            {
                mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
            }
            private static void LeftUp()
            {
                mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
            }
            public static void LeftClick()
            {
                LeftDown();
                LeftUp();
            }
            private static void MiddleDown()
            {
                mouse_event(MOUSEEVENTF_MIDDLEDOWN, 0, 0, 0, 0);
            }
            private static void MiddleUp()
            {
                mouse_event(MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0);
            }
            public static void MiddleClick()
            {
                MiddleDown();
                MiddleUp();
            }
            private static void RightDown()
            {
                mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
            }
            private static void RightUp()
            {
                mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
            }
            public static void RightClick()
            {
                RightDown();
                RightUp();
            }
     
        }
    }
    using System.Runtime.InteropServices;
     
    namespace WinFormsApp_ImitateMouseAndKeyboard
    {
        /// <summary>
        /// Screen 的摘要说明。
        /// </summary>
        public class Screen
        {
            public enum DMDO
            {
                DEFAULT = 0,
                D90 = 1,
                D180 = 2,
                D270 = 3
            }
     
            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
            struct DEVMODE
            {
                public const int DM_DISPLAYFREQUENCY = 0x400000;
                public const int DM_PELSWIDTH = 0x80000;
                public const int DM_PELSHEIGHT = 0x100000;
                private const int CCHDEVICENAME = 32;
                private const int CCHFORMNAME = 32;
     
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHDEVICENAME)]
                public string dmDeviceName;
                public short dmSpecVersion;
                public short dmDriverVersion;
                public short dmSize;
                public short dmDriverExtra;
                public int dmFields;
     
                public int dmPositionX;
                public int dmPositionY;
                public DMDO dmDisplayOrientation;
                public int dmDisplayFixedOutput;
     
                public short dmColor;
                public short dmDuplex;
                public short dmYResolution;
                public short dmTTOption;
                public short dmCollate;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHFORMNAME)]
                public string dmFormName;
                public short dmLogPixels;
                public int dmBitsPerPel;
                public int dmPelsWidth;
                public int dmPelsHeight;
                public int dmDisplayFlags;
                public int dmDisplayFrequency;
                public int dmICMMethod;
                public int dmICMIntent;
                public int dmMediaType;
                public int dmDitherType;
                public int dmReserved1;
                public int dmReserved2;
                public int dmPanningWidth;
                public int dmPanningHeight;
            }
     
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            //static extern int ChangeDisplaySettings( DEVMODE lpDevMode,  int dwFlags);
     
            static extern int ChangeDisplaySettings([In] ref DEVMODE lpDevMode, int dwFlags);
            public Screen()
            {
                //
                // TODO: 在此处添加构造函数逻辑
                //
            }
            public static void changeScree(int W, int H, int F, out long RetVal)
            {
                RetVal = 0;
                DEVMODE dm = new DEVMODE();
                dm.dmSize = (short)Marshal.SizeOf(typeof(DEVMODE));
                dm.dmPelsWidth = W;
                dm.dmPelsHeight = H;
                dm.dmDisplayFrequency = F;
                dm.dmFields = DEVMODE.DM_PELSWIDTH | DEVMODE.DM_PELSHEIGHT | DEVMODE.DM_DISPLAYFREQUENCY;
                RetVal = ChangeDisplaySettings(ref dm, 0);
     
            }
        }
    }
     
    namespace WinFormsApp_ImitateMouseAndKeyboard
    {
        /// <summary>
        /// Window 的摘要说明。
        /// </summary>
        public class Windows
        {
            [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SendMessage")]
            public static extern int SendMessage(
                 int hwnd,
                 int wMsg,
                 int wParam,
                 int lParam
                 );
        }
    }

    //模拟鼠标/键盘:

            //调用:
            Mouse.SetCursorPos(MousePosition.X, MousePosition.Y);//(100, 100);
            Mouse.LeftClick();//左键
            Mouse.RightClick();//右键

            //键盘操作可以用:
            // SendKeys.SendWait();
            //想了解更多,请查询SystemWindowsFormsSendKeysClass相关信息

     

            //如:
            //关闭显示器可以用:
            //Windows.SendMessage(this.Handle.ToInt32(),0x112,0xF170,2);
            //打开
            //Windows.SendMessage(this.Handle.ToInt32(),0x112,0xF170,-1);

  • 相关阅读:
    PHP实现无限极分类
    html2canvas生成并下载图片
    一次线上问题引发的过程回顾和思考,以更换两台服务器结束
    Intellij IDEA启动项目报Command line is too long. Shorten command line for XXXApplication or also for
    mq 消费消息 与发送消息传参问题
    idea 创建不了 java 文件
    Java switch 中如何使用枚举?
    Collections排序
    在idea 设置 git 的用户名
    mongodb添加字段和创建自增主键
  • 原文地址:https://www.cnblogs.com/jx270/p/2962415.html
Copyright © 2011-2022 走看看