问题1、批处理设置,问题2、向DOS程序发送消息。每个问题500分。另外给
一个已有的DOS控制台程序,使用的时候先输入一个参数回车以后再输入输入文件的名字回车,之后再输入输出文件的名字回车得到结果,求两种办法来使这个流程自动化。
办法1、通过写批处理。本人不熟悉批处理,求代码。
办法2、通过另一个程序发送消息过来,DOS程序的类为“ConsoleWindowClass”,无法用SPY看到输入的MSG及wparam、lparam。求代码。
每个解决办法500分,另外开题再给,谢谢。
问题点数:100、回复次数:21Top
1 楼pomelowu(羽战士)回复于 2006-03-02 21:04:51 得分 0
新建个文本文件,输入(假如exe的名字叫Sample1.exe)
Sample1.exe para1
para2
另存为.bat文件,比如Sample.bat
运行这个sample.bat试试看。Top
2 楼pomelowu(羽战士)回复于 2006-03-02 21:10:32 得分 1
嗯。好像不行Top
3 楼chehw(chehw)回复于 2006-03-02 21:45:14 得分 0
可以使用输入输出重定向, 分别创建将dos程序的标准输入指向输入管道,将dos程序的标准输出指向输出管道,通过程序进行控制。Top
4 楼striking(庸人自扰)回复于 2006-03-02 21:52:48 得分 0
第一个参数, 可以实现吧.
第2个参数, cin>>等待.
第3个参数, cin>>等待.
不知道我这样子是否满足要求Top
5 楼supersusheng(我是谁?)回复于 2006-03-02 22:02:11 得分 0
postmessage或者sendmessage的办法呢?
好像我原来试过一个Vfox开发的系统,也不可以驱动其运作。Top
6 楼supersusheng(我是谁?)回复于 2006-03-02 22:04:14 得分 0
to striking and chehw
老大,能不能象pomelowu(羽战士) 一样给详细点,小弟真的很水哦。
谢谢。
Top
7 楼striking(庸人自扰)回复于 2006-03-02 22:22:05 得分 1
办法1: 先将参数记录到文件中.
一下代码实现在程序启动时读取文件.
#define MAXLINE 512
void DoLoop(FILE *fp)
{
int n;
char sendline[MAXLINE];
char recvline[MAXLINE+1];
while (fgets(sendline, MAXLINE, fp) != NULL)
{
n = strlen(sendline);
cout << sendline << endl;
}
if (ferror(fp))
cout << "DoLoop: error reading file" ;
}
你只需要在main函数开头调用 : DoLoop( stdin ); 即可.
这样行不行
Top
8 楼striking(庸人自扰)回复于 2006-03-02 22:24:08 得分 0
承上,批处理文件这样写
test < testme.txt
保存.testme.txt为你的参数的文件.
运行bat.Top
9 楼chehw(chehw)回复于 2006-03-02 22:50:00 得分 0
输入输出重定向是进程间通讯的一项基本技术, 作用类似于dos下的 -> | <.
代码较长,有空儿我写一个程序给你.Top
10 楼supersusheng(我是谁?)回复于 2006-03-02 23:08:34 得分 0
to striking(硬撑者 thecpp@hotmail.com)
DOS程序是专用的仿真软件,没有代码也无法调用写的这个函数的。所以比较麻烦。Top
11 楼supersusheng(我是谁?)回复于 2006-03-02 23:10:24 得分 0
to chehw(chehw)
你提到的这个办法好像有门,麻烦老大帮忙再找段代码或指点一二,谢谢。Top
12 楼striking(庸人自扰)回复于 2006-03-02 23:24:55 得分 0
搞了半天, 理解错误
-_-Top
13 楼chehw(chehw)回复于 2006-03-02 23:31:54 得分 2
留个email, 明天我给你发过去.Top
14 楼crushor()回复于 2006-03-03 00:54:46 得分 0
修改你的控制台程序行不?
一次接受2个参数,问题不就都解决了?Top
15 楼supersusheng(我是谁?)回复于 2006-03-03 11:37:19 得分 0
to chehw(chehw)
邮件是supersusheng@yahoo.com.cn,谢谢大佬先。
to crushor() ( )
没有控制台程序的代码,没有办法修改。控制台程序需要手动一步一步设置,目的就在于以其他方式使这个手动设置的流程自动化起来。
有没有通过窗口发消息Sengmessage或postmessage的方式解决这个问题的办法啊?Top
16 楼Snow_Ice11111(雪上加冰)回复于 2006-03-03 13:23:18 得分 96
还是发送模拟按键吧:
HWND hwnd=::FindWindow("ConsoleWindowClass","D:\\WINDOWS\\System32\\cmd.exe"); //后面D:\\WINDOWS\\System32\\cmd.exe要换成你的目标程序的标题栏内容
CWnd::FromHandle(hwnd)->SetForegroundWindow();
::PostMessage(hwnd,WM_KEYDOWN, 'd'-'a'+65, 0L);
::PostMessage(hwnd,WM_KEYDOWN, 'i'-'a'+65, 0L);
::PostMessage(hwnd,WM_KEYDOWN, 'r'-'a'+65, 0L);
::PostMessage(hwnd,WM_KEYDOWN,VK_RETURN, 0L);
上面的代码是向XP下DOS窗口发送dir命令。经过 VC++6.0下测试无误,自己再完善一下就行了。Top
17 楼Snow_Ice11111(雪上加冰)回复于 2006-03-03 13:45:43 得分 0
HWND hwnd=0;
hwnd=::FindWindow("ConsoleWindowClass","D:\\WINDOWS\\System32\\cmd.exe");
if (hwnd)
{
CWnd::FromHandle(hwnd)->SetForegroundWindow();
::PostMessage(hwnd,WM_KEYDOWN, 'd'-'a'+65, 0L);
::PostMessage(hwnd,WM_KEYDOWN, 'i'-'a'+65, 0L);
::PostMessage(hwnd,WM_KEYDOWN, 'r'-'a'+65, 0L);
::PostMessage(hwnd,WM_KEYDOWN,VK_RETURN, 0L);
}
else
AfxMessageBox("Can't find the target console window.");Top
18 楼Snow_Ice11111(雪上加冰)回复于 2006-03-03 14:04:25 得分 0
另外,若我的方法侥幸可以实现你的要求的话,请不要另外开贴给分了,谢谢!Top
19 楼supersusheng(我是谁?)回复于 2006-03-03 16:58:43 得分 0
感谢Snow_Ice11111(雪上加冰),采用的方法、效果和我预期的完全一致。
to chehw(chehw)
明天结帖了。Top
20 楼supersusheng(我是谁?)回复于 2006-03-04 10:53:44 得分 0
女同胞比较厉害哦。Top
21 楼chehw(chehw)回复于 2006-03-05 11:48:16 得分 0
来晚了.
邮件已发.Top




