別のアプリケーションから制御したい WPF アプリケーションがあります。特定のコントロールにフォーカスを設定する、コントロールのテキストを取得する、テキスト/キーをコントロールに送信するなどの基本的な機能が必要です。
これは可能ですか?
はい、これは可能であり、そのために利用できるさまざまな方法があります。それらが両方とも同じネットワーク上にある場合、それらの間で TCP 接続を確立できます。両方に TCPlistener と TCP クライアントが必要です。
ただし、ご覧になることをお勧めしますWCF。WCF を使用すると、必要なこと (そしておそらくそれ以上のこと) を行うことができますが、WCF ライブラリーに十分慣れるためには、多くの資料を読む必要があります。
以下を参照することから始めることができます。
WCF 側で行う必要があることの概要は次のとおりです。
A.ServiceHost
同じ URI を参照として使用して、各アプリケーション (コンストラクター内) で a を開きます。NetNamedPipeBinding
これにより、2 つのアプリケーション間で通信できるが開きます。
例:
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;
}
C. 両方のアプリケーションで使用され、適切なクラスで継承されるインターフェイスを作成および作成します。いくつかIMyInterface
。
2 つのアプリケーションで使用できるライブラリをセットアップして、一貫したコード ベースを可能にすることができます。このようなライブラリには、上記の [およびその他の] 2 つのメソッドが含まれ、次のような 2 つのアプリケーションで使用されます。
// 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
。これにより、両方のアプリケーションが渡されたものを知ることができます(どちらかといえば、あなたの場合は無効になり、インターフェースを介して事前に指定された何かを行うようにアプリケーションに知らせるための「プロンプト」にすぎません)。各アプリケーションへの呼び出しがどのように行われるかは示していないことに注意してください。これは自分で解決できます...
上記には記入しなければならない空白がいくつかありますが、私が提供したすべてを使用すると、必要なことを容易に行うことができます。
これが役立つことを願っています。