C# exe의 출력을 실시간으로 C# 응용 프로그램으로 리디렉션하는 프로세스를 실행하는 widows 양식 응용 프로그램을 사용하고 있습니다. 리디렉션 된 C++ 출력은 여러 작업을 트리거하는 데 사용됩니다. 예를 들어 : 리디렉션 된 출력이 "playSong"과 같으면 mp3 파일을 재생해야합니다. C++ 출력 리디렉션은 양식 창을 열고 닫는 것과 같은 다른 작업을 트리거하는 데 이미 사용했지만 mp3를 재생할 때만 작동하며 그 이후의 코드도 제대로 작동하는 것처럼 잘 작동합니다. (또한 문제가 중요하다면 C++ 프로그램에서 openCV를 사용합니다.) 그러나 어떤 프로세스를 사용하지 않고 다른 프로젝트에서 mp3를 재생하려고 시도했지만 mp3가 정상적으로 재생됩니다. 아무도 이걸 가지고 나를 도울 수 있다면 좋을 것입니다.C# Windows Form의 백그라운드에서 프로세스를 실행하는 동안 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# 연결을 방해하고 있습니다. 또한 두 개의 프로세스를 병렬로 실행하는 대신 C# 프로그램에서 C++ 코드를 사용하는 것을 고려 했습니까? –
NAudio 라이브러리를 사용해보십시오.이 파일은 오디오 파일과 함께 사용하기 쉽고 – Anton