在windows下類比滑鼠鍵盤輸入的幾種方法 (附帶原始碼)

來源:互聯網
上載者:User

在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;
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.