c# - 连接到应用程序的多个运行实例

标签 c# winforms

我正在尝试创建与打开的应用程序的多个实例的连接(WRQ 反射)。使用此连接到打开的第一个实例很好:

Session appInstance = (Marshal.GetActiveObject("Reflection4.Session.8") as Session);

但我希望能够连接到多个实例。我一直在做大量研究并找到了一些有用的链接,例如 this ,但该解决方案在这种情况下不起作用,因为所有打开的实例都具有相同的 progId。

我还尝试查看窗口句柄,每个实例的句柄明显不同。使用这个:

Process[] processes = Process.GetProcessesByName("r4win");
foreach (Process p in processes)
{
    IntPtr windowHandle = p.MainWindowHandle;
    string handle = windowHandle.ToString();

    MessageBox.Show(handle);
}

但我一直无法弄清楚如何通过窗口句柄创建到窗口的连接。

感谢任何帮助。

附加代码:

void TestROT()
{
    // Look for open instances
    string[] progIds = {"Reflection4.Session.8"};

    List<object> instances = GetRunningInstances(progIds);

    foreach (object refleObjs in instances)
    {
        Session session = refleObjs as Session;
        session.Transmit("12345");
    }
}

对于这种情况,我有 2 个目标应用程序实例在运行。在上面的代码中,它将字符串 12345 发送到应用程序的同一个实例,两次。

我需要它将 12345 发送到第一个实例,然后将 12345 发送到第二个实例。

最佳答案

您可以使用类 NamedPipeClientStreamNamedPipeServerStreamSystem.IO.Pipes -namespace 将数据从您的应用程序发送到另一个应用程序。 在您的第一个应用程序中实现一个 NamedPipeServerStream,如下所示:

NamedPipeServerStream pipeServer = new NamedPipeServerStream("MyApp1");
pipeServer.WaitForConnection();//wait for connection of client

在您的第二个应用程序中放置一个 NamedPipeClientStream 的实例:

NamedPipeClientStream clientStream = new NamedPipeClientStream("MyApp1");
clientStream.Connect();

客户端连接到服务器后,您可以使用方法Write发送数据:

从您的服务器发送数据:

byte[] test = Encoding.UTF8.GetBytes("Hello World");
pipeServer.Write(test, 0, test.Length);

从客户端发送数据:

byte[] test = Encoding.UTF8.GetBytes("Hello World");
clientStream.Write(test, 0, test.Length);

您可以使用Read 来获取接收到的字节。这个方法在两个类中都存在。

您还可以同时使用多个服务器和一个客户端来与更多应用程序进行通信。

关于c# - 连接到应用程序的多个运行实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33563035/

相关文章:

c# - 在双显示器设置的同一台显示器上关闭和打开表格

c# - 在 OSX 上使用 MONO 播放声音的最简单方法

c# - 使用智能感知支持从文件动态生成枚举

c# - RDotNet.dll 中发生类型为 'System.StackOverflowException' 的未处理异常

c# - 为什么我在 listView1 上没有属性项?

c# - 带复选框的 Winform TreeView - 仅更新可见节点

c# - 如何在 WebBrowser 控件中注入(inject) Javascript?

c# - 在 webbrowser 上获取函数 javascript 的返回值

c# - 为 NULL 时通过 P/Invoke 传递双指针参数

c# - 根据条件更改 datagridview 单元格颜色