用c#实现控制鼠标位置的方法 (转载)

本文介绍了一种在C#中模拟键盘与鼠标操作的技术。包括切换键盘锁(大小写、滚动锁定、数字键盘锁)、模拟鼠标移动及点击等。通过调用Windows API函数实现,适用于自动化测试或辅助功能开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using  System;  
using  System.Runtime.InteropServices;  
using  System.Text;  
namespace  ConsoleApplication8{  
class  Class1{  
[STAThread]  
static  void  Main(string[]  args){  
//  Display  current  status  of  keys.  
Console.WriteLine(  
"**BEFORE**/r/nCAP:  {0}/r/nSCR:  {1}/r/nNUM:  {2}",    
Keyboard.GetState(VirtualKeys.VK_CAPITAL)?"ON":"OFF",  
Keyboard.GetState(VirtualKeys.VK_SCROLL)?"ON":"OFF",  
Keyboard.GetState(VirtualKeys.VK_NUMLOCK)?"ON":"OFF"  
);  
//  Toggle  all  the  keys:  
Keyboard.SetState(  
VirtualKeys.VK_CAPITAL,    
!Keyboard.GetState(VirtualKeys.VK_CAPITAL)  
);  
Keyboard.SetState(  
VirtualKeys.VK_SCROLL,    
!Keyboard.GetState(VirtualKeys.VK_SCROLL)  
);  
Keyboard.SetState(  
VirtualKeys.VK_NUMLOCK,    
!Keyboard.GetState(VirtualKeys.VK_NUMLOCK)  
);  
//  Display  new  status  of  keys.  
Console.WriteLine(  
"/r/n**AFTER**/r/nCAP:  {0}/r/nSCR:  {1}/r/nNUM:  {2}",    
Keyboard.GetState(VirtualKeys.VK_CAPITAL)?"ON":"OFF",  
Keyboard.GetState(VirtualKeys.VK_SCROLL)?"ON":"OFF",  
Keyboard.GetState(VirtualKeys.VK_NUMLOCK)?"ON":"OFF"  
);  
Console.ReadLine();  
}  
}  
public  enum  VirtualKeys:  byte{  
VK_NUMLOCK  =  0x90,  
VK_SCROLL  =  0x91,  
VK_CAPITAL  =  0x14  
}  
class  Keyboard{  
const  uint  KEYEVENTF_EXTENDEDKEY  =  0x1;  
const  uint  KEYEVENTF_KEYUP  =  0x2;  
[DllImport("user32.dll")]  
static  extern  short  GetKeyState(int  nVirtKey);  
[DllImport("user32.dll")]  
static  extern  void  keybd_event(  
byte  bVk,    
byte  bScan,    
uint  dwFlags,    
uint  dwExtraInfo  
);  
public  static  bool  GetState(VirtualKeys  Key){  
return  (GetKeyState((int)Key)==1);  
}  
public  static  void  SetState(VirtualKeys  Key,  bool  State){  
if(State!=GetState(Key)){  
keybd_event(  
(byte)Key,    
0x45,    
KEYEVENTF_EXTENDEDKEY    ¦  0,    
0  
);  
keybd_event(  
(byte)Key,    
0x45,    
KEYEVENTF_EXTENDEDKEY    ¦  KEYEVENTF_KEYUP,    
0  
);  
}  
}  
}  
}  
----------------------------------------------------------  
using  System;  
using  System.Drawing;  
using  System.Collections;  
using  System.ComponentModel;  
using  System.Windows.Forms;  
using  System.Data;  
 
namespace  Example107_模拟鼠标  
{  
           ///  <summary>  
           ///  Form1  的摘要说明。  
           ///  </summary>  
           public  class  Form1  :  System.Windows.Forms.Form  
           {  
                       ///  <summary>  
                       ///  必需的设计器变量。  
                       ///  </summary>  
                       private  System.ComponentModel.Container  components  =  null;  
 
                       public  Form1()  
                       {  
                                   //  
                                   //  Windows  窗体设计器支持所必需的  
                                   //  
                                   InitializeComponent();  
 
                                   //  
                                   //  TODO:  在  InitializeComponent  调用后添加任何构造函数代码  
                                   //  
                       }  
 
                       ///  <summary>  
                       ///  清理所有正在使用的资源。  
                       ///  </summary>  
                       protected  override  void  Dispose(  bool  disposing  )  
                       {  
                                   if(  disposing  )  
                                   {  
                                               if  (components  !=  null)    
                                               {  
                                                           components.Dispose();  
                                               }  
                                   }  
                                   base.Dispose(  disposing  );  
                       }  
 
                       #region  Windows  Form  Designer  generated  code  
                       ///  <summary>  
                       ///  设计器支持所需的方法  -  不要使用代码编辑器修改  
                       ///  此方法的内容。  
                       ///  </summary>  
                       private  void  InitializeComponent()  
                       {  
                                   this.button1  =  new  System.Windows.Forms.Button();  
                                   this.SuspendLayout();  
                                   //    
                                   //  button1  
                                   //    
                                   this.button1.Location  =  new  System.Drawing.Point(144,  176);  
                                   this.button1.Name  =  "button1";  
                                   this.button1.TabIndex  =  0;  
                                   this.button1.Text  =  "Mouse";  
                                   this.button1.Click  +=  new  System.EventHandler(this.button1_Click);  
                                   //    
                                   //  Form1  
                                   //    
                                   this.AutoScaleBaseSize  =  new  System.Drawing.Size(6,  14);  
                                   this.ClientSize  =  new  System.Drawing.Size(280,  237);  
                                   this.Controls.AddRange(new  System.Windows.Forms.Control[]  {  
                                                                                                                                                                                                                           this.button1});  
                                   this.Name  =  "Form1";  
                                   this.Text  =  "Form1";  
                                   this.DoubleClick  +=  new  System.EventHandler(this.Form1_DoubleClick);  
                                   this.ResumeLayout(false);  
 
                       }  
                       #endregion  
 
                       ///  <summary>  
                       ///  应用程序的主入口点。  
                       ///  </summary>  
                       [STAThread]  
                       static  void  Main()    
                       {  
                                   Application.Run(new  Form1());  
                       }  
 
                       private  System.Windows.Forms.Button  button1;  
 
                       [System.Runtime.InteropServices.DllImport("user32")]  
                       private  static  extern  int  mouse_event(int  dwFlags,int  dx,int  dy,  int  cButtons,  int  dwExtraInfo);  
                       const  int  MOUSEEVENTF_MOVE  =  0x0001;  
                       const  int  MOUSEEVENTF_LEFTDOWN  =  0x0002;  
                       const  int  MOUSEEVENTF_LEFTUP  =  0x0004;  
                       const  int  MOUSEEVENTF_RIGHTDOWN  =  0x0008;  
                       const  int  MOUSEEVENTF_RIGHTUP  =  0x0010;  
                       const  int  MOUSEEVENTF_MIDDLEDOWN  =  0x0020;  
                       const  int  MOUSEEVENTF_MIDDLEUP  =  0x0040;  
                       const  int  MOUSEEVENTF_ABSOLUTE  =  0x8000;  
 
                       private  void  Form1_DoubleClick(object  sender,  System.EventArgs  e)  
                       {  
                                   MessageBox.Show("Double  Click");  
                       }  
 
                       private  void  button1_Click(object  sender,  System.EventArgs  e)  
                       {  
                                   mouse_event(MOUSEEVENTF_MOVE,100,100,0,0);              
                                     
                                   //下面是模拟双击的  
                                   //mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);  
                                   //mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);              
 
                               //mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);  
                               //mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);              
                       }  
           }  
}  
----------------------------------------------------------  
mouse_event函数说明:      
dwFlags  --------    Long,下述标志的一个组合  
   MOUSEEVENTF_ABSOLUTE  
 
   dx和dy指定鼠标坐标系统中的一个绝对位置。在鼠标坐标系统中,屏幕在水平和垂直方向上均匀分割成65535×65535个单元  -    MOUSEEVENTF_MOVE  
   移动鼠标  
   MOUSEEVENTF_LEFTDOWN  
   模拟鼠标左键按下  
   MOUSEEVENTF_LEFTUP  
   模拟鼠标左键抬起  
   MOUSEEVENTF_RIGHTDOWN  
   模拟鼠标右键按下  
   MOUSEEVENTF_RIGHTUP  
   模拟鼠标右键按下  
   MOUSEEVENTF_MIDDLEDOWN  
   模拟鼠标中键按下  
   MOUSEEVENTF_MIDDLEUP  
   模拟鼠标中键按下  
   dx  
   Long,根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定水平方向的绝对位置或相对运动  
   dy  -------------    Long,根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定垂直方向的绝对位置或相对运动  
   cButtons  -------    Long,未使用  
   dwExtraInfo  ----    Long,通常未用的一个值。用GetMessageExtraInfo函数可取得这个值。可用的值取决于特定的驱动程序  
函数功能:该函数综合鼠标击键和鼠标动作。  
       函数原型:VOID  mouse_event(DWORD  dwFlags,DWORD  dx,DWORD  dwFlags,OWORD  dx,DWORD  dy,  DWORD  dwData,  DWORD  dwExtralnfo);  
       参数:  
       dwFlags:标志位集,指定点击按钮和鼠标动作的多种情况。此参数里的各位可以是下列值的任何合理组合:  
       MOOSE_EVENTF_ABSOLOTE:表明参数dX,dy含有规范化的绝对坐标。如果不设置此位,参数含有相对数据:相对于上次位置的改动位置。此标志可被设置,也可不设置,不管鼠标的类型或与系统相连的类似于鼠标的设备的类型如何。要得到关于相对鼠标动作的信息,参见下面备注部分。  
       MOOSEEVENTFMOVE:表明发生移动。  
       M00SEEVENTF_LEFTDOWN:表明接按下鼠标左键。  
       M00SEEVENTF_LEFTUP:表明松开鼠标左键。  
       MOOSEEVENTF_RIGHTDOWN:表明按下鼠标右键。  
       MOOSEEVENTF_RIGHTUP:表明松开鼠标右键。  
       MOOSEEVENTF_MIDDLEDOWN:表明按下鼠标中键。  
       MOOSEEVENTF_MIDDLEUP:表明松开鼠标中键。  
       MOOSEEVENTF_WHEEL:在Windows  NT中如果鼠标有一个轮,表明鼠标轮被移动。移动的数量由dwData给出。  
 
       dx:指定鼠标沿x轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOOSEEVENTF_ABSOLOTE的设置。给出的绝对数据作为鼠标的实际X坐标;给出的相对数据作为移动的mickeys数。一个mickey表示鼠标移动的数量,表明鼠标已经移动。  
       dy:指定鼠标沿y轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOOSEEVENTF_ABSOLVTE的设置。给出的绝对数据作为鼠标的实际y坐标,给出的相对数据作为移动的mickeys数。  
       dwData:如果dwFlags为MOOSEEVENTF_WHEEL,则dwData指定鼠标轮移动的数量。正值表明鼠标轮向前转动,即远离用户的方向;负值表明鼠标轮向后转动,即朝向用户。一个轮击定义为WHEEL_DELTA,即120。  
       如果dwFlagsS不是MOOSEEVENTF_WHEEL,则dWData应为零。  
       dwExtralnfo:指定与鼠标事件相关的附加32位值。应用程序调用函数GetMessgeExtrajnfo来获得此附加信息。  
       返回值:无。  
       备注:如果鼠标被移动,用设置MOUSEEVENTF_MOVE来表明,dX和dy保留移动的信息。给出的信息是绝对或相对整数值。  
       如果指定了MOWSEEVENTF_ABSOLOTE值,则dX和dy含有标准化的绝对坐标,其值在0到65535之间。事件程序将此坐标映射到显示表面。坐标(0,0)映射到显示表面的左上角,(6553,65535)映射到右下角。  
       如果没指定MOWSEEVENTF_ABSOLOTE,dX和dy表示相对于上次鼠标事件产生的位置(即上次报告的位置)的移动。正值表示鼠标向右(或下)移动;负值表示鼠标向左(或上)移动。  
       鼠标的相对移动服从鼠标速度和加速度等级的设置,一个最终用户用鼠标控制面板应用程序来设置这些值,应用程序用函数SystemParameterslnfo来取得和设置这些值。  
       在应用加速时系统对指定相对鼠标移动提供了两个测试。如果指定的沿X轴y轴的距离比第一个鼠标阈值大,并且鼠标的加速等级非零,则操作系统将距离加倍。如果指定的沿X轴或y轴的距离比第二个鼠标阈值大,并且鼠标的加速等级为2,则操作系统将从第一个阈测试得来的距离加倍。这样就允许操作系统将指定鼠标沿 X轴或y轴的相对位移加到4倍。  
       一旦应用了加速,系统用期望的鼠标速度换算合成的值。鼠标速度的范围是从1(最慢)到20(最快),并代表基于鼠标移动的距离指示符移动的数量。缺省值是10,表示对鼠标的移动设有附加的修改。  
       函数mouse_event需要用的应用程序用来合成鼠标事件。也被应用程序用来取得鼠标位置和鼠标按键状态之外的鼠标信息。例如,如果输入板制造商想将基于画笔的信息传给自己的应用程序,可以写一个直接与输入板硬件通信的动态键接库(DLL),获得附加的信息,并保存到一个队列中。DLL然后调用 mouse_event,用标准按键和x/y位置数据,并在参数dwExtralnfo设置排列的附加信息的指针或索引。当应用程序需要附加信息时,调用 DLL(连同存贮在dwEXtralnfo中的指针或索引),则DLL返回附加信息。  
       Windows  CE:Windows  CE不支持参数  dwFlags取MOOSE  EVENTF  WHEEL常数。  
       速查:  Windows  NT:  3.1及以上版本;  Windows:95及以上版本;Windows  CE:不支持;头文件:winuser.h;输入库:user32.lib。 

WinAPI-Wrapper 模拟鼠标点击 用于模拟鼠标移动、点击、窗口操作等的Windows API包装器类。 API 下面是一些可用的方法的总结。有更多的方法和类,比下面列出的要多,但目的是要大致了解包装器能做什么。要查看关于特定方法的详细信息和参数的详细信息,请查看代码本身,因为它的注释很好。 Mouse.cs public static void LeftClick(); public static void RightClick(); public static void MiddleClick(); public static void LeftDown(); public static void LeftUp(); public static void RightDown(); public static void RightUp(); public static void MiddleDown(); public static void MiddleUp(); public static void Move(int x, int y); public static void LeftDrag(Point point1, Point point2, int interval, int lag); Window.cs public static bool DoesExist(string windowTitle); public static IntPtr Get(string windowTitle); public static IntPtr GetFocused(); public static void SetFocused(IntPtr hWnd); public static bool IsFocused(IntPtr hWnd); public static void Move(IntPtr hWnd, int x, int y); public static void Resize(IntPtr hWnd, int width, int height); public static void Hide(IntPtr hWnd); public static void Show(IntPtr hWnd); public static Rectangle GetDimensions(IntPtr hWnd); public static Size GetSize(IntPtr hWnd); public static Point GetLocation(IntPtr hWnd); public static string GetTitle(IntPtr hWnd); public static void SetTitle(IntPtr hWnd, string title); public static void Maximize(IntPtr hWnd); public static void Minimize(IntPtr hWnd); public static void Normalize(IntPtr hWnd); public static Bitmap Screenshot(IntPtr hWnd); public static void RemoveMenu(IntPtr hWnd); public static void Close(IntPtr hWnd); public static void DisableCloseButton(IntPtr hWnd); public static void DisableMaximizeButton(IntPtr hWnd); public static void DisableMinimizeButton(IntPtr hWnd); public static void EnableMouseTransparency(IntPtr hWnd); public static Point ConvertToWindowCoordinates(IntPtr hWnd, int x, int y); public static Point GetCoordinateRelativeToWindow(IntPtr hWnd); Desktop.cs public static Bitmap Screenshot(); public static void HideTaskBar(); public static void ShowTaskBar(); public static int GetWidth(); public static int GetHeight(); 使用 在windows api文件夹中编译代码会产生一个.dll文件。任何引用这个.dll的ccode都可以使用包装器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值