【问题标题】:How to open an application on active display while using Process.Start()?使用 Process.Start() 时如何在活动显示器上打开应用程序?
【发布时间】:2013-01-24 17:07:42
【问题描述】:

我正在使用

System.Diagnostics.Process.Start(ProcessInfo);

在我的 Windows 窗体应用程序中在记事本中打开 TEXT 文件。

详细代码sn-p是

ProcessStartInfo PSI = new ProcessStartInfo("notepad.exe", LogFile);
PSI.WindowStyle = ProcessWindowStyle.Normal;
System.Diagnostics.Process p = System.Diagnostics.Process.Start(PSI);

但是,它会在默认桌面上打开记事本,而不是在运行主应用程序的扩展桌面上。

现在的问题是,如何在活动桌面(即当前应用程序正在运行的窗口)上打开记事本?

【问题讨论】:

  • 最简单的方法是在 Windows 中更改您的主显示器。否则你将不得不调用一些非常繁重的库。您将不得不使用 FindWindow、SetWindowPos、EnumWIndows。
  • 我认为使用“窗口”一词会使这个问题变得混乱,也许“显示”或“监视器”会是更好的选择?
  • 你不需要FindWindow。如果您创建进程,则返回的 Process 类具有 MainWindowHandle 属性。
  • @Anon 没关系。

标签: c# .net process.start


【解决方案1】:

除了指定初始窗口状态(正常、隐藏等)之外,您基本上无法控制新启动的应用程序如何启动以及它在何处显示。

最好的办法是启动应用程序,然后使用它的窗口句柄告诉它移动。这一切都需要使用 P/Invoke 来调用MoveWindow。所有这些函数的 C# 签名都在 pinvoke.net

这是一个非常simple (VB.NET) example,它显示了基本思想。在这种情况下,正如@Lloyd 指出的那样,您需要的窗口句柄是您从Process.Start 返回的Process.MainWindowHandle。请注意,Process.MainWindowHandle 不会立即填写;您通常需要调用WaitForInputIdle 以确保实际创建了窗口。如果MainWindowHandle 为 0,那么你就会知道它为时过早。

【讨论】:

  • 您可能还需要致电Process.Refresh()
猜你喜欢
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多