在windows下類比滑鼠鍵盤輸入的幾種方法
最近小叮咚使用的伺服器(第3方的asp伺服器,不是iis)在啟動後總是不能自動運行,可能裡面有Bug,需要點擊啟動按鈕後才能串連到internet上.
為了保證小叮咚的穩定運行,我把我的機器(放在家)配置成每小時啟動一次,啟動後自動運行伺服器軟體
這個軟體沒有類似: /run 等的命令列啟動方式,於是我想,能不能用程式自動實現 類比滑鼠點擊按鈕的功能呢?
因為我的需求和運行環境允許我這麼做:
1 這個軟體啟動後的"運行"按鈕顯示位置固定
2 只需要點擊一下運行按鈕就可以,
有上面2個條件,所以用程式類比執行點擊運行按鈕的方法是可行的.
於是我用google展開調查
作為程式員,解決這樣的問題有兩個方法: 1 用現成的程式 2 自己做 具體怎麼來就看.....實際需要嘍
在google上輸入,滑鼠類比,就可以發現一下幾種選擇
1 使用 "按鍵精靈" 等現成軟體 (這個不在本文介紹之列)
2 網上有 .net實現滑鼠類比的方法 http://www.cnblogs.com/edobnet/archive/2004/06/09/14334.aspx
3 使用mfc的實現方法,最多的,最有名的就是 徐景周 在VCKBase上的那篇 (見 徐景周 的專欄)
4 使用 MS Active Accessibility 介面技術編程
輕量級,重量級,現成的都有了,呵呵
後幾種中方法都是使用:SetCursorPos 和 mouse_event WinAPI 來實現的.
實現原型如下:
SetCursorPos (XXX, XXX);
mouse_event (MOUSEEVENTF_LEFTDOWN, 0,0,0,0);
mouse_event (MOUSEEVENTF_LEFTUP, 0,0,0,0);
有興趣的讀者可以參考看看上面文章的介紹
本文介紹另外一個辦法:
使用: SendInput WinAPI ,這個 方法的介紹如下:
[New for Windows NT 4.0 Service Pack 3.]
The SendInput function synthesizes keystrokes, mouse motions, and button clicks.
看來它整合了 鍵盤按鍵,滑鼠活動,手寫板輸入等資訊,完全可以實現前面提出的需求.
配合SendInput使用的還有另外一個結構:
結構:INPUT
[New for Windows NT 4.0 Service Pack 3.]
The INPUT structure is used by SendInput to synthesize keystrokes, mouse motions, and button clicks.
typedef struct tagINPUT {
DWORD type;
union
{
MOUSEINPUT mi;
KEYBDINPUT ki;
HARDWAREINPUT hi;
};
} INPUT, *PINPUT, FAR* LPINPUT;
更詳細的資訊參考:
http://www.piclist.com/techref/os/win/api/win32/struc/src/str09_12.htm
http://www.china-askpro.com/msg18/qa18.shtml
http://www.daniweb.com/techtalkforums/showthread.php?t=6727
以下代碼使用 Dev++編譯通過.(共2個檔案)
//stdafx.h
#pragma once
#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x0500 // 注意VC產生代碼值是:0x0400 ,放在vc中運行時要注意
#include <windows.h>
//main.cpp
#include "stdafx.h"
int main(int argc, char* argv[]){
INPUT *buffer = new INPUT[3];
buffer->type = INPUT_MOUSE;
buffer->mi.dx = 100;
buffer->mi.dy = 100;
buffer->mi.mouseData = 0;
buffer->mi.dwFlags = (MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE);
buffer->mi.time = 0;
buffer->mi.dwExtraInfo = 0;
(buffer+1)->type = INPUT_MOUSE;
(buffer+1)->mi.dx = 100;
(buffer+1)->mi.dy = 100;
(buffer+1)->mi.mouseData = 0;
(buffer+1)->mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
(buffer+1)->mi.time = 0;
(buffer+1)->mi.dwExtraInfo = 0;
(buffer+2)->type = INPUT_MOUSE;
(buffer+2)->mi.dx = 100;
(buffer+2)->mi.dy = 100;
(buffer+2)->mi.mouseData = 0;
(buffer+2)->mi.dwFlags = MOUSEEVENTF_LEFTUP;
(buffer+2)->mi.time = 0;
(buffer+2)->mi.dwExtraInfo = 0;
SendInput(3,buffer,sizeof(INPUT));
delete (buffer);
return 0;
}