微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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生效.在后续调用中,您指定的参数将生效.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐