随笔 - 87  文章 - 1  评论 - 610 

模拟鼠标/键盘,(机器人,远程控制开发初步)大家一些研究!

鼠标操作类

using System;

 

namespace Edobnet.Net.Lib

{

     /// <summary>

     /// Mouse 的摘要说明。

     /// </summary>

     public class Mouse

     {

         public Mouse()

         {

              //

              // TODO: 在此处添加构造函数逻辑

              //

         }

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

         }

 

     }

}

 调用:

 Mouse.SetCursorPos(100,100);

 Mouse.LeftClick();//左键
 Mouse.RightClick();//右键

键盘操作可以用:
 SendKeys.SendWait();
Msn帮助:ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemWindowsFormsSendKeysClassTopic.htm



显示器一些操作:

using System;

using System.Runtime.InteropServices;

 

namespace Edobnet.Net.Lib

{

     /// <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);

 

         }

     }

}

 

消息控制:

using System;

 

namespace Edobnet.Net.Lib

{

     /// <summary>

     /// Window 的摘要说明。

     /// </summary>

     public class Windows

     {

         public Windows()

         {

              //

              // TODO: 在此处添加构造函数逻辑

              //

         }

         [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint="SendMessage")]

         public static extern int SendMessage (

              int hwnd,

              int wMsg,

              int wParam,

              int lParam

              );

     }

}

 

如:关闭显示器可以用:

Windows.SendMessage(this.Handle.ToInt32(),0x112,0xF170,2);

打开

Windows.SendMessage(this.Handle.ToInt32(),0x112,0xF170,-1);

DC的一些操作

using System;

using System.Runtime.InteropServices;

 

namespace Edobnet.Net.Lib

{

     /// <summary>

     /// DC 的摘要说明。

     /// </summary>

     public class DC

     {

         public DC()

         {

              //

              // TODO: 在此处添加构造函数逻辑

              //

         }

         [DllImport("gdi32.dll", EntryPoint="CreateDC")]

         public static extern int CreateDC (

              string lpDriverName,

              string lpDeviceName,

              string lpOutput,

              IntPtr lpInitData

              );

 

         [DllImport("gdi32.dll", EntryPoint="Rectangle")]

         public static extern int Rectangle (

              int hdc,

              int X1,

              int Y1,

              int X2,

              int Y2

              );

         [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]

         private static extern bool BitBlt(

              IntPtr hdcDest, //目标设备的句柄

              int nXDest,//目标对象的左上角的X坐标

              int nYDest,//目标对象的左上角的X坐标

              int nWidth,//目标对象的矩形的宽度

              int nHeight,//目标对象的矩形的长度

              IntPtr hdcSrc,//源设备的句柄

              int nXSrc,//源对象的左上角的X坐标

              int nYSrc,//源对象的左上角的X坐标

              System.Int32 dwRop//光栅的操作值

              );

     }

}

 

大家一些研究:edobnet@163.com
c++版本的控制也有,只是对鼠标操作还没有研究!

posted on 2004-06-09 09:43  edobnet  阅读(8270)  评论(11编辑  收藏