PlaySound扮演默认windows错误的声音



我正在尝试使用Win32 API库在c++中制作一个简单的音频播放器。

这个程序目前的工作原理是,你通过文件资源管理器选择一个文件,然后文件的位置被保存到一个列表框中。当你按下播放键时按钮时,它从列表框中获取文件位置,并将其解析为一个函数,该函数使用该参数播放所需的文件。

但由于某些原因,而不是播放所需的音频文件。即使找到了文件,它也会播放默认的windows错误声音。

我试着用一个测试声音文件,在项目结构。我知道这个程序可以找到它,但仍然给了我同样的问题。

如果有人能帮我,那就太好了。如果你们需要的话,我很乐意用更多的代码更新这篇文章。

窗口程序(In oshyClient.cpp)

LRESULT CALLBACK WindProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
switch (msg) {
case WM_COMMAND:
switch (wp) {
case MENU_EXIT:
PostQuitMessage(0);
break;
case MENU_ADDAUDIO:
queue.addNewAudioToQueue(hWnd);
break;
case BUTTON_PLAY:
char text[100];
SendMessage(queue.hAudioQueue, LB_GETTEXT, 0, (LPARAM)text);
audio.playAudio(text); // The audio issue is here.
break;
}
break;
case WM_CREATE:
menu.displayMenu(hWnd);
queue.displayAudioQueue(hWnd);
audio.displayAudioControls(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProcW(hWnd, msg, wp, lp);
}
}

oshyClientAudioPlayer.cpp

#include "oshyClientAudioPlayer.h"
#include "oshyClient.h"
#include <iostream>
void AudioPlayer::displayAudioControls(HWND hWnd) {
CreateWindow(L"Button", L"Play", WS_VISIBLE | WS_CHILD, 5, 10, 35, 25, hWnd, (HMENU)BUTTON_PLAY, NULL, NULL);
}
void AudioPlayer::playAudio(const char* audioLocation) {
PlaySound((LPCWSTR)audioLocation, 0, SND_FILENAME);
}

oshyClientAudioQueue.cpp

#include "oshyClientAudioQueue.h"
#include "oshyClient.h"
void AudioQueue::displayAudioQueue(HWND hWnd) {
hAudioQueue = CreateWindowEx(WS_EX_CLIENTEDGE, L"listbox", L"", WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOVSCROLL | 0, 4, 92, 474, 250, hWnd, (HMENU)ID_LISTBOX, 0, 0);
}
void AudioQueue::addNewAudioToQueue(HWND hWnd) {
OPENFILENAMEA file;
char fileName[100];
ZeroMemory(&file, sizeof(OPENFILENAME));
file.lStructSize = sizeof(OPENFILENAME);
file.hwndOwner = hWnd;
file.lpstrFile = fileName;
file.lpstrFile[0] = '';
file.nMaxFile = 100;
file.lpstrFilter = "All Files*.*";
file.nFilterIndex = 1;
if (GetOpenFileNameA(&file)) {
SendMessageA(hAudioQueue, LB_ADDSTRING, 0, (LPARAM)file.lpstrFile);
}
}

调用PlaySound()时,将char*类型转换为wchar_t*。不要那样做。当传入char*字符串时使用PlaySoundA(),例如:

void AudioPlayer::playAudio(const char* audioLocation) {
PlaySoundA(audioLocation, 0, SND_FILENAME);
}

然而,你创建列表框作为一个Unicode窗口,所以您应该使用wchar_t字符串代替char字符串,例如:

case BUTTON_PLAY:
wchar_t text[MAX_PATH];
SendMessageW(queue.hAudioQueue, LB_GETTEXT, 0, (LPARAM)text);
audio.playAudio(text);
break;
void AudioPlayer::playAudio(const wchar_t* audioLocation) {
PlaySoundW(audioLocation, 0, SND_FILENAME);
}
void AudioQueue::addNewAudioToQueue(HWND hWnd) {
wchar_t fileName[MAX_PATH];
fileName[0] = L'';
OPENFILENAMEW file;
ZeroMemory(&file, sizeof(file));
file.lStructSize = sizeof(file);
file.hwndOwner = hWnd;
file.lpstrFile = fileName;
file.nMaxFile = MAX_PATH;
file.lpstrFilter = L"All Files*.*";
file.nFilterIndex = 1;
file.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if (GetOpenFileNameW(&file)) {
SendMessageW(hAudioQueue, LB_ADDSTRING, 0, (LPARAM)fileName);
}
}

最新更新