急,cmd启动问题,分不多,希望好心人帮忙(80分)

  • 主题发起人 主题发起人 figoxie
  • 开始时间 开始时间
F

figoxie

Unregistered / Unconfirmed
GUEST, unregistred user!
我想做一个程序启动cmd,目前用的是<br> winexec('cmd.exe',SW_NORMAL); &nbsp;//可以正常启动<br>然后通过cmdhandle:=findwindow(cmd.exe',nil);为何拿不到该窗口的句柄啊<br><br>还有就是我想拿到句柄后向cmd发送注入‘ping’之类的消息以达到与键盘输入同样的效果<br>用函数sendmessage不知可行否,谢谢
 
你这样当然拿不到了。。。你的findwindow就用错了。你看看帮助中的参数说明,<br>不是用文件名上在里面就成的。是类名和title
 
用windowsname 或classname得到。<br>findwindows('','C:/WINDOWS/system32/cmd.exe') &nbsp;or<br>findwindows('ConsoleWindowClass','')
 
楼上的都说了,你的FINDWINDOWS用错。<br>如果怕SENDMESSAGE发送不了就用keybd_event,肯定就可以了。
 
cmdhandle:= FindWindow('nil','窗口标题名');
 
用了几种方法都不行,返回的cmdhandle始终是0
 
不要用winexec去启动cmd,用CreateProcess &nbsp;(使用方法自己去查帮助吧)<br>然后使用管道和端口重定向技术,就可以实现向被启动的cmd程序输入内容<br>比如dir等命令,甚至你要是喜欢,dir之后的输出内容都可以显示在你程序中的memo控件中
 
不要试图得到cmd的句柄来对其操作,cmd作为一个虚拟机来说功能已经很强大了!<br>如果要到达ping的效果,可以直接调用,我不明白楼主具体是怎么想的。好像在画蛇添足。
 
编译通过。自已看,。。。<br>procedure TForm1.Button2Click(Sender:TObject);<br>var<br> &nbsp; &nbsp;hWindow &nbsp; &nbsp; &nbsp; &nbsp; :THandle;<br> &nbsp; &nbsp;i &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :integer;<br> &nbsp; &nbsp;ping &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:string;<br>begin<br> &nbsp; &nbsp;ping:='ping 127.0.0.1';<br> &nbsp; &nbsp;winexec('cmd.exe',SW_NORMAL);<br> &nbsp; &nbsp;hWindow:=FindWindow('ConsoleWindowClass',nil);<br> &nbsp; &nbsp;if hWindow=0 then<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp; &nbsp;ShowMessage('未找到指定窗口');<br> &nbsp; &nbsp; &nbsp; &nbsp;Exit;<br> &nbsp; &nbsp;end<br> &nbsp; &nbsp;else<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp; &nbsp;SetForegroundWindow(hWindow);<br> &nbsp; &nbsp; &nbsp; &nbsp;SetActiveWindow(hWindow);<br> &nbsp; &nbsp; &nbsp; &nbsp;for i:=1 to Length(ping) do SendMessage(hWindow,WM_CHAR,Ord(ping),1);<br> &nbsp; &nbsp; &nbsp;<br> &nbsp; &nbsp;end;<br>end;
 
解决了,发现是路径错误导致出错,加了个参数就可以处理所有情况了<br><br>cmdhandle:=ShellExecute(form1.Handle,'open','cmd.exe',PAnsiChar('/k'+'run.bat'),nil,SW_SHOW);<br><br>谢谢大家乐
 
多人接受答案了。
 
后退
顶部