C# - 命令 window 在消失前出现十分之一秒
C# - Command window appears a tenth of a second before disappear
我试图在进程启动时隐藏命令 window。我使用此 ProcessStartInfo 配置启动 McAfee 病毒扫描:
ProcessStartInfo procInfo = new ProcessStartInfo();
procInfo.FileName = args[0];
...
procInfo.RedirectStandardOutput = true;
procInfo.WindowStyle = ProcessWindowStyle.Hidden;
procInfo.CreateNoWindow = false;
procInfo.UseShellExecute = false;
process.StartInfo = procInfo;
那么,我试试:
process.Start();
process.CloseMainWindow();
还有:
process.Start();
while (process.MainWindowHandle == IntPtr.Zero)
{
process.Refresh();
}
var handle = process.MainWindowHandle;
ShowWindow(handle, 0) //ShowWindow from user32.dll
但是在这两种情况下,命令 window 都会出现,并且在完全显示之前消失(就像最大化 window 并立即将其最小化一样)。我还玩过所有可能的 ProcessStartInfo 属性组合。我不需要 window 随时显示。我怎样才能做到这一点?提前致谢!
对于您问题中显示的代码块,行为是正常的。
一起来看看吧...
//[...]
procInfo.CreateNoWindow = false; //That's not what you meant
procInfo.UseShellExecute = false;
process.Start(); //Will show up the console window
process.CloseMainWindow(); //Will close the main window (probably also the whole application)
在 process.Start();
and process.CloseMainWindow();
之间是一个很短的时间范围,在此期间可以看到应用程序。
如@BugFinder 所述,将 CreateNoWindow
值从 false
编辑为 true
.
应该就足够了
检查是否有效。
你的第二次尝试让你离得更远:
process.Start();
while (process.MainWindowHandle == IntPtr.Zero)
{
process.Refresh(); //Let's do this as long as there is no window...
}
var handle = process.MainWindowHandle; //This occurs, when there is *already* a window.
ShowWindow(handle, 0) //ShowWindow from user32.dll
使用Shell函数的想法基本上不错,但是这段代码和上面的代码做的一样(而且也是非托管的)。
让我们尝试一种不同的方式,并从 PInvoke.Net 获取 C# 示例:(不比 ShowWindow()...)
public static void StartupNotepad()
{
const uint NORMAL_PRIORITY_CLASS = 0x0020;
const uint STARTF_USESHOWWINDOW = 0x1; //IMPORTANT for you
bool retValue;
string Application = Environment.GetEnvironmentVariable("windir") + @"\Notepad.exe";
string CommandLine = @" c:\boot.ini"; //Funny
PROCESS_INFORMATION pInfo = new PROCESS_INFORMATION();
STARTUPINFO sInfo = new STARTUPINFO();
sInfo.wShowWindow = 0; //IMPORTANT for you - See http://pinvoke.net/default.aspx/Enums/ShowWindowCommand.html
sInfo.dwFlags = STARTF_USESHOWWINDOW; //IMPORTANT for you
SECURITY_ATTRIBUTES pSec = new SECURITY_ATTRIBUTES();
SECURITY_ATTRIBUTES tSec = new SECURITY_ATTRIBUTES();
pSec.nLength = Marshal.SizeOf(pSec);
tSec.nLength = Marshal.SizeOf(tSec);
retValue = CreateProcess(Application,CommandLine,
ref pSec,ref tSec,false,NORMAL_PRIORITY_CLASS,
IntPtr.Zero,null,ref sInfo,out pInfo);
Console.WriteLine("Process ID (PID): " + pInfo.dwProcessId);
Console.WriteLine("Process Handle : " + pInfo.hProcess);
}
此示例以非常静态的方式演示了 CreateProcess(底部的 MSDN Link)的使用。
我建议你写一个更动态的函数并尝试一下。 PROCESS_INFORMATION
结构允许您稍后在应用程序中操作新创建的进程。如果您使用 CreateProcess() 调用时问题仍然存在,那就是检查启动的应用程序是否对自己做了一些棘手的事情。最后但并非最不重要的一点是问题是否不仅发生在您的计算机上...
这里还有一些参考资料:
- SO: WindowStyle.Hidden vs. CreateNoWindow = True
- SO: How to call
CreateProcess()
with STARTUPINFOEX
from C# and re-parent the child
- SO: winapi: CreateProcess but hide the process' window?
- MSDN:
ProcessStartInfo.CreateNoWindow
Property
- MSDN:
CreateProcess()
Function
- MSDN:
STARTUPINFO
Structure
编辑:
可能是一种解决方法,但如果您的第 3 方应用旨在显示 Window 并试图忽略您的请求,STARTUPINFO
也有 dwX
和 dwY
,如果 dwFlags
指定 STARTF_USEPOSITION
,则设置 Window 的位置。 dwXSize
和 dwYSize
.
相同
如果所有其他方法都失败了,您可以尝试并传递位置和大小,这会使过程看起来不可见。干杯。
我试图在进程启动时隐藏命令 window。我使用此 ProcessStartInfo 配置启动 McAfee 病毒扫描:
ProcessStartInfo procInfo = new ProcessStartInfo();
procInfo.FileName = args[0];
...
procInfo.RedirectStandardOutput = true;
procInfo.WindowStyle = ProcessWindowStyle.Hidden;
procInfo.CreateNoWindow = false;
procInfo.UseShellExecute = false;
process.StartInfo = procInfo;
那么,我试试:
process.Start();
process.CloseMainWindow();
还有:
process.Start();
while (process.MainWindowHandle == IntPtr.Zero)
{
process.Refresh();
}
var handle = process.MainWindowHandle;
ShowWindow(handle, 0) //ShowWindow from user32.dll
但是在这两种情况下,命令 window 都会出现,并且在完全显示之前消失(就像最大化 window 并立即将其最小化一样)。我还玩过所有可能的 ProcessStartInfo 属性组合。我不需要 window 随时显示。我怎样才能做到这一点?提前致谢!
对于您问题中显示的代码块,行为是正常的。
一起来看看吧...
//[...]
procInfo.CreateNoWindow = false; //That's not what you meant
procInfo.UseShellExecute = false;
process.Start(); //Will show up the console window
process.CloseMainWindow(); //Will close the main window (probably also the whole application)
在 process.Start();
and process.CloseMainWindow();
之间是一个很短的时间范围,在此期间可以看到应用程序。
如@BugFinder 所述,将 CreateNoWindow
值从 false
编辑为 true
.
应该就足够了
检查是否有效。
你的第二次尝试让你离得更远:
process.Start();
while (process.MainWindowHandle == IntPtr.Zero)
{
process.Refresh(); //Let's do this as long as there is no window...
}
var handle = process.MainWindowHandle; //This occurs, when there is *already* a window.
ShowWindow(handle, 0) //ShowWindow from user32.dll
使用Shell函数的想法基本上不错,但是这段代码和上面的代码做的一样(而且也是非托管的)。
让我们尝试一种不同的方式,并从 PInvoke.Net 获取 C# 示例:(不比 ShowWindow()...)
public static void StartupNotepad()
{
const uint NORMAL_PRIORITY_CLASS = 0x0020;
const uint STARTF_USESHOWWINDOW = 0x1; //IMPORTANT for you
bool retValue;
string Application = Environment.GetEnvironmentVariable("windir") + @"\Notepad.exe";
string CommandLine = @" c:\boot.ini"; //Funny
PROCESS_INFORMATION pInfo = new PROCESS_INFORMATION();
STARTUPINFO sInfo = new STARTUPINFO();
sInfo.wShowWindow = 0; //IMPORTANT for you - See http://pinvoke.net/default.aspx/Enums/ShowWindowCommand.html
sInfo.dwFlags = STARTF_USESHOWWINDOW; //IMPORTANT for you
SECURITY_ATTRIBUTES pSec = new SECURITY_ATTRIBUTES();
SECURITY_ATTRIBUTES tSec = new SECURITY_ATTRIBUTES();
pSec.nLength = Marshal.SizeOf(pSec);
tSec.nLength = Marshal.SizeOf(tSec);
retValue = CreateProcess(Application,CommandLine,
ref pSec,ref tSec,false,NORMAL_PRIORITY_CLASS,
IntPtr.Zero,null,ref sInfo,out pInfo);
Console.WriteLine("Process ID (PID): " + pInfo.dwProcessId);
Console.WriteLine("Process Handle : " + pInfo.hProcess);
}
此示例以非常静态的方式演示了 CreateProcess(底部的 MSDN Link)的使用。
我建议你写一个更动态的函数并尝试一下。 PROCESS_INFORMATION
结构允许您稍后在应用程序中操作新创建的进程。如果您使用 CreateProcess() 调用时问题仍然存在,那就是检查启动的应用程序是否对自己做了一些棘手的事情。最后但并非最不重要的一点是问题是否不仅发生在您的计算机上...
这里还有一些参考资料:
- SO: WindowStyle.Hidden vs. CreateNoWindow = True
- SO: How to call
CreateProcess()
withSTARTUPINFOEX
from C# and re-parent the child - SO: winapi: CreateProcess but hide the process' window?
- MSDN:
ProcessStartInfo.CreateNoWindow
Property - MSDN:
CreateProcess()
Function - MSDN:
STARTUPINFO
Structure
编辑:
可能是一种解决方法,但如果您的第 3 方应用旨在显示 Window 并试图忽略您的请求,STARTUPINFO
也有 dwX
和 dwY
,如果 dwFlags
指定 STARTF_USEPOSITION
,则设置 Window 的位置。 dwXSize
和 dwYSize
.
如果所有其他方法都失败了,您可以尝试并传递位置和大小,这会使过程看起来不可见。干杯。