停止进程显示 C# 窗口
我正在尝试自动化一个应用程序,该应用程序在启动时创建一个没有用户交互的 GUI 窗口,但我不知道如何隐藏实际的窗口。
我尝试使用 ProcessStartInfo :
Process.Start(new ProcessStartInfo {
UseShellExecute = false,
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden,
// other properties here
});
但窗口仍然显示。
我还尝试过旋转等待窗口存在,然后隐藏它:
while (process.MainWindowHandle == IntPtr.Zero) {}
ShowWindowAsync(process.MainWindowHandle, SW_HIDE);
不幸的是,这使窗口闪烁大约 1/16 秒左右,如果可能的话,我想避免它。
我目前的想法是创建一个 hook ,但我不确定要抓住什么钩子,也不确定它是否会起作用。
有什么建议吗?
I'm trying to automate an application that creates a GUI window on startup that has no user interaction, but I can't figure out how to hide the actual window.
I've tried using ProcessStartInfo thus:
Process.Start(new ProcessStartInfo {
UseShellExecute = false,
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden,
// other properties here
});
But the window still shows up.
I've also tried spin-waiting for the window to exist, and then hiding it:
while (process.MainWindowHandle == IntPtr.Zero) {}
ShowWindowAsync(process.MainWindowHandle, SW_HIDE);
This, unfortunately, makes the window flash for about 1/16th of a second or so, and I'd like to avoid it if at all possible.
My current thoughts are along the line of creating a hook, but am unsure of what hooks to grab, nor if it will even work.
Any tips?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
所需的进程窗口样式(实际上映射到
SW_
常量之一)被传递到其他应用程序的WinMain
函数,但这并不意味着粗鲁的应用程序不会只是忽略您发送的任何值。您可以通过使用
User32.CreateDesktop
创建另一个虚拟桌面,然后使用Kernel32.CreateProcess
来实现这一点,确保将正确的桌面名称作为的一部分传递STARTINFO
结构。The desired process window style (actually mapped to one of the
SW_
constants) is passed to the other application'sWinMain
function, but that doesn't mean a rude application won't just ignore whatever value you send.You can pull it off by creating another virtual desktop using
User32.CreateDesktop
, then useKernel32.CreateProcess
, making sure to pass the correct desktop name as part of theSTARTINFO
structure.CreateNoWindow 选项仅适用于控制台模式应用程序,您无法阻止 GUI 应用程序创建其主窗口。最好的选择是 WindowStyle 属性,将其设置为隐藏或最小化。一个行为良好的 GUI 应用程序在调用 ShowWindow() 时使用它。但它覆盖或忽略这个值当然并不罕见。在你的情况下,赔率并不好,最小化是你剩下的尝试。
The CreateNoWindow option only applies to console mode applications, you cannot prevent a GUI app from creating its main window. Your best bet is the WindowStyle property, set it to Hidden or Minimized. A well behaved GUI app uses it in its call to ShowWindow(). But it certainly not unusual for it to override or ignore this value. Odds are not good in your case, Minimized is all you got left to try.
尝试选项 1
UseShellExecute = true,并且 WindowStyle = ProcessWindowStyle.Hidden
或者不设置 UseShellExecute (默认为 true)
Try option 1 with
UseShellExecute =true, and WindowStyle = ProcessWindowStyle.Hidden
or do not set UseShellExecute (it defaults to true)
为什么不直接设置 WinForm 项目的 Startup Object 属性呢?
您可以在不显示表单或实际窗口的情况下启动该过程。
希望这有帮助,谢谢。
Why don't you just set the Startup Object property of your WinForm project?
You can start the process without showing the Form or the actual window.
Hope this help, thanks.
您能否在整个窗体区域的桌面内容中覆盖窗体 Paint 和 blit,以度过第 16 秒?
我是低级别胜利形式的相对新手,但我最近只是在 OnPaint 上玩得开心,所以我想到了这一点。
Could you override the form Paint and blit in the contents of the desktop for the entire form region in order to get over the 16th second?
I'm a relative newbie to low level win forms stuff, but i was just having fun with OnPaint recently so I thought of this.