模拟键盘按键 自动输入文字

  键盘对于每个操作电脑的人员来说是最熟悉不过的了。键盘上的按键可分为两类 按下后会在电脑的输入窗口上出现对应字符的按键,如字母键和数字键等,我们称之为字符键;按下后虽然看不到字符但会产生控制作用的按键,如回车键、光标键等,我们称之为控制键。

  对于程序员来说,键盘上的每个按键都一样,无非是不同按键产生的键盘扫描码不同。在不同的操作系统下,键盘扫描码常常被转换为不同的编码以方便应用程序调用,比如在DOS系统下的ASCII码,在Windows系统下的虚拟键盘码等等。

  有时我们希望能以程序的方式模拟键盘按键,以达到自动输入文字或者控制操作的目的。在DOS系统下通常使用中断调用,产生键盘的扫描码的方法来实现。在Windows 系统下,由于Windows本身的一些限制和特点,一般不直接使用中断调用。

  了解一点Windows编程的朋友应该知道, Windows系统是通过消息的传递(或称事件的发生)来控制各个应用程序的执行和数据通信的。例如:应用程序打开和关闭会产生相应的窗口消息,鼠标的移动、点击动作会产生相应的鼠标消息,同样键盘的按下、弹起也会产生相应的键盘消息。那么如果用程序产生键盘消息,也就达到了模拟键盘按键的目的。

  有了这样的思路,我们现在就来实验一下。

  首先要知道在Windows系统中与键盘按键相关的消息有:WM_KEYDOWN、WM_KEYUP、 WM_SYSKEYDOWN、WM_SYSKEYUP、WM_CHAR等。其中,WM_KEYDOWN为键按下,WM_KEYUP为键弹起,WM_SYSKEYDOWN为系统键按下,WM_SYSKEYUP为系统键弹起,WM_CHAR为按键对应的字符。

  要模拟键盘产生键盘消息,我们就发送一条键盘消息给指定窗口。比如要模拟一个字母键A,可以这样PostMessage(hWnd, WM_CHAR, 'A', 0); 模拟按一个回车:PostMessage(hWnd, WM_KEYDOWN, VK_RETURN, 0)。这里的关键问题是要确定窗口句柄(hWnd),使用GetFocus()函数可以得到键盘光标所在窗口句柄,但该函数只能得到当前进程内的窗口句柄。

  如果要得到其他应用程序的键盘光标所在窗口句柄,需要调用 AttachThreadInput()函数。该函数的作用就是将其他窗口线程的输入附加到本窗口线程的输入操作中,这样就可以调用GetFocus()函数得到其他窗口的句柄了。

  与2001年第24期程序谷刊登的《如何写一个聊天辅助程序》一文中作者使用ChildWindowFromPointEx的方法相比,使用AttachThreadInput似乎更能够使键盘模拟具有通用性。

AttachThreadInput()函数的原形如下

BOOL AttachThreadInput(

DWORD idAttach, 需要附加的线程ID

DWORD idAttachTo, 附加到的线程ID

BOOL fAttach true 附加 false 取消

);

函数使用的过程大致如下

HWND hWnd;

hWnd = GetForegroundWindow(); 得到当前窗口

if (hWnd == Form1-Handle) return; 排除程序本身的窗口

DWORD FormThreadID = GetCurrentThreadId(); 本程序的线程ID

当前窗口的线程ID

DWORD CWndThreadID = GetWindowThreadProcessId(hWnd, NULL);

附加输入线程

AttachThreadInput(CWndThreadID, FormThreadID, true);

得到当前键盘光标所在的窗口

hWnd = GetFocus();

取消附加的输入线程

AttachThreadInput(CWndThreadID, FormThreadID, false);

  hWnd就是当前键盘光标所在的窗口句柄。另外,经过测试发现,在Windows2000系统下发送字符消息(WM_CHAR)时,如果字符是一个汉字,则该字符对应的虚拟键盘码高位不为0,这样得到的字符就不正确。解决办法是做一个与运算 ch & 0xFF就可以了。

下面又到了给出例程的时间了。例程刷刷刷能够在键盘光标所在的文本输入框中自动输入文字(中文、英文、数字),程序使用C++ Builder 5开发。首先运行C++ Builder并新建工程。接着,将窗体Form1的边框样式(BorderStyle)改为对话框(bsDialog),并放置相应控件如图所示,其中SS_Text是一个用于输入文本的TComboBox控件,当然,你可以在设计阶段预先向控件中输入一些常用文本,以便程序运行后可以直接选用; txtTimes和txtDelay为TEdit控件,分别用于控制发送文本的次数和间隔时间;chkAutoWrap和chkAutoNumber为TCheckBox控件,决定是否在每一行发送文本后面自动回车或自动加记数编号; 以上控件包含在Panel1(TPanel控件)中; Timer1用于控制循环发送和时间间隔。

下面是程序清单

--------------------------------------------

#include

#pragma hdrstop

#include Unit1.h

--------------------------------------------

#pragma package(smart_init)

#pragma resource .dfm

int nTotalTimes, 发送本文的总次数

nTimes; 已经发送的次数

TForm1 Form1;

--------------------------------------------

__fastcall TForm1TForm1(TComponent Owner)

TForm(Owner)

{

}

--------------------------------------------

void __fastcall TForm1btnStartClick(TObject Sender) 开始刷屏

{ if (SS_Text-Text.IsEmpty())

{

文本不能为空

ShowMessage(请输入刷刷文本!);

SS_Text-SetFocus();

return;

}

__try

{

Timer1-Interval取值为n秒(最小为50毫秒)

int Interval = StrToInt(txtDelay-Text);

Timer1-Interval = (Interval 0) Interval 1000 50;

nTotalTimes取值为n次(最小为0次)

nTotalTimes = StrToInt(txtTimes-Text);

if (nTotalTimes 0)

nTotalTimes = 0;

nTimes = 0;

Timer1-Enabled = true;

}

__except(EXCEPTION_EXECUTE_HANDLER)

{

ShowMessage(请输入数值类型数据!);

return;

}

btnStart-Enabled = false;

btnStop-Enabled = true;

Panel1-Enabled = false;

Application-Minimize(); 最小化刷刷窗口

}

--------------------------------------------

void __fastcall TForm1btnStopClick(TObject Sender) 停止刷屏

{

Timer1-Enabled = false;

btnStart-Enabled = true;

btnStop-Enabled = false;

Panel1-Enabled = true;

}

--------------------------------------------

void __fastcall TForm1Timer1Timer(TObject Sender)

{

现刷屏nTimes次,到nTotalTimes次后完成。

if (nTimes == nTotalTimes)

{

btnStopClick(Sender);

return;

}

HWND hWnd;

hWnd = GetForegroundWindow(); 得到当前窗口

if (hWnd == Form1-Handle) return; 不需要程序本身的窗口

DWORD FormThreadID = GetCurrentThreadId();

DWORD CWndThreadID = GetWindowThreadProcessId(hWnd, NULL);

附加输入线程

AttachThreadInput(CWndThreadID, FormThreadID, true);

hWnd = GetFocus(); 得到当前键盘光标所在的窗口

AttachThreadInput(CWndThreadID, FormThreadID, false); 取消

if (hWnd == NULL) return;

nTimes++;

for (int i = 1; i = SS_Text-Text.Length(); i++)

{ 模拟键盘按键输入文本

PostMessage(hWnd, WM_CHAR, (WPARAM)(SS_Text-Text[i] & 0xFF), 0);

}

if (chkAutoNumber-Checked)

{ 自动编号

AnsiString Lines = IntToStr(nTimes);

for (int j = 1; j = Lines.Length(); j++)

PostMessage(hWnd, WM_CHAR, (WPARAM)(Lines[j]), 0);

}

if (chkAutoWrap-Checked) 自动回车

PostMessage(hWnd, WM_KEYDOWN, VK_RETURN, 0);

}

---------------------------------------------

本程序在Windows 2000 + C++ Builder 5下编译通过。

作者:周世攀

模拟键盘按键 自动输入文字相关推荐

  1. VC+API模拟键盘按键(详解篇)

    模拟键盘按键 ━━━━━━━━━━━━━━━━━━━━━━━━ 以前就想过如何模拟键盘按键向其他程序发送控制命令,但总是无功而返,这次也不例外. 模拟按键的方法很多,如PostMessage(不能用S ...

  2. 模拟键盘按键---很经典,总结很全面

    http://www.cnblogs.com/Jnshushi99/archive/2011/09/03/2164617.html 模拟键盘按键 ━━━━━━━━━━━━━━━━━━━━━━━━ 以前 ...

  3. golang实现模拟键盘按键

    Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易.GO优点 1.学习曲线容易 2.效率:快速的编译时间,开发效率和运行效率高 3.自由高效:组合的思想.无侵入式的接口 4.强大的标 ...

  4. VC sendinput模拟键盘按键

    介绍 sendinput在某些应用上面模拟按键无效,需要转换成unicode字符才可以模拟,特记录下. 代码 #include <stdio.h> #include <stdint. ...

  5. C/C++使用keybd_event模拟键盘按键

    1 #include <stdio.h> 2 #include <Windows.h> 3 4 /* 5 设置键盘大小写状态 6 big:为TRUE则切换大写状态,否则切换小写 ...

  6. python调用linux软键盘_在Linux中使用Python模拟键盘按键

    之前在做自动化测试中需要用Python在linux中模拟Ctrl+V 进行路径粘贴,试了很多种方法,起初用了xerox和pyperclip这两个python库,但打开对话框后调用粘贴API无法进行粘贴 ...

  7. linux c实现键盘模拟,C++模拟键盘按键的实例

    这个与模拟鼠标点击的函数差不多,直接上函数 keybd_event(VK_RETURN,0,0,0); keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0); 这是模拟 ...

  8. python 模拟键盘 linux,在Linux中使用Python模拟键盘按键,linuxpython

    在Linux中使用Python模拟键盘按键,linuxpython 之前在做自动化测试中需要用Python在linux中模拟Ctrl+V 进行路径粘贴,试了很多种方法,起初用了xerox和pyperc ...

  9. 驱动中实现模拟键盘按键

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 标 题: ...

最新文章

  1. qt 找不到 -lpulse-mainloop-glib,找不到 -lpulse问题
  2. 软件工程概论课后作业01
  3. postgresql 加载参数文件
  4. Java学习手册:JDBC中getString()方法与getObject()方法有什么区别?
  5. 清华刘云浩教授回复学生2000问,你想了解的人工智能问题可能都在这里
  6. 移动通信网络规划:5G业务解析
  7. 惠普m227fdw引擎通信错误_惠普打印机HPM227提示耗材余量错误怎么办?
  8. Times New Roman vs Arial,期刊论文如何选择字体?
  9. image失败 安装scikit_安装SciKitImage错误127
  10. 筋斗云接口编程 / 常用操作(二)
  11. 禅道类似软件_六大Jira项目管理软件替代品
  12. 忆阻器交叉开关阵列中的长短期记忆(LSTM)神经网络
  13. 用tensorflow做的cbow词向量
  14. muParser公式库使用简介
  15. zookeeper启动报错:already running as process
  16. 【Spring源码】Spring事务原理
  17. 少儿编程兴起,作为老一辈程序员的你,怕了么?
  18. Spring(3)--Spring示例再演示
  19. 2017美团点评校招前端面试题
  20. STM32系统滴答_及不可不知的延时技巧 - (下)

热门文章

  1. 用Html+js自己写了一个小游戏
  2. 2022管理类联考真题试卷不含答案-文都管联院
  3. proftpd java_基于 proftpd 配置加密 FTP
  4. redis简略版笔记
  5. 计算机计算建筑结构的方法有哪些,建筑结构设计包括哪些内容呢?
  6. 售前工作过程展示6“差点去了津巴布韦“
  7. 非常好用的一款在线json转excel的工具
  8. [项目管理]关于风险管理的问题和可能过早的幼儿教育
  9. android小说阅读、MVP + RxJava + Retrofit项目、证件拍照裁剪、蓝牙锁等源码器
  10. 关于 Kubernetes中JobCronJob的一些笔记