什么是 mciSendString?
mciSendString 是 Windows API (Application Programming Interface) 中的一个函数,它属于多媒体控制接口,MCI 是一个高级的、与设备无关的接口,它允许你用简单的文本命令来控制各种多媒体设备,而无需关心底层硬件的复杂细节。

你可以把它想象成一个“多媒体指挥官”,你用标准的“语言”(字符串命令)告诉它做什么,它就去指挥相应的“士兵”(声卡、光驱等)执行任务。
核心特点:
- 简单易用:命令是文本字符串,直观易懂。
- 功能强大:支持播放、暂停、停止、 seek(定位)、录音、打开/关闭 CD 等多种操作。
- 设备无关:同样的命令可以用于不同的设备(
play命令可以播放 WAV 文件,也可以播放 MP3 文件,只要系统支持)。
函数原型
要使用 mciSendString,你需要包含 windows.h 和 mmsystem.h 头文件。
#include <windows.h> #include <mmsystem.h> // 通常在项目中需要链接 winmm.lib 库 #pragma comment(lib, "winmm.lib")
函数原型如下:

MCIERROR mciSendString( LPCTSTR lpszCommand, // 指向要发送的命令字符串的指针 LPTSTR lpszReturnString, // 指向用于接收返回信息的缓冲区 UINT cchReturn, // lpszReturnString 缓冲区的大小 HWND hwndCallback // 回调窗口的句柄,通常设为 NULL );
参数详解:
-
lpszCommand(输入)- 一个以 null 结尾的字符串,包含了你想要发送给 MCI 的命令。
"open my_music.mp3 alias mymp3"或"play mymp3"。
-
lpszReturnString(输出)- 一个指向字符缓冲区的指针,用于接收 MCI 命令执行后的返回信息。
- 对于
status命令,它会返回状态信息。 - 如果你不需要返回信息,可以将其设为
NULL。
-
cchReturn(输入)
(图片来源网络,侵删)lpszReturnString缓冲区的字符大小(包括结尾的 null 字符)。lpszReturnString是NULL,此参数应设为 0。
-
hwndCallback(输入)- 用于处理 MCI 通知消息的窗口句柄。
- 对于简单的同步操作(命令执行完毕后才返回),通常将其设为
NULL。
返回值:
- 如果函数执行成功,返回值为 0。
- 如果执行失败,返回一个非零的错误码,你可以使用
mciGetErrorString函数将这个错误码转换成可读的错误字符串。
基本使用流程
使用 mciSendString 控制一个多媒体文件,通常遵循以下三步流程:
第一步:打开设备/文件
使用 open 命令,为了后续方便操作,通常会为设备或文件指定一个“别名”(alias)。
// 格式: "open [文件路径] alias [别名]"
// 示例: 打开一个 MP3 文件,并给它起个别名 "my_audio"
mciSendString("open my_song.mp3 alias myaudio", NULL, 0, NULL);
第二步:发送控制命令
使用上一步定义的别名来发送各种控制命令。
// 播放
mciSendString("play myaudio", NULL, 0, NULL);
// 从第 10 秒开始播放
mciSendString("play myaudio from 10", NULL, 0, NULL);
// 暂停
mciSendString("pause myaudio", NULL, 0, NULL);
// 停止
mciSendString("stop myaudio", NULL, 0, NULL);
// 获取当前播放位置(单位为毫秒)
char returnString[32];
mciSendString("status myaudio position", returnString, sizeof(returnString), NULL);
// returnString 中现在包含了当前播放位置的数字字符串
第三步:关闭设备/文件
使用 close 命释释放资源。
// 格式: "close [别名]"
mciSendString("close myaudio", NULL, 0, NULL);
完整示例代码
下面是一个完整的 C 语言示例,它会播放一个名为 test.mp3 的文件(确保这个文件和你的 .c 文件在同一个目录下),然后暂停 3 秒,再继续播放,最后停止并关闭。
#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
// 为了方便使用 mciSendString,我们最好封装一个检查错误的函数
void CheckMCIError(MCIERROR error) {
if (error != 0) {
char errorMessage[256];
mciGetErrorString(error, errorMessage, sizeof(errorMessage));
printf("MCI Error: %s\n", errorMessage);
}
}
int main() {
MCIERROR error;
// --- 1. 打开文件 ---
printf("Opening file 'test.mp3'...\n");
error = mciSendString("open test.mp3 alias mymp3", NULL, 0, NULL);
CheckMCIError(error);
if (error != 0) {
printf("Failed to open file. Please make sure 'test.mp3' exists.\n");
return 1;
}
// --- 2. 播放文件 ---
printf("Playing...\n");
error = mciSendString("play mymp3", NULL, 0, NULL);
CheckMCIError(error);
// 等待 3 秒
Sleep(3000);
// --- 3. 暂停文件 ---
printf("Pausing...\n");
error = mciSendString("pause mymp3", NULL, 0, NULL);
CheckMCIError(error);
// 再等待 3 秒
Sleep(3000);
// --- 4. 继续播放 ---
printf("Resuming...\n");
error = mciSendString("resume mymp3", NULL, 0, NULL);
CheckMCIError(error);
// 等待一段时间让音乐播放一会儿
Sleep(5000);
// --- 5. 停止并关闭文件 ---
printf("Stopping and closing...\n");
error = mciSendString("stop mymp3", NULL, 0, NULL);
CheckMCIError(error);
error = mciSendString("close mymp3", NULL, 0, NULL);
CheckMCIError(error);
printf("Program finished.\n");
return 0;
}
如何编译和运行:
-
将代码保存为
mcitest.c。 -
将一个
test.mp3文件放在同一目录下。 -
使用 Visual Studio 的开发者命令提示符 或 MinGW 进行编译。关键是要链接
winmm.lib库。- 使用 MinGW (g++):
gcc mcitest.c -o mcitest.exe -lwinmm
- 使用 Visual Studio 命令行:
cl mcitest.c /link winmm.lib
- 使用 MinGW (g++):
-
运行生成的
mcitest.exe文件,你应该会看到控制台输出,并且能听到声音。
常用命令参考
| 命令 | 示例 | 说明 |
|---|---|---|
| open | open "my song.mp3" alias mysong |
打开一个文件并为其指定别名,路径中含空格需用引号。 |
| close | close mysong |
关闭并释放指定的设备或文件。 |
| play | play mysong |
播放。 |
play mysong from 5000 |
从第 5000 毫秒(5秒)处开始播放。 | |
play mysong repeat |
循环播放。 | |
| pause | pause mysong |
暂停播放,再次播放会从暂停处继续。 |
| resume | resume mysong |
从暂停处恢复播放。 |
| stop | stop mysong |
停止播放,再次播放会从头开始。 |
| seek | seek mysong to 10000 |
定位到第 10000 毫秒(10秒)处。 |
| status | status mysong length |
获取文件总长度(毫秒)。 |
status mysong position |
获取当前播放位置(毫秒)。 | |
status mysong mode |
获取当前模式(stopped, playing, paused 等)。 | |
| setaudio | setaudio mysong volume to 500 |
设置音量(0-1000)。 |
setaudio mysong on |
打开音频。 | |
setaudio mysong off |
关闭音频(静音)。 | |
| info | info mysong title |
获取媒体文件的标题信息。 |
注意事项和局限性
- Windows 平台专属:此函数是 Windows API 的一部分,不能在 macOS 或 Linux 上使用。
- 依赖编解码器:
mciSendString的能力取决于系统中安装的编解码器,它能原生播放 WAV、MIDI、CD 音轨等,对于 MP3、MP4 等格式,用户系统必须安装相应的解码器(通常安装了 Windows Media Player 或 K-Lite Codec Pack 就没问题)。 - 同步与异步:
mciSendString默认是同步的,这意味着发送命令后,程序会等待命令执行完毕(play命令会立即返回,但播放过程在后台进行;close命令会等待文件完全关闭后才返回),如果需要异步操作(播放完成时自动触发一个事件),需要设置hwndCallback参数。 - 性能:对于需要精确、快速、频繁控制多媒体的应用(如游戏),
mciSendString可能不是最佳选择,因为它的文本解析会带来微小开销,在这种情况下,可以考虑使用更底层的 MCI 命令接口(mciSendCommand)或 DirectShow。
mciSendString 是一个入门简单、功能强大的 Windows 多媒体控制工具,非常适合快速开发一些简单的音频播放器或需要嵌入音频功能的应用程序。
