Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C启动远程进程的问题#_C#_Process_Wmi_Rpc - Fatal编程技术网

C# 从C启动远程进程的问题#

C# 从C启动远程进程的问题#,c#,process,wmi,rpc,C#,Process,Wmi,Rpc,我正在使用在另一台域计算机上启动远程应用程序 不幸的是,如果远程进程已在运行,但在远程计算机桌面的后台,则应用程序无法使用process.Start获得焦点 问题1:是否有其他API或机制来强制远程应用程序获得焦点,或使用flash来吸引用户的注意力 我注意到的另一个问题是,如果远程进程已经在运行,那么可能会在原始实例的基础上执行一个新实例。这违反了MSDN的文件规定,该文件规定: 如果流程已在运行,则不会启动其他流程资源。而是重用现有流程资源,不会创建新的流程组件。在这种情况下,Start不会

我正在使用在另一台域计算机上启动远程应用程序

不幸的是,如果远程进程已在运行,但在远程计算机桌面的后台,则应用程序无法使用process.Start获得焦点

问题1:是否有其他API或机制来强制远程应用程序获得焦点,或使用flash来吸引用户的注意力

我注意到的另一个问题是,如果远程进程已经在运行,那么可能会在原始实例的基础上执行一个新实例。这违反了MSDN的文件规定,该文件规定:

如果流程已在运行,则不会启动其他流程资源。而是重用现有流程资源,不会创建新的流程组件。在这种情况下,Start不会返回新流程组件,而是向调用过程返回null


问题2:在这种情况下,是否有人找到了阻止应用程序第二个实例启动的方法?WMI是用于远程启动应用程序的更好选择吗?

嗯,我不知道这对您有多好,但它是一个示例类,您可以在helper程序中使用。这仅仅是一个开始,如果你打算使用它,你将需要一个网络系统(不过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);
    }
}
//
///允许您启动指定的程序,或者如果该程序已在运行,则将其置于焦点
/// 
静态类程序
{
静态公共void StartFocus(字符串文件名、字符串进程名)
{
如果(!ProcessStart(ProcessName))
Process.Start(文件名);
其他的
SFProgram.bringwindowtop(“记事本”);
}
[DllImport(“user32.dll”)]
[返回:Marshallas(UnmanagedType.Bool)]
静态外部bool setforegroundindow(IntPtr hWnd);
[DllImport(“user32.dll”)]
静态外部IntPtr FindWindow(字符串lpClassName,字符串lpWindowName);
/// 
///使指定的过程成为焦点
/// 
///进程名称
///如果成功的话
私有静态bool bringwindowtop(字符串windowName)
{
Process[]processs=Process.GetProcessesByName(windowName);
foreach(进程中的进程p)
{
int hWnd=(int)p.MainWindowHandle;
如果(hWnd!=0)
{
返回SetForegroundWindow((IntPtr)hWnd);
}
//p、 关闭主窗口();
}
返回false;
}
私有静态bool ProcessStarted(字符串ProcessName)
{
Process[]processs=Process.GetProcessesByName(ProcessName);
返回(进程长度>0);
}
}

您能否修改您试图调用(或愿意调用)的应用程序的代码?否,很遗憾,这是第三方显微镜控制器/图像记录器。我的设置是一个地质实验室,有2台HP TouchSmart PC。我的应用程序在左侧显示器上运行,当用户单击/触摸显微镜按钮时,它最好在右侧显示器上启动(或向前推进)这个第三方应用程序。哦,我正要建议使用互斥类,以确保一次运行的应用程序不超过1个实例。但是如果你不能修改它,那我就束手无策了。我想你已经考虑在第二台机器上使用一个小的助手应用程序了吗?@ChrisB,事实上我没有。这似乎是一个可行的方法。。。但在那个应用程序中,什么API可以将焦点设置为我想要的目标应用程序?好像我也有同样的问题。谢谢你的代码,我还没有机会尝试。也许明天吧。我很感激。没问题,我更愿意为你指出正确的方向(讨厌只为某人写东西),但这似乎只是帮助程序的一小部分。我的实现很好,谢谢@mazzzz。我增强了进程。开始要求用户凭据。我不需要在目标上运行随机代码。谢谢