怎么向DOS程序发键盘字符?(200分)

  • 主题发起人 主题发起人 johnlee4u
  • 开始时间 开始时间
J

johnlee4u

Unregistered / Unconfirmed
GUEST, unregistred user!
我要做一个DOS程序的SHELL,该程序很老,而且不能改。
我想知道怎么样能把我在SHELL中输入的命令发送到DOS程序中?就以WIN中的DOS窗口为例。
最好能有原码,我的水平很差。。。 ;谢谢
 
这个问题不会太难吧,Delphi光盘的/Info/Extras/目录有个SendKeys单元,可以方便的向
其它窗口发送键盘事件,用AppActivate函数激活窗口,SendKey发送键盘事件即可。
 
这样只能够向有焦点的程序发吧,我不希望操作者看到原来的程序,该怎么办?
 
您的这个也太简单了吧,能多讲一下么?
 
savenight说得没错,用管道就可以实现你要的功能!
你查查CreatePipe, ReadFile, WriteFile等API, MICROSOFT也有DEMO:
http://support.microsoft.com/support/kb/articles/Q190/3/51.ASP
 
xianjun:
能讲的详细一点么,或者有DELPHI的例程?
 
不知道你的程序是不是象CMD那样的
如果是的话也就可以用我手头的这个DEMO应该没问题
 
;savenight虽然只说了两个字,但却说到了点子上,我给你贴一段我自己的代码吧,我Pascal语言不太好,
; 用的是C++Builder,有注释应该能看懂吧

; 我这段程序是做了一个UPX.exe的Shell,通过.res资源文件先将UPX.exe包在我的程序中,用时将其释放
; 出来,用完删掉。其中,管道的主要作用是取得那个DOS程序运行结束时的信息



; btnSelectFile->Enabled = false;
; btnCompress->Enabled = false;
; char UPX[MAX_PATH];
; unsigned long ret;

; //我将UPX.exe改为UPXWaiKe.exe,这里判断在Shell程序所在的目录下,UPXWaiKe.exe是否存在,
; //若没有,将事先包在Shell的UPXWaiKe.exe释放出来,准备使用
; strcpy(UPX, (ExtractFilePath(Application->ExeName)+ AnsiString("UPXWaiKe.exe")).c_str());
; ret = GetFileAttributes(UPX);
; if(ret == 0xffffffff)
; {
; ; TResourceStream *rs = new TResourceStream( (int)HInstance, AnsiString("UPXFile"), "EXEFILE" );
; ; rs->SaveToFile( AnsiString(UPX) );
; ; delete rs;
; }

; AnsiString DelFile = AnsiString(UPX);
; //这里是要向UPXWaiKe.exe传递的参数,实际的命令行是,比如:
; // c:/UPXWaiKe.exe -9 -k c:/aaa.exe ,那么这里的参数部分就应该是 “ -9 -k c:/aaa.exe”
; AnsiString Str_Param;
; Str_Param = " -" + IntToStr(tbrCompressRate->Position+1); //压缩比参数
; if(cbxBackup->Checked) //保存备份参数
; ; Str_Param += " -k";
; Str_Param += " " + SelectFile; //文件名
; strcat(UPX, Str_Param.c_str());

; ///////////////////////////////////////////////////////////////////////////////////
; int FBreak; // 声明一个退出标志
; SECURITY_DESCRIPTOR sd;
; SECURITY_ATTRIBUTES sa;
; LPSECURITY_ATTRIBUTES lpsa = NULL;

; if(IsWindowsNT()) // 判断是否为NT内核
; {
; ; InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
; ; SetSecurityDescriptorDacl(&sd, true, NULL, false);
; ; sa.nLength = sizeof(SECURITY_ATTRIBUTES);
; ; sa.bInheritHandle = true;
; ; sa.lpSecurityDescriptor = &sd;
; ; lpsa = &sa;
; }

; HANDLE hReadPipe; //建立管道,准备取得UPXWaiKe.exe运行完成时的信息
; HANDLE hWritePipe;
; assert(CreatePipe(&hReadPipe, &hWritePipe, lpsa, 2500000));

; STARTUPINFO si; //设置相关的结构
; memset(&si, 0, sizeof(STARTUPINFO));
; si.cb = sizeof(STARTUPINFO);
; si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
; si.wShowWindow = SW_HIDE;
; si.hStdOutput = hWritePipe;
; si.hStdError = hWritePipe;
; PROCESS_INFORMATION pi;
; assert(hWritePipe);

; TStringList *Results = new TStringList;
; //执行UPXWaiKe.exe
; if( CreateProcess(NULL,
; ; ; ; ; ; ; ; ; ; UPX,
; ; ; ; ; ; ; ; ; ; NULL,//security
; ; ; ; ; ; ; ; ; ; NULL,// security
; ; ; ; ; ; ; ; ; ; TRUE,//inherits handles
; ; ; ; ; ; ; ; ; ; 0,
; ; ; ; ; ; ; ; ; ; 0,
; ; ; ; ; ; ; ; ; ; 0,
; ; ; ; ; ; ; ; ; ; &si,
; ; ; ; ; ; ; ; ; ; &pi
; ; ; ; ; ; ; ; ; ; ))
; {
; ; //
; ; CloseHandle(pi.hThread);
; ; WaitForSingleObject(pi.hProcess, 90000);

; ; // read from the pipe and put in richedit
; ; assert(hReadPipe);
; ; DWORD BytesRead; //unsigned long
; ; char dest[4000];
; ; bool RdLoopDone = false;
; ; Results->Clear();
; ; FBreak = 1;
; ; while(!RdLoopDone) //将命令行工具的结果写入ResultsRE
; ; {
; ; ; memset(dest, 0, 4000);
; ; ; assert(ReadFile(hReadPipe, &dest, sizeof(dest), &BytesRead, NULL));
; ; ; Results->Text = String(dest);
; ; ; if(BytesRead < 4000)
; ; ; ; RdLoopDone = true;
; ; ; if(FBreak > 150)
; ; ; ; RdLoopDone = true;
; ; ; FBreak++;
; ; }
; }
; CloseHandle(hReadPipe);
; CloseHandle(hWritePipe);
; CloseHandle(pi.hProcess);

; AnsiString SubResults = Trim(Results->Strings[6]);
; AnsiString StrTmp = "";
; Results->Clear();
; if(SubResults[1] == 'U')
; ; MessageBox(NULL,"失败的原因有如下几种可能:/n1.目标文件已经被压缩过或被保护了/n2.目标文件不是应用程序,而是其它打包文件",
; ; ; ; ; "压缩失败",MB_OK|MB_ICONSTOP);
; else
; {
; ; for(int i=1; i<=SubResults.Length(); i++)
; ; {
; ; ; if(SubResults != ' ')
; ; ; ; StrTmp += SubResults;
; ; ; else
; ; ; {
; ; ; ; if(SubResults[i-1] != ' ')
; ; ; ; {
; ; ; ; ; Results->Add(StrTmp);
; ; ; ; ; StrTmp = "";
; ; ; ; }
; ; ; }
; ; }
; ; Results->Add(StrTmp);
; ; lblAfterLength->Caption = Results->Strings[2] + "字节";
; ; lblCompressRate->Caption = Results->Strings[3];
; }
; delete Results;
; btnSelectFile->Enabled = true;
; DeleteFile(DelFile);

有什么不明白的,说出来

我是穷人,很想得这100分的说[:(][^]
 
to HD_Copy:   如果johnlee4u的程序不支持命令行参数呢?而且我觉得他的目的是在
        程序运行的时候控制它,而不是象调用UPX那样,只要启动时传个参数
        再把运行结果提取出来这么简单。
 
to xianjun:
; ;那你给个例子吧,谢谢!
; ;HD_Copy@163.com
 
我手头的这个DEMO只对象CMD.exe这样的程序有效,对其他的真不知道了。
Redirect.zip 请查收
 
多谢xianjun大侠[:)]
 
HD_Copy:我要控制的程序其实也是一个SHELL,要在其中输入不同的指令,
; ; ; ;它再通过串口发出去的。
xianjun:我也要那个程序呀:)
johnlee4u@sina.com
 
已发, 看看能不能实现你的要求
 
我还没有仔细的看那个程序,不过先谢了。
结束了问题吧。
 
后退
顶部