我正在尝试使用此功能(它需要),所以我正在编写这样的代码:
[DllImport("winmm.dll")]
private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);
private static void OnEvent(MyEvent ev)
{
string sound = Path.Combine(SoundFolder, ev.SoundName) + ".mp3";
var command = string.Format("open {0} type mpegvideo alias sound", sound);
mciSendString(command, null, 0, IntPtr.Zero);
mciSendString("play all", null, 0, IntPtr.Zero);
new NotificationPage(ev).Show();
}
但它不会播放任何内容,即使是带有硬编码路径的文件也是如此。我做错了什么?
补充:我改写了使用int的方法,如果长的话。 但它仍然无法正常工作。 即使是简单的代码:
public MainWindow()
{
InitializeComponent();
string sound = Path.Combine(SoundFolder, "NormalPriority") + ".mp3";
if (!File.Exists(sound))
throw new FileNotFoundException();
var command = string.Format("open {0} type mpegvideo alias sound", sound);
mciSendString(command, null, 0, IntPtr.Zero);
mciSendString("play all", null, 0, IntPtr.Zero);
}
所以这是一个WPF应用程序
原来它看起来像
private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
{
_notificator = new Notificator(Directory.GetCurrentDirectory());
_notificator.EventStarted += (o, ev) => Dispatcher.Invoke(() => OnEvent(ev));
...
我是在C ++ 2上写的
#include <windows.h>
#include <mmsystem.h>
#pragma comment (lib, "winmm.lib")
#include <string>
int main()
{
int res = mciSendString(L"open D:\\song.mp3 type mpegvideo alias sound", NULL, 0, 0);
printf("%i", res);
return 0;
}
同样的错误277
答案 0 :(得分:2)
p / invoke有一个我能看到的错误。返回值应为int
或uint
,因为MCIERROR
是32位整数。在C#long
中是64位宽。
除此之外,你打电话mciSendString
的方式还不错。实际上,即使使用错误的返回类型声明,您的代码在运行时也能正常播放mp3文件。
那么,为什么它会失败呢?最明显的原因是多媒体功能依赖于消息循环的存在。调用此代码的线程可能不会为消息队列提供服务。你是从控制台应用程序进行调用吗?
如果线程确实有一个消息队列,并正确地泵送它,那么我不确定还有什么建议。下一步是执行一些您目前不执行的错误检查。记下mciSendString
返回的值,看看它们是否表示错误。
您现在发现mciSendString
正在返回错误代码MCIERR_INTERNAL
。对我来说,听起来你的问题是环境问题。您的代码非常适合我,因此您的音频设置/驱动程序出现问题或.mp3文件出现问题。但是我们无法做更多的事情来帮助您处理代码,因为问题不在您的代码中。