實現控制C#鼠標坐標的方法
C#鼠標坐標的控制,是鼠標控制的關鍵。坐標的提供,是精確定位的基礎。以下的代碼具備實用性,包括函數,參數。這里還將介紹函數mouse_event需要用的應用程序用來合成鼠標事件。
- 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_模擬鼠標
- {
- ///
- /// Form1 的摘要說明。
- ///
- public class Form1 : System.Windows.Forms.Form
- {
- ///
- /// 必需的設計器變量。
- ///
- private System.ComponentModel.Container components = null;
- public Form1()
- {
- //
- // Windows 窗體設計器支持所必需的
- //
- InitializeComponent();
- //
- // TODO: 在 InitializeComponent 調用后添加任何構造函數代碼
- //
- }
- ///
- /// 清理所有正在使用的資源。
- ///
- protected override void Dispose( bool disposing )
- {
- if( disposing )
- {
- if (components != null)
- {
- components.Dispose();
- }
- }
- base.Dispose( disposing );
- }
- #region Windows Form Designer generated code
- ///
- /// 設計器支持所需的方法 - 不要使用代碼編輯器修改
- /// 此方法的內容。
- ///
- 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
- ///
- /// 應用程序的主入口點。
- ///
- [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。
【編輯推薦】