从C#启动远程进程的问题
本文关键字:进程 问题 启动 程进程 | 更新日期: 2023-09-27 18:00:33
我使用的是System。诊断。过程开始在另一台域计算机上启动远程应用程序。
不幸的是,如果远程进程已经在运行,但在远程计算机桌面的后台,则应用程序无法使用进程获得焦点。开始
问题1:是否存在其他API或机制来强制远程应用程序获得焦点或闪光以引起用户的注意?
我注意到的另一个问题是,如果远程进程已经在运行,则可能会在原来的实例之外执行新的实例。这违反了MSDN的文档规定:
如果进程已经在运行,则不会启动额外的进程资源。相反,现有的进程资源将被重用,也不会创建新的进程组件。在这种情况下,Start不会返回新的进程部件,而是向调用过程返回null。
问题2:在这种情况下,有人找到阻止应用程序的第二个实例启动的方法吗?WMI是远程启动应用程序的更好选择吗?
好吧,不知道这对你有多好,但它是一个可以在助手程序中使用的示例类。这只是一个开始,如果你打算使用它,你将需要一个网络系统(不过C#也不错)。告诉我它是如何为你工作的。
/// <summary>
/// Allows you to start a specified program, or if it is already running, bring it into focus
/// </summary>
static class SFProgram
{
static public void StartFocus(string FileName, string ProcessName)
{
if (!ProcessStarted(ProcessName))
Process.Start(FileName);
else
SFProgram.BringWindowToTop("notepad");
}
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
/// <summary>
/// Bring specified process to focus
/// </summary>
/// <param name="windowName">Process Name</param>
/// <returns>If it was successful</returns>
private static bool BringWindowToTop(string windowName)
{
Process[] processes = Process.GetProcessesByName(windowName);
foreach (Process p in processes)
{
int hWnd = (int)p.MainWindowHandle;
if (hWnd != 0)
{
return SetForegroundWindow((IntPtr)hWnd);
}
//p.CloseMainWindow();
}
return false;
}
private static bool ProcessStarted(string ProcessName)
{
Process[] processes = Process.GetProcessesByName(ProcessName);
return (processes.Length > 0);
}
}