Delphi - 显示来自SW_HIDE状态的控制台应用程序

时间:2016-09-29 19:13:27

标签: delphi console-application

我在Delphi中有一个控制台应用程序,我从另一个应用程序开始这样:

FillChar(ExecInfo, SizeOf(ExecInfo), 0);
With ExecInfo Do Begin
  cbSize :=       SizeOf(ExecInfo);
  fMask :=        SEE_MASK_NOCLOSEPROCESS or SEE_MASK_NOASYNC;
  Wnd :=          GetActiveWindow();
  lpVerb :=       PChar('runas');
  lpFile :=       PChar(FsCurrentPath + 'Install\Install_Elevated.exe');
  lpDirectory :=  PChar(FNew.sBinDir);
  lpParameters := PChar(sl.DelimitedText);
  nShow :=        SW_HIDE
End;
ShellExecuteEx(@ExecInfo);

在某些情况下,我想让它显示出来(采取SW_SHOWNORMAL状态)。我该怎么办?

这种方式没有显示:

ShowWindow(GetConsoleWindow, SW_SHOW);

即使不是这样:

BringWindowToTop(GetConsoleWindow);
SetActiveWindow(GetConsoleWindow);
SetForegroundWindow(GetConsoleWindow);
ShowWindow(GetConsoleWindow, SW_SHOW)

但它以这种方式表现出来:

MessageBox(GetConsoleWindow, PChar(IntToStr(GetConsoleWindow)), PChar(''), MB_SETFOREGROUND);
ShowWindow(GetConsoleWindow, SW_SHOW);

但当然我不想要这个消息框。

有什么问题?

1 个答案:

答案 0 :(得分:8)

shell将您通过SHELLEXECUTEINFO提供的信息通过CreateProcess()传递给控制台应用程序,该应用程序在您第一次尝试显示控制台窗口时就会记住该信息。

ShowWindow()的文档说:

  

nCmdShow [in]
  输入:int

     

控制窗口的显示方式。 如果启动应用程序的程序提供STARTUPINFO结构,则应用程序第一次调用ShowWindow时会忽略此参数。否则,第一次调用ShowWindow时,该值应该是WinMain参数中nCmdShow函数获取的值。在后续调用中,此参数可以是以下值之一...

因此,当您第一次致电ShowWindow时,传递给SW_HIDE的{​​{1}}生效。在后续调用中,您指定的参数将生效。