【问题标题】:Delphi - show a console app from SW_HIDE stateDelphi - 从 SW_HIDE 状态显示控制台应用程序
【发布时间】:2016-09-29 19:13:27
【问题描述】:

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

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

有什么问题?

【问题讨论】:

  • 也许superuser.com/a/404246 的一些技巧可以提供帮助。另外,也许您还需要显示/激活Application.Handle的窗口
  • @Arioch 这是一个控制台子系统应用程序。为什么它会包含 VCL?为什么 VCL win 确实与控制台窗口有关?
  • 您是否尝试过两次拨打ShowWindow(GetConsoleWindow, SW_SHOW)
  • @Arioch'TApplication 仅在 Vcl.Forms 在任何地方声明时才在 DLL 中。实际上TApplication VCL 特定的。它在 VCL 单元中定义。 Firemonkey 也有自己的TApplication。服务有它,是的,因为德尔福的服务实现是在 VCL 中。实际上,服务的TServiceApplication 定义在Vcl.SvcMgr
  • @Arioch'The: TApplication 在控制台应用程序中不可用,除非您将 Forms 添加到 uses 子句。我很惊讶你不知道这个事实。 (你可以自己测试一下;File->New->Other->Console application,把WriteLn(Application.Handle);放在begin之后,按F9。它编译了吗?)

标签: delphi console-application


【解决方案1】:

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

ShowWindow() 的文档说:

nCmdShow [in]
类型:int

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

所以,第一次调用ShowWindow 时,传递给ShellExecuteEx()SW_HIDE 就会生效。在后续调用中,您指定的参数将改为生效。

【讨论】:

    猜你喜欢
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 2019-01-30
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多