Delphi - 从 SW_HIDE 状态显示控制台应用程序

4

我有一个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
你尝试过两次调用 ShowWindow(GetConsoleWindow, SW_SHOW) 吗? - Sertac Akyuz
即使是 DLL 也有 TApplication,即使是 Service 也有。TApplication 不仅限于 VCL。 - Arioch 'The
如果启动应用程序的程序在结构中指定了启动信息,则在第一次调用ShowWindow时,nCmdShow值将被忽略。 - trob
1
@Arioch' 如果在任何地方声明了 Vcl.Forms,则 TApplication 仅在 DLL 中。实际上,TApplication VCL 特定的。它在 VCL 单元中定义。Firemonkey 也有自己的 TApplication。服务也有它,因为 Delphi 的服务实现在 VCL 中。实际上,服务的 TServiceApplicationVcl.SvcMgr 中定义。 - Jerry Dodge
2
@Arioch'The:在控制台应用程序中,如果您没有将“Forms”添加到使用条款中,则无法使用TApplication。我很惊讶您不知道这个事实。(您可以自行测试;文件->新建->其他->控制台应用程序,在“begin”后放置“WriteLn(Application.Handle);”,然后按F9。它能编译吗?) - Ken White
显示剩余8条评论
1个回答

8

当您首次尝试显示控制台窗口时,shell通过SHELLEXECUTEINFO向控制台应用程序传递信息,该信息通过CreateProcess()进行处理。

ShowWindow()的文档如下:

nCmdShow [in]
类型:int

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

因此,在首次调用ShowWindow时,传递给ShellExecuteEx()SW_HIDE生效。在随后的调用中,将使用您指定的参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接