用C#實現(xiàn)控制鼠標(biāo)位置的方法

2010-08-28 10:49:44來源:西部e網(wǎng)作者:

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_模擬鼠標(biāo)  
{  
           ///  <summary>  
           ///  Form1  的摘要說明。  
           ///  </summary>  
           public  class  Form1  :  System.Windows.Forms.Form  
           {  
                       ///  <summary>  
                       ///  必需的設(shè)計器變量。  
                       ///  </summary>  
                       private  System.ComponentModel.Container  components  =  null;  
 
                       public  Form1()  
                       {  
                                   //  
                                   //  Windows  窗體設(shè)計器支持所必需的  
                                   //  
                                   InitializeComponent();  
 
                                   //  
                                   //  TODO:  在  InitializeComponent  調(diào)用后添加任何構(gòu)造函數(shù)代碼  
                                   //  
                       }  
 
                       ///  <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>  
                       ///  設(shè)計器支持所需的方法  -  不要使用代碼編輯器修改  
                       ///  此方法的內(nèi)容。  
                       ///  </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>  
                       ///  應(yīng)用程序的主入口點。  
                       ///  </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函數(shù)說明:      
dwFlags  --------    Long,下述標(biāo)志的一個組合  
   MOUSEEVENTF_ABSOLUTE  
 
   dx和dy指定鼠標(biāo)坐標(biāo)系統(tǒng)中的一個絕對位置。在鼠標(biāo)坐標(biāo)系統(tǒng)中,屏幕在水平和垂直方向上均勻分割成65535×65535個單元  -    MOUSEEVENTF_MOVE  
   移動鼠標(biāo)  
   MOUSEEVENTF_LEFTDOWN  
   模擬鼠標(biāo)左鍵按下  
   MOUSEEVENTF_LEFTUP  
   模擬鼠標(biāo)左鍵抬起  
   MOUSEEVENTF_RIGHTDOWN  
   模擬鼠標(biāo)右鍵按下  
   MOUSEEVENTF_RIGHTUP  
   模擬鼠標(biāo)右鍵按下  
   MOUSEEVENTF_MIDDLEDOWN  
   模擬鼠標(biāo)中鍵按下  
   MOUSEEVENTF_MIDDLEUP  
   模擬鼠標(biāo)中鍵按下  
   dx  
   Long,根據(jù)是否指定了MOUSEEVENTF_ABSOLUTE標(biāo)志,指定水平方向的絕對位置或相對運動  
   dy  -------------    Long,根據(jù)是否指定了MOUSEEVENTF_ABSOLUTE標(biāo)志,指定垂直方向的絕對位置或相對運動  
   cButtons  -------    Long,未使用  
   dwExtraInfo  ----    Long,通常未用的一個值。用GetMessageExtraInfo函數(shù)可取得這個值?捎玫闹等Q于特定的驅(qū)動程序  
函數(shù)功能:該函數(shù)綜合鼠標(biāo)擊鍵和鼠標(biāo)動作。  
       函數(shù)原型:VOID  mouse_event(DWORD  dwFlags,DWORD  dx,DWORD  dwFlags,OWORD  dx,DWORD  dy,  DWORD  dwData,  DWORD  dwExtralnfo);  
       參數(shù):  
       dwFlags:標(biāo)志位集,指定點擊按鈕和鼠標(biāo)動作的多種情況。此參數(shù)里的各位可以是下列值的任何合理組合:  
       MOOSE_EVENTF_ABSOLOTE:表明參數(shù)dX,dy含有規(guī)范化的絕對坐標(biāo)。如果不設(shè)置此位,參數(shù)含有相對數(shù)據(jù):相對于上次位置的改動位置。此標(biāo)志可被設(shè)置,也可不設(shè)置,不管鼠標(biāo)的類型或與系統(tǒng)相連的類似于鼠標(biāo)的設(shè)備的類型如何。要得到關(guān)于相對鼠標(biāo)動作的信息,參見下面?zhèn)渥⒉糠帧? 
       MOOSEEVENTFMOVE:表明發(fā)生移動。  
       M00SEEVENTF_LEFTDOWN:表明接按下鼠標(biāo)左鍵。  
       M00SEEVENTF_LEFTUP:表明松開鼠標(biāo)左鍵。  
       MOOSEEVENTF_RIGHTDOWN:表明按下鼠標(biāo)右鍵。  
       MOOSEEVENTF_RIGHTUP:表明松開鼠標(biāo)右鍵。  
       MOOSEEVENTF_MIDDLEDOWN:表明按下鼠標(biāo)中鍵。  
       MOOSEEVENTF_MIDDLEUP:表明松開鼠標(biāo)中鍵。  
       MOOSEEVENTF_WHEEL:在Windows  NT中如果鼠標(biāo)有一個輪,表明鼠標(biāo)輪被移動。移動的數(shù)量由dwData給出。  
 
       dx:指定鼠標(biāo)沿x軸的絕對位置或者從上次鼠標(biāo)事件產(chǎn)生以來移動的數(shù)量,依賴于MOOSEEVENTF_ABSOLOTE的設(shè)置。給出的絕對數(shù)據(jù)作為鼠標(biāo)的實際X坐標(biāo);給出的相對數(shù)據(jù)作為移動的mickeys數(shù)。一個mickey表示鼠標(biāo)移動的數(shù)量,表明鼠標(biāo)已經(jīng)移動。  
       dy:指定鼠標(biāo)沿y軸的絕對位置或者從上次鼠標(biāo)事件產(chǎn)生以來移動的數(shù)量,依賴于MOOSEEVENTF_ABSOLVTE的設(shè)置。給出的絕對數(shù)據(jù)作為鼠標(biāo)的實際y坐標(biāo),給出的相對數(shù)據(jù)作為移動的mickeys數(shù)。  
       dwData:如果dwFlags為MOOSEEVENTF_WHEEL,則dwData指定鼠標(biāo)輪移動的數(shù)量。正值表明鼠標(biāo)輪向前轉(zhuǎn)動,即遠(yuǎn)離用戶的方向;負(fù)值表明鼠標(biāo)輪向后轉(zhuǎn)動,即朝向用戶。一個輪擊定義為WHEEL_DELTA,即120。  
       如果dwFlagsS不是MOOSEEVENTF_WHEEL,則dWData應(yīng)為零。  
       dwExtralnfo:指定與鼠標(biāo)事件相關(guān)的附加32位值。應(yīng)用程序調(diào)用函數(shù)GetMessgeExtrajnfo來獲得此附加信息。  
       返回值:無。  
       備注:如果鼠標(biāo)被移動,用設(shè)置MOUSEEVENTF_MOVE來表明,dX和dy保留移動的信息。給出的信息是絕對或相對整數(shù)值。  
       如果指定了MOWSEEVENTF_ABSOLOTE值,則dX和dy含有標(biāo)準(zhǔn)化的絕對坐標(biāo),其值在0到65535之間。事件程序?qū)⒋俗鴺?biāo)映射到顯示表面。坐標(biāo)(0,0)映射到顯示表面的左上角,(6553,65535)映射到右下角。  
       如果沒指定MOWSEEVENTF_ABSOLOTE,dX和dy表示相對于上次鼠標(biāo)事件產(chǎn)生的位置(即上次報告的位置)的移動。正值表示鼠標(biāo)向右(或下)移動;負(fù)值表示鼠標(biāo)向左(或上)移動。  
       鼠標(biāo)的相對移動服從鼠標(biāo)速度和加速度等級的設(shè)置,一個最終用戶用鼠標(biāo)控制面板應(yīng)用程序來設(shè)置這些值,應(yīng)用程序用函數(shù)SystemParameterslnfo來取得和設(shè)置這些值。  
       在應(yīng)用加速時系統(tǒng)對指定相對鼠標(biāo)移動提供了兩個測試。如果指定的沿X軸y軸的距離比第一個鼠標(biāo)閾值大,并且鼠標(biāo)的加速等級非零,則操作系統(tǒng)將距離加倍。如果指定的沿X軸或y軸的距離比第二個鼠標(biāo)閾值大,并且鼠標(biāo)的加速等級為2,則操作系統(tǒng)將從第一個閾測試得來的距離加倍。這樣就允許操作系統(tǒng)將指定鼠標(biāo)沿X軸或y軸的相對位移加到4倍。  
       一旦應(yīng)用了加速,系統(tǒng)用期望的鼠標(biāo)速度換算合成的值。鼠標(biāo)速度的范圍是從1(最慢)到20(最快),并代表基于鼠標(biāo)移動的距離指示符移動的數(shù)量。缺省值是10,表示對鼠標(biāo)的移動設(shè)有附加的修改。  
       函數(shù)mouse_event需要用的應(yīng)用程序用來合成鼠標(biāo)事件。也被應(yīng)用程序用來取得鼠標(biāo)位置和鼠標(biāo)按鍵狀態(tài)之外的鼠標(biāo)信息。例如,如果輸入板制造商想將基于畫筆的信息傳給自己的應(yīng)用程序,可以寫一個直接與輸入板硬件通信的動態(tài)鍵接庫(DLL),獲得附加的信息,并保存到一個隊列中。DLL然后調(diào)用mouse_event,用標(biāo)準(zhǔn)按鍵和x/y位置數(shù)據(jù),并在參數(shù)dwExtralnfo設(shè)置排列的附加信息的指針或索引。當(dāng)應(yīng)用程序需要附加信息時,調(diào)用DLL(連同存貯在dwEXtralnfo中的指針或索引),則DLL返回附加信息。  
       Windows  CE:Windows  CE不支持參數(shù)  dwFlags取MOOSE  EVENTF  WHEEL常數(shù)。  
       速查:  Windows  NT:  3.1及以上版本;  Windows:95及以上版本;Windows  CE:不支持;頭文件:winuser.h;輸入庫:user32.lib。

http://blog.csdn.net/cocosoft/archive/2004/09/23/114346.aspx 
http://www.z4.cc/bbs/showthread.php?threadid=1809 
http://www.devmanclub.com/ShowPost.aspx?PostID=8456 
http://www.china-askpro.com/msg18/qa18.shtml 
http://www.hongen.com/pc/program/apitutor/api0006/api01.htm 

關(guān)鍵詞:C#

贊助商鏈接: