5

我已经在我的计算机上制作了 MP3 文件以与我的媒体播放器关联。所以当我在资源管理器中双击一个 MP3 文件时,显然媒体播放器会启动并播放它。

我的问题 我可以防止弹出多个实例,但是如何将新实例的文件路径传输到我已经使用的实例

我想要发生的事情: 我双击一首歌曲,......我正在听它我双击另一首歌曲,当前歌曲应该停止并且新歌曲应该开始播放,而不会弹出应用程序的新实例。

我使用 Mutex 检查是否已经有一个正在运行的实例。要获取文件路径,我使用 Environment.GetCommandLineArgs()

我需要的只是将文件的路径传递给当前实例。我怎样才能做到这一点??

4

3 回答 3

3

本质上,您必须将其构建到您的应用程序中。

当用户单击第二首歌曲时,您必须有某种方法让当前实例终止应用程序的前一个实例或向其发送消息。

这些对我来说似乎有点脏。

我认为一种干净的方法是编写一个app_booter.exe与您的媒体文件相关联的小文件。单击媒体文件时,它会启动此 _app_booter_ 其中:

  1. 查找应用程序的运行实例。
  2. 向它发送数据以停止当前歌曲并播放这首新歌曲。
  3. 如果应用程序没有运行,它只是在命令行上使用歌曲启动它。

要从这个其他 exe 发送您的应用程序数据,您可以查看 IPC: Interprocess communication for Windows in C# (.NET 2.0)

我认为WM_COPYDATA上述帖子中提到的方法或 tcp 套接字就足够了,因为您的数据非常简单,只是一个文件路径,也许是一个命令。

我认为保留两个单独的 exe 比构建应用程序以与其先前的实例对话更容易和更清洁。

于 2012-11-13T13:25:35.740 回答
2

我想你正在寻找这个http://wpfinstanceawareapp.codeplex.com/

为可以将命令行参数传递给第一个实例的单实例应用程序提供功能。

于 2012-11-13T13:23:04.783 回答
0

在你Main检查你的互斥体之后,从参数中获取歌曲并触发一个Play(FileInfo filename)事件来播放歌曲。你的表单应该处理这个事件(或者更好的控制器类)

于 2012-11-13T13:23:37.510 回答