调用一个应用程序,然后自动模拟键盘输入命令,运行完毕后,再调用另外一程序
再自动模拟键盘输入命令,运行完毕后退出。谁能给出思路,能有简单的例程更好。
:)!!!
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); //转换状态
* 在实际的键盘消息中,其实每当按下一个物理键时将产生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);
}
(安徽 王翼)
许多优秀的软件都有出色的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下编程,机制是一样吗?如果一样可以结贴了。
能在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); //转换状态
* 在实际的键盘消息中,其实每当按下一个物理键时将产生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);
}
(安徽 王翼)
许多优秀的软件都有出色的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下编程,机制是一样吗?如果一样可以结贴了。
能在windows 环境下使用吗?以前在纯dos下实现过(用ms c 5.0),现在我想用vc++在windows下编程,机制是一样吗?如果一样可以结贴了。
#8
我对windows下编程不熟悉
#9
这程序干什么用的?