前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在windows下模拟鼠标键盘输入的几种方法 (附带源代码)

在windows下模拟鼠标键盘输入的几种方法 (附带源代码)

作者头像
田春峰-JCJC错别字检测
发布2019-02-14 11:35:25
8.5K0
发布2019-02-14 11:35:25
举报

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2004年12月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档