关于程序模拟键盘输入的问题

时间:2022-01-26 00:31:23
我需要做一个这样的程序:
   调用一个应用程序,然后自动模拟键盘输入命令,运行完毕后,再调用另外一程序
再自动模拟键盘输入命令,运行完毕后退出。谁能给出思路,能有简单的例程更好。
:)!!!

9 个解决方案

#1


要想做的完善一些,无论如何你都得从拦截键盘消息这步做起:

* 在实际的键盘消息中,其实每当按下一个物理键时将产生24个消息,并非每个消息都是你期望的结果。
* 所以依据你要完成的具体功能适当在WM_CHAR、WM_KEYDOW、WM_XXX等时机,于lParam,wParam参数中获取有用数据。

lParam 参数

 主键状态
     |
 |  |-描述表代码
-----|--|----------------  ----------------  ----------------
|1F|1E|1D|1C|1B|1A|19|18|  |17|16|..|11|10|  |0F|0E|..|01|00|
-|-------|-----------|-|-  |--------------|  |--------------|
 |       |--8位标志--| |   |--8位扫描代码-|  |-16位重复计数-|
 |                     |
 |_转换状态      扩展键盘标志

可以简单的定义为:

unsigned long rep     = lParam & 0x0000ffff;  //计数
unsigned long scode   = lParam & 0x00ff0000;  //扫描码
unsigned long rcode   = lParam & (1 << 24);   //扩展键盘标志
unsigned long bcode   = lParam & (1 << 29);   //描述表
unsigned long sate    = lParam & (1 << 30);   //主键状态
unsigned long tabsate = lParam & (1 << 31);   //转换状态

#2


想要控制的程序发送WM_CHAR消息

#3


利用SendMessage()

#4


关注

#5


模拟键盘输入实现程序的自动演示 


(安徽 王翼)



  许多优秀的软件都有出色的DEMO(演示)功能,给人留下深刻的印象。DEMO程序或
许多CAI(计算机辅助教学)软件经常需要模拟键盘输入所需的文件名,来实现程序的
自动运行。要实现键盘的模拟输入,必须了解键盘缓冲区的结构及相应编程机理。键
盘缓冲区在内存中的地址分配如下:
004:001AH0040:001BH存放键盘缓冲区首指针;
004:001CH0040:001DH存放键盘缓冲区尾指针;
004:001AH0040:001BH键盘缓冲区,存放击键字符。
  每次击键用2字节存放。若为功能键,则第一个字节为0,第二个字节为该键的扩
展码;若为普通键,则第一个字节为该健的ASCCII码,第二字节为0。每击一次键,
数据送入键盘缓冲区中尾指针指向的单元,同时尾指针加2;从键盘缓冲区读出键时,
数据从缓冲区队列中首指针指示的单元取出,首指针同时加2。若首尾指针相等,表
示缓冲区为空。要实现对键盘缓冲区的自动操作,这里利用C语言的对内存直接读库
函数peek()和对内存直接写函数pokeb(),从而实现模拟键盘输入功能。
  程序中的关键函数是keyboard(int choice,char key[]),若choice参数不为0,
则key字符串中的字符的ASCII码逐个送入键盘缓冲区;如果choice参数为0,则将功
能键的扩展码送键盘缓冲区主程序运行后,如果5秒钟内不通过键盘输入所需的文件
名,则调用keyboard函数利用模拟键盘输入功能输入bar3d.c(CR),由此实现程序自
动运行。
程序在P133多媒体机上采用Turbo C 2.0编译连接通过,运行正常。
/*filename:demo-kbd.c*/
/*模拟键盘输入使程序自动运行 */
#include<stdio.h>

#include <stdlib.h>
#include 
<alloc.h>
keyboard(int choice,char key[])
{
int offset,i;
offset=peek(0x40,0x1c);
for(i=0;key[i]!='';i++)
{
if(choice==0)
{
pokeb(0x40,offset,0x00);
pokeb(0x40,offset,key[i]);
}
if(choice!=0)

{
pokeb(0x40,offset,key[i]);
pokeb(0x40,offset+1,0x00);
}
offset=offset+2;
if(offset==0x3e)offset=0x1e;
}
pokeb(0x40,0x1c,offset);
}
main()
{
struct time tt;
char name[10];
int t,t1,t2,flag=0;
gettime(&tt);
t1=tt.ti_sec;
printf("input files name");
while(!kbhit())
{
gettime(&tt);
t2=tt.ti_sec;
t=t2-t1;
if(t>5)
{
flag=1;
break;
}
}
if(flag==1)keyboard(1,"mljp.c\x0D");
gets(name);
printf("\s",name);
}

#6


用日志钩子可以实现吧?

#7


blue_soft(成长在csdn上) :
    能在windows 环境下使用吗?以前在纯dos下实现过(用ms c 5.0),现在我想用vc++在windows下编程,机制是一样吗?如果一样可以结贴了。

#8


我对windows下编程不熟悉

#9


这程序干什么用的?

#1


要想做的完善一些,无论如何你都得从拦截键盘消息这步做起:

* 在实际的键盘消息中,其实每当按下一个物理键时将产生24个消息,并非每个消息都是你期望的结果。
* 所以依据你要完成的具体功能适当在WM_CHAR、WM_KEYDOW、WM_XXX等时机,于lParam,wParam参数中获取有用数据。

lParam 参数

 主键状态
     |
 |  |-描述表代码
-----|--|----------------  ----------------  ----------------
|1F|1E|1D|1C|1B|1A|19|18|  |17|16|..|11|10|  |0F|0E|..|01|00|
-|-------|-----------|-|-  |--------------|  |--------------|
 |       |--8位标志--| |   |--8位扫描代码-|  |-16位重复计数-|
 |                     |
 |_转换状态      扩展键盘标志

可以简单的定义为:

unsigned long rep     = lParam & 0x0000ffff;  //计数
unsigned long scode   = lParam & 0x00ff0000;  //扫描码
unsigned long rcode   = lParam & (1 << 24);   //扩展键盘标志
unsigned long bcode   = lParam & (1 << 29);   //描述表
unsigned long sate    = lParam & (1 << 30);   //主键状态
unsigned long tabsate = lParam & (1 << 31);   //转换状态

#2


想要控制的程序发送WM_CHAR消息

#3


利用SendMessage()

#4


关注

#5


模拟键盘输入实现程序的自动演示 


(安徽 王翼)



  许多优秀的软件都有出色的DEMO(演示)功能,给人留下深刻的印象。DEMO程序或
许多CAI(计算机辅助教学)软件经常需要模拟键盘输入所需的文件名,来实现程序的
自动运行。要实现键盘的模拟输入,必须了解键盘缓冲区的结构及相应编程机理。键
盘缓冲区在内存中的地址分配如下:
004:001AH0040:001BH存放键盘缓冲区首指针;
004:001CH0040:001DH存放键盘缓冲区尾指针;
004:001AH0040:001BH键盘缓冲区,存放击键字符。
  每次击键用2字节存放。若为功能键,则第一个字节为0,第二个字节为该键的扩
展码;若为普通键,则第一个字节为该健的ASCCII码,第二字节为0。每击一次键,
数据送入键盘缓冲区中尾指针指向的单元,同时尾指针加2;从键盘缓冲区读出键时,
数据从缓冲区队列中首指针指示的单元取出,首指针同时加2。若首尾指针相等,表
示缓冲区为空。要实现对键盘缓冲区的自动操作,这里利用C语言的对内存直接读库
函数peek()和对内存直接写函数pokeb(),从而实现模拟键盘输入功能。
  程序中的关键函数是keyboard(int choice,char key[]),若choice参数不为0,
则key字符串中的字符的ASCII码逐个送入键盘缓冲区;如果choice参数为0,则将功
能键的扩展码送键盘缓冲区主程序运行后,如果5秒钟内不通过键盘输入所需的文件
名,则调用keyboard函数利用模拟键盘输入功能输入bar3d.c(CR),由此实现程序自
动运行。
程序在P133多媒体机上采用Turbo C 2.0编译连接通过,运行正常。
/*filename:demo-kbd.c*/
/*模拟键盘输入使程序自动运行 */
#include<stdio.h>

#include <stdlib.h>
#include 
<alloc.h>
keyboard(int choice,char key[])
{
int offset,i;
offset=peek(0x40,0x1c);
for(i=0;key[i]!='';i++)
{
if(choice==0)
{
pokeb(0x40,offset,0x00);
pokeb(0x40,offset,key[i]);
}
if(choice!=0)

{
pokeb(0x40,offset,key[i]);
pokeb(0x40,offset+1,0x00);
}
offset=offset+2;
if(offset==0x3e)offset=0x1e;
}
pokeb(0x40,0x1c,offset);
}
main()
{
struct time tt;
char name[10];
int t,t1,t2,flag=0;
gettime(&tt);
t1=tt.ti_sec;
printf("input files name");
while(!kbhit())
{
gettime(&tt);
t2=tt.ti_sec;
t=t2-t1;
if(t>5)
{
flag=1;
break;
}
}
if(flag==1)keyboard(1,"mljp.c\x0D");
gets(name);
printf("\s",name);
}

#6


用日志钩子可以实现吧?

#7


blue_soft(成长在csdn上) :
    能在windows 环境下使用吗?以前在纯dos下实现过(用ms c 5.0),现在我想用vc++在windows下编程,机制是一样吗?如果一样可以结贴了。

#8


我对windows下编程不熟悉

#9


这程序干什么用的?