開發一個自動點擊工具

一個人點鼠標總是很麻煩,尤其是這個時間很長的時候。所有就考慮要做一個模擬鼠標點擊的工具。

1.準備

打開vs,新建一個窗口程序。
這裏寫圖片描述
上面依次選擇,
1.程序的類型:窗口程序
2.新程序的名字和命名空間
3.項目的位置。

然後就自動生成了一個窗體應用。

2.界面設計

這裏寫圖片描述
類似上面的這個樣子。一個輸入框用來控制頻率,一個按鈕用來確認頻率(ps:可以在輸入框的離開事件中直接確認)
然後再從控件庫加入一個小小的定時器。定時器的名字是Timer。

3.熱鍵註冊

首先全局註冊一個熱鍵來控制自動點擊的開始與結束。

引用系統dll的方法

[DllImport("user32.dll", SetLastError = true)]
public static extern bool RegisterHotKey(
     IntPtr hWnd,                //要定義熱鍵的窗口的句柄
     int id,                     //定義熱鍵ID(不能與其它ID重複)           
     KeyModifiers fsModifiers,   //標識熱鍵是否在按Alt、Ctrl、Shift、Windows等鍵時纔會生效
     Keys vk                     //定義熱鍵的內容
     );
 [DllImport("user32.dll", SetLastError = true)]
 public static extern bool UnregisterHotKey(
    IntPtr hWnd,                //要取消熱鍵的窗口的句柄
    int id                      //要取消熱鍵的ID
    );
 //定義了輔助鍵的名稱(將數字轉變爲字符以便於記憶,也可去除此枚舉而直接使用數值)
 [Flags()]
 public enum KeyModifiers
 {
     None = 0,
     Alt = 1,
     Ctrl = 2,
     Shift = 4,
     WindowsKey = 8
 } 

心急小夥伴直接複製即可。
兩個方法,第一個是註冊熱鍵,第二個是註銷熱鍵。一定要註銷,不然熱鍵會一直存在的。

在窗體中註冊和註銷

private void Form1_Load(object sender, EventArgs e)
{
     MouseDLL.RegisterHotKey(Handle, 100, MouseDLL.KeyModifiers.None, Keys.F1);
 }

 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
 {
     MouseDLL.UnregisterHotKey(Handle, 100);
 }

 protected override void WndProc(ref Message m)
 {
     const int WM_HOTKEY = 0x0312;
     if (m.Msg == WM_HOTKEY && m.WParam.ToInt32() == 100)
     {
         timer1.Enabled = !timer1.Enabled;
     }

     base.WndProc(ref m);
 }

方法一,窗體的進入事件,此時註冊熱鍵。熱鍵id是隨便選的。
方法二,窗體的結束事件,此時註銷熱鍵。
方法三,重載窗體的消息通知,判斷是否有按鍵按下。如果按下就打開定時器的開關。
提示,多線程不支持鼠標模擬。

4.模擬鼠標

最後就是重點了。模擬鼠標的按下效果。
這裏有一個重點,鼠標的位置默認是從當前鼠標位置開始計算的,如果要自定義位置,最好是使用絕對座標。

引用系統dll

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; //標示是否採用絕對座標
/// <summary>
/// 鼠標事件
/// </summary>
/// <param name="dwFlags"></param>
/// <param name="dx"></param>
/// <param name="dy"></param>
/// <param name="cButtons"></param>
/// <param name="dwExtraInfo"></param>
/// <returns></returns>
[DllImport("user32.dll", SetLastError = true)]
private static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

下面寫一個鼠標左鍵的例子。

/// <summary>
/// 左鍵單擊
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
public static void mouse_click(int x = 0, int y = 0)
{
    mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
    mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0);
}

提示:裏面的參數是可以合併的。比如

mouse_event(MOUSEEVENTF_LEFTDOWN|MOUSEEVENTF_LEFTUP, x, y, 0, 0);

最後的最後,把模擬左鍵的方法寫在定時器裏。同時設置定時器的頻率。

private void timer1_Tick(object sender, EventArgs e)
{
    MouseDLL.mouse_click();
 }

 private void button1_Click(object sender, EventArgs e)
 {
     var tt = textBox1.Text;
     int timer = timer1.Interval;
     if (int.TryParse(tt, out timer))
     {
         timer1.Interval = timer;
     }
 }

好了,現在只要運行這個程序就能夠監聽F1鍵,在按下F1鍵之後瘋狂的點擊鼠標左鍵。如果再次按下F1鍵,模擬點擊就會停止了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章