2013-04-09 2 views
2

У меня есть приложение WPF, которое я хочу контролировать из другого приложения. Я хочу иметь некоторые базовые функции, такие как настройка фокуса на конкретный элемент управления, получение текста элемента управления и отправка текста/клавиш в элемент управления.Управление приложением WPF из другого приложения

Возможно ли это?

+1

_Is это возможно? _ Вы пробовали что-нибудь? –

+1

Да, это возможно. –

+0

Попробуйте что-нибудь от себя, а затем спросите в SO. – Luv

ответ

4

Да, это возможно, и существуют различные методы, чтобы сделать это. Если они находятся в одной и той же сети, вы можете установить 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

Для стороны WCF вещей, вне линии того, что вы необходимо:

A. Откройте ServiceHost в каждом из приложений (в своих конструкторах), используя те же URI, что и ссылка. Это откроет 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; 
} 

В. Создание слушателя на соответствующем канале. Это можно сделать в и приложениях, чтобы обеспечить двухстороннюю связь.

Пример:

/// <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. Это позволяет обоим приложениям знать, что передается (если что угодно - в вашем случае это будет пустота, просто «подсказка», позволяющая приложениям знать что-то заранее заданное через интерфейс). Обратите внимание, что у меня есть не показать, как вызовы выполняются для каждого приложения, и вы можете это решить самостоятельно ...

В приведенном выше виде есть некоторые пробелы, которые вам нужно заполнить, но используя все, что я предоставил, должно облегчить вам выполнение необходимых действий.

Надеюсь, это поможет.

Смежные вопросы