从其他应用程序控制WPF应用程序

时间:2013-04-09 10:45:26

标签: c# wpf

我有一个WPF应用程序,我想从另一个应用程序控制它。我希望有一些基本功能,例如,将焦点设置在特定控件上,获取控件文本并将文本/键发送到控件。

这可能吗?

2 个答案:

答案 0 :(得分:5)

是的,这是可能的,并且有多种方法可以做到这一点。如果它们都在同一网络上,您可以在它们之间建立TCP连接,则需要TCPlistener和TCP客户端。

但是,我建议您看一下WCF。使用WCF,您将能够执行您需要的操作(可能还有更多!),但需要大量阅读才能熟悉WCF库。

您可以从查看以下内容开始:

  1. Efficient communication between two .Net applications

  2. Communication between two winform application using WCF?

  3. Communication between two WPF applications

  4. 对于WCF方面,你需要做的是:

    一个。使用与引用相同的URI在每个应用程序(在其构造函数中)中打开ServiceHost。这将打开NetNamedPipeBinding,您可以在这两个应用程序之间进行通信。

    示例:

    public static ServiceHost OpenServiceHost<T, U>(T instance, string address) 
    {
        ServiceHost host = new ServiceHost(instance, new Uri[] { new Uri(address) });
        ServiceBehaviorAttribute behaviour = host.Description.Behaviors.Find<ServiceBehaviorAttribute>();
        behaviour.InstanceContextMode = InstanceContextMode.Single;
        host.AddServiceEndpoint(typeof(U), new NetNamedPipeBinding(), serviceEnd);
        host.Open();
        return host;
    }
    

    B中。在相关频道上创建一个监听器。这可以在两个应用程序中完成,以允许双向通信。

    示例:

    /// <summary>
    /// Method to create a listner on the subscribed channel.
    /// </summary>
    /// <typeparam name="T">The type of data to be passed.</typeparam>
    /// <param name="address">The base address to use for the WCF connection. 
    /// An example being 'net.pipe://localhost' which will be appended by a service 
    /// end keyword 'net.pipe://localhost/ServiceEnd'.</param>
    public static T AddListnerToServiceHost<T>(string address)
    {
        ChannelFactory<T> pipeFactory = 
            new ChannelFactory<T>(new NetNamedPipeBinding(), 
                                         new EndpointAddress(String.Format("{0}/{1}",
                                                                                      address, 
                                                                                      serviceEnd)));
        T pipeProxy = pipeFactory.CreateChannel();
        return pipeProxy;
    }
    

    ℃。创建和接口,在两个应用程序中使用并在相应的类中继承。一些IMyInterface

    您可以设置一个可以在两个应用程序中使用的库,以允许一致的代码库。这样的库将包含上述两种方法[和更多],并将用于两个应用程序,如:

    // Setup the WCF pipeline.
    public static IMyInterface pipeProxy { get; protected set;}
    ServiceHost host = UserCostServiceLibrary.Wcf
        .OpenServiceHost<UserCostTsqlPipe, IMyInterface>(
            myClassInheritingFromIMyInterface, "net.pipe://localhost/YourAppName");
    pipeProxy = UserCostServiceLibrary.Wcf.AddListnerToServiceHost<IMyInterface>("net.pipe://localhost/YourOtherAppName");
    

    pipeProxy是某些继承自IMyInterface的类。这允许两个应用程序知道传递的内容(如果有的话 - 在您的情况下它将是一个空白,只是一个'提示'让应用程序知道通过接口预先指定的东西)。请注意,我显示如何对每个应用程序进行调用,您可以自己解决这个问题......

    上面有一些空白,你必须填写,但使用我提供的一切应该可以帮助你做你需要的。

    我希望这会有所帮助。

答案 1 :(得分:0)

UIAutomation就是答案。这是一篇关于CodeProject的有趣文章。

http://www.codeproject.com/Articles/289028/White-An-UI-Automation-tool-for-windows-applicatio