user-0 提问: VC 如何向TEST.exe程序发送模拟键盘指令‘A’

回复:
user: user-0
content: 引用 11 楼 Entre_ 的回复:void inputKey() {     INPUT keyEvent = {0};     keyEvent.type = INPUT_KEYBOARD;     keyEvent.ki.wVk = 0x41;     keyEvent.ki.wScan = MapVirtualKey(0x41, 0);//增加映射扫描码     :: SendInput(1, &keyEvent, sizeof(keyEvent));     Sleep(1000);      keyEvent.ki.dwFlags = KEYEVENTF_KEYUP;     ::SendInput(1, &keyEvent, sizeof(keyEvent)); }   OK，运行通过，谢谢哈

user: user-0
content: 引用 10 楼 cutmelon 的回复:看样子你这是windows上运行的吧，给你段代码，研究一下SendInput这个api吧 void SimulateKeyboard(HWND hWnd) { 	//把窗口放到前台接收输入 	::SetForegroundWindow(hWnd);  	//键盘事件 	INPUT ip; 	ip.type=INPUT_KEYBOARD; 	ip.ki.wScan=0; 	ip.ki.time=0; 	ip.ki.dwExtraInfo=0;  	//按下a 	ip.ki.wVk=0x41; 	ip.ki.dwFlags=0; 	::SendInput(1,&ip,sizeof(INPUT)); 	//抬起a 	ip.ki.dwFlags=KEYEVENTF_KEYUP; 	::SendInput(1,&ip,sizeof(INPUT)); }   谢谢您给我的思路

user: user-1
content: void inputKey() {     INPUT keyEvent = {0};     keyEvent.type = INPUT_KEYBOARD;     keyEvent.ki.wVk = 0x41;     keyEvent.ki.wScan = MapVirtualKey(0x41, 0);//增加映射扫描码     :: SendInput(1, &keyEvent, sizeof(keyEvent));     Sleep(1000);      keyEvent.ki.dwFlags = KEYEVENTF_KEYUP;     ::SendInput(1, &keyEvent, sizeof(keyEvent)); }

user: user-2
content: 使用 按键精灵软件 或 www.autohotkey.com 试试看。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！  都不知道你在说些什么，牛头不对马尾，唉

user: user-3
content: 看样子你这是windows上运行的吧，给你段代码，研究一下SendInput这个api吧 void SimulateKeyboard(HWND hWnd) { 	//把窗口放到前台接收输入 	::SetForegroundWindow(hWnd);  	//键盘事件 	INPUT ip; 	ip.type=INPUT_KEYBOARD; 	ip.ki.wScan=0; 	ip.ki.time=0; 	ip.ki.dwExtraInfo=0;  	//按下a 	ip.ki.wVk=0x41; 	ip.ki.dwFlags=0; 	::SendInput(1,&ip,sizeof(INPUT)); 	//抬起a 	ip.ki.dwFlags=KEYEVENTF_KEYUP; 	::SendInput(1,&ip,sizeof(INPUT)); }

user: user-2
content: 让TEXT.exe运行在DoxBox虚拟机中你再试试SendMessage好不好使。

user: user-2
content: 楼主知不知道TEST.exe是运行在ntvdm虚拟机中的？

user: user-0
content: UP ，大神，你在哪里？？！！

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:使用 按键精灵软件 或 www.autohotkey.com 试试看。 不说你了，肯定很忙，回来的还不如不回答

user: user-2
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！

user: user-4
content: 如果使用SendMessage都没用，那么别的基本上都没有效果。  另外，我觉得你是不是发错消息了？发送CHAR消息吗？难道不应该发送KEY消息吗？