C#アプリケーションの出力をリアルタイムでリダイレクトするプロセスを実行するwidowsフォームアプリケーションを試しています。リダイレクトされたC++出力は、次にいくつかのタスクを起動するために使用されます。たとえば、リダイレクトされた出力が "playSong"に等しい場合は、mp3ファイルを再生する必要があります。フォームウィンドウを開いたり閉じたりといった他のタスクをトリガするためにすでに使用しているので、C + +の出力リダイレクトは正常に動作していますが、mp3を再生するだけで動作しません。 (また、私はopenCVをC++プログラムで使用していますが、問題がある場合は問題ありません)しかし、私は別のプロジェクトでmp3を再生しようとしましたが、mp3はうまく動作しません。誰もがこれで私を助けることができればそれは素晴らしいだろう。C#Windowsフォームのバックグラウンドでプロセスを実行中にmp3を再生する方法
using System.Diagnostics;
using System.Runtime.InteropServices;
public partial class frmPlayList : Form
{
[DllImport("winmm.dll")]
private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);
public bool flag = true;
static string varr2;
public frmPlayList()
{
InitializeComponent();
}
private void frmPlayList_Load(object sender, EventArgs e)
{
Program.getProcess().OutputDataReceived += processOutputDataReceived2;
}
public void processOutputDataReceived(object sender, DataReceivedEventArgs e)
{
Console.WriteLine(e.Data);
varr2 = e.Data;
if (varr2 == "playSong" && flag)
{
playSong();
flag = false;
}
}
public delegate void UpdateControlsDelegate();
public void playSong() //Playing song
{
InvokeUpdateControlsForPlaySong();
}
public void InvokeUpdateControlsForPlaySong()
{
if (this.InvokeRequired)
{
this.BeginInvoke(new UpdateControlsDelegate(UpdateControlsForPlaySong));
}
else
{
UpdateControlsForPlaySong();
}
}
private void UpdateControlsForPlaySong()
{
string f = @"path\a.mp3";
mciSendString("open \"" + f + "\" type mpegvideo alias MediaFile", null, 0, IntPtr.Zero);
mciSendString("play MediaFile", null, 0, IntPtr.Zero);
Console.WriteLine("Song ended!");
}
}
私はあなたの質問に答えることはできませんが、私はあなたの場所で別の方法を使ってmp3ファイルを再生しようとします。たぶん、winmmとmciSendStringはC++とC#の接続を妨害しているかもしれません。また、2つのプロセスを並行して実行するのではなく、C#プログラムでC++コードを使用することを検討しましたか? –
NAudioライブラリーを試してみてください。これはオーディオファイルで動作するように意図されており、使いやすいです – Anton