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

我在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);

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

问题是什么?

解决方法

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

ShowWindow()的文档说:

nCmdshow [in]
Type: int

Controls how the window is to be shown. This parameter is ignored the first time an application calls ShowWindow,if the program that launched the application provides a 07001 structure. Otherwise,the first time ShowWindow is called,the value should be the value obtained by the WinMain function in its nCmdshow parameter. In subsequent calls,this parameter can be one of the following values…

因此,第一次调用ShowWindow时,传递给ShellExecuteEx()的SW_HIDE生效.在后续调用中,您指定的参数将生效.

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...