【问题标题】:C# Start Application-Process without stealing focusC# 启动应用程序进程而不窃取焦点
【发布时间】:2015-10-29 10:11:53
【问题描述】:

我开始学习 C#,现在我想知道是否有一种方法可以在不窃取焦点的情况下启动第三方应用程序,或者始终在后台显示此应用程序/进程的窗口。

更具体地说:我编写了一个应用程序,它可以使用登录数据等参数启动 Steam 客户端。据我所知,Steam-Client 是用 Java 编写的,这可能是我的问题之一。我也知道你可以像这样在“静音模式”下启动 Steam 客户端:

"C:\Programs\Steam\Steam.exe" -silent -login user password

但如果我不想让 Steam 客户端窃取焦点,这将无济于事。前台出现了两个窗口:Login-WindowLoading-Window

我在 stackoverflow 和谷歌上搜索了解决方案,但没有一个对我有用。一种可能的解决方案是,但对我不起作用:

Process startsteam = new Process();
startsteam.StartInfo.FileName = cursteampath;
startsteam.StartInfo.Arguments = "-silent -login " + user + " " + password;
startsteam.StartInfo.CreateNoWindow = true;
startsteam.StartInfo.ErrorDialog = false;
startsteam.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
startsteam.Start();

就像我之前写的那样,这不会隐藏 Login-Window(Form) 和 Loading-Window。我还注意到 Steam 正在启动像 steamwebhelper.exe 这样的子进程。

我的问题是:在 C# 中有什么方法可以启动第三方应用程序的进程并防止它及其子进程窃取焦点或只是强制所有窗口显示在背景?

编辑:这个解决方案也不适合我stackoverflow user32.dll

【问题讨论】:

    标签: c# windows process focus steam


    【解决方案1】:

    我认为,您在这里看到的是军备竞赛的结果。 Windows 开发人员添加了一种在后台启动应用程序的方法:将不显示/隐藏标志传递给进程启动结构。

    然后,开发人员决定忽略该标志,并在前台显示。那些开发者是坏人。

    微软没有升级军备竞赛并引入“不要显示窗口,我真的是说它的标志”让应用程序尝试解决,而是明智地停在了那里。

    因此,如果一个应用程序是由坏人编写的,那么你真的没有什么可以简单地强迫它。没有注入钩子 dll 和其他此类侵入性技术来试图强迫他们遵守血腥的合同。

    【讨论】:

    • 这不能回答我的问题,但我同意你的看法。我现在搜索了几个小时以获得解决方案。我最终创建了一个虚拟桌面(Win 10)并尝试仅在该桌面上启动客户端。但是,程序从鼠标(?)的焦点开始,这样我就不能强制显示由我的 C#-App 启动的客户端留在虚拟桌面上。还有一个 C# VD-Wrapper 的包装器,但它不能移动其他进程的窗口。我迷路了。 :(
    猜你喜欢
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    相关资源
    最近更新 更多