HCL*_*HCL 3 .net c# wpf winapi ipc
我有一个单实例应用程序(c#,WPF,.net3.51).检查应用程序是否已实例化是通过互斥锁完成的.如果应用程序已在运行,我将从已打开的应用程序实例中打开一个新窗口.这到目前为止工作正常.
但是由于应用程序扩展,我现在必须将e.Args(或至少它的第一个字符串)发送到驻留在另一个进程中的已经运行的实例.这怎么做得最好?
其他信息
目前我使用全球注册的Window消息,我通过PostMessage(HWND_BROADCAST)发送给所有打开的应用程序.如果收到此消息,我的应用程序将查找此消息并打开一个新窗口.一个想法是设置PostMessage的参数.但是我发现了很多关于这个话题的令人眼花缭乱的信息,因此我没有勇气走这条路.除此之外,我想通过另一个激活逻辑替换全局PostMessage调用,因为全局调用似乎有一些不可爱的副作用.
Chr*_*ich 10
您可以使用命名管道,它们已添加到.NET 3.5中的BCL中.
在已经运行的实例中创建命名管道服务器(参数接收器),并在重复的应用程序中创建命名管道客户端(参数发送者).然后,将参数从客户端发送到服务器.
如果需要,可以使用C/C++创建命名管道的任何一端.请参阅Win32 CreateNamedPipe功能.
下面是一个简单的例子,客户端和服务器都运行在一个程序中(下面的"FD1AF2B4 ..."GUID只是一个唯一的标识符,以避免与系统上现有的命名管道发生冲突).
class Program
{
static void Main(string[] args)
{
Thread writerThread = new Thread(new ThreadStart(WriterThread));
writerThread.Start();
Thread readerThread = new Thread(new ThreadStart(ReaderThread));
readerThread.Start();
}
static void ReaderThread()
{
NamedPipeServerStream server = new NamedPipeServerStream("FD1AF2B4-575A-46E0-8DF5-8AB368CF6645");
server.WaitForConnection();
using (var reader = new BinaryReader(server))
{
string arguments = reader.ReadString();
Console.WriteLine("Received: {0}", arguments);
}
}
static void WriterThread()
{
NamedPipeClientStream client = new NamedPipeClientStream("FD1AF2B4-575A-46E0-8DF5-8AB368CF6645");
client.Connect(Timeout.Infinite);
using (var writer = new BinaryWriter(client))
{
writer.Write("/foo /bar:33 /baz:quux");
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1428 次 |
| 最近记录: |