【发布时间】: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