想要调用cmd.exe,执行命令后,如何让黄色字不回显?

wdywmz 2021-02-10 11:23:09
想要调用cmd.exe,执行命令后,如何让黄色字不回显?
其他内容正常回显,而且不要隐藏cmd的窗口。 只是想不显示黄色的文字,我要把命令隐藏起来,不想让客户知道我运行了什么命令,因为这些命令是我花费了时间研究出来的。

而且必须 实时通过我的主程序 postmessage 命令给 cmd窗口,让窗口来执行。
或者你有更好的办法也行。谢谢。

...全文
2920 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cranley 2023-07-03
  • 打赏
  • 举报
回复


function RunCommand(const cmd: string; list: TStrings): string;
var
  hReadPipe, hWritePipe: THandle;
  si: STARTUPINFO;
  lsa: SECURITY_ATTRIBUTES;
  pi: PROCESS_INFORMATION;
  cchReadBuffer: DWORD;
  pOutStr: PAnsiChar; // or PChar;
  res, strCMD: string;
  fname: PChar;
begin
  strCMD := cmd;
  pOutStr := AllocMem(5000);
  fname := AllocMem(255);
  lsa.nLength := SizeOf(SECURITY_ATTRIBUTES);
  lsa.lpSecurityDescriptor := nil;
  lsa.bInheritHandle := True;
  try
    if not CreatePipe(hReadPipe, hWritePipe, @lsa, 0) then
      Exit;

    FillChar(si, SizeOf(STARTUPINFO), 0);
    si.cb := SizeOf(STARTUPINFO);
    si.dwFlags := (STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW);
    si.wShowWindow := SW_Hide;
    si.hStdOutput := hWritePipe;
    StrPCopy(fname, strCMD);
    try

      if not CreateProcess(nil, PChar(fname), nil, nil, True, 0, nil, nil,
        si, pi) then
        Exit;
      try
        while (True) do
        begin
          if not PeekNamedPipe(hReadPipe, pOutStr, 1, @cchReadBuffer, nil, nil)
          then
            break;
          if cchReadBuffer <> 0 then
          begin
            if not ReadFile(hReadPipe, pOutStr^, 4096, cchReadBuffer, nil) then
              break;
            pOutStr[cchReadBuffer] := chr(0);
            // if @Show <> nil then Show(pOutStr);
            list.Add(pOutStr);
          end
          else if (WaitForSingleObject(pi.hProcess, 0) = WAIT_OBJECT_0) then
            break;
          Sleep(10);
          Application.ProcessMessages;
        end;
        pOutStr[cchReadBuffer] := chr(0);
        list.Add(pOutStr);
      finally
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
        CloseHandle(hWritePipe);
      end;
    finally
      CloseHandle(hReadPipe);
    end;

  finally
    FreeMem(pOutStr);
    FreeMem(fname);
  end;

  Result := res;
end;

procedure TForm3.Button1Click(Sender: TObject);
var
  cmd: string;

begin
  cmd := 'ping baidu.com ';
  RunCommand(cmd, Memo1.Lines);
end;

办法就是跳过cmd命令,自己用管道来显示程序输出。比如上面的代码将ping 命令输出到memo1上面。
多个命令就多跑几次RunCommand。
这个办法就不会有什么CMD窗口了,显示输出接管在自己的程序里面,更方便些 。

墨梅无痕 2021-02-14
  • 打赏
  • 举报
回复
楼主的想法是不可行的,你无法控制cmd窗口自身的显示,解决办法只有自己写一个窗口来显示命令执行的结果。
wdywmz 2021-02-12
  • 打赏
  • 举报
回复
命令是动态生成的,楼上2位办法不行。
我在地球 2021-02-11
  • 打赏
  • 举报
回复
@echo off 行不?
doloopcn 2021-02-10
  • 打赏
  • 举报
回复
1.使用@echo off

2.使用:命令 >任意名称
任意名称实质上就是一个文件,命令的结果都生成在“任意名称”的文件中,但不显示在屏幕,你需要手工或自动删除“任意名称”文件

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧