我在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);
但当然我不想要这个消息框。
有什么问题?
答案 0 :(得分:8)
shell将您通过SHELLEXECUTEINFO
提供的信息通过CreateProcess()
传递给控制台应用程序,该应用程序在您第一次尝试显示控制台窗口时就会记住该信息。
ShowWindow()
的文档说:
nCmdShow [in]
输入:int
控制窗口的显示方式。 如果启动应用程序的程序提供
STARTUPINFO
结构,则应用程序第一次调用ShowWindow
时会忽略此参数。否则,第一次调用ShowWindow
时,该值应该是WinMain
参数中nCmdShow
函数获取的值。在后续调用中,此参数可以是以下值之一...
因此,当您第一次致电ShowWindow
时,传递给SW_HIDE
的{{1}}生效。在后续调用中,您指定的参数将生效。