【问题标题】:Using String Variables for the function PlaySound为函数 PlaySound 使用字符串变量
【发布时间】:2020-10-26 22:22:30
【问题描述】:

我正在尝试创建一个程序,当您按下不同的键时播放不同的声音。我打算拿 char key ,添加字符串“.wav”并将名为“sound”的新字符串输入到行中:

PlaySound(TEXT(sound), NULL, SND_FILENAME | SND_ASYNC);

代码无法编译并给出错误“标识符'Lsound'未定义” 我试过用“string”替换“TEXT”,但它给出了错误消息“没有合适的从'std :: string'到'LPCWSRT'的转换函数存在”。

任何有关解决方案的帮助将不胜感激。

#include <iostream>
#include <Windows.h>

using namespace std;

int main() {

    char i;

    while (true) {
        for (i = 8; i <= 255; i++) {
            if (GetAsyncKeyState(i) == -32767) {
                string sound = i + ".wav";
                PlaySound(TEXT(sound), NULL, SND_FILENAME | SND_ASYNC);
            }   
        }
    }
    return 0;
}

【问题讨论】:

  • 为什么失败:TEXT 宏将字符串文字转换为宽字符,如果启用了 unicode,则通过在宏的参数前添加 LTEXT("string")` 被预处理为 @ 987654326@。宏是完全愚蠢的,所以它不在乎你在这里没有使用字符串文字;它会在变量名的前面无意识地添加一个L
  • TEXT 是为了解决 1990 年代后期的一个问题而实现的,因为微软从简​​单但有限的 ANSI 字符世界切换到 Unicode 字符,并拥有同时支持这两者的工具和操作系统。自从 Windows XP 在 2000 年代初期杀死了它的所有前辈以来,这并不是一个真正的问题。现在是2020年。你可以用这种方式和那种方式来乱七八糟地转换字符串,但简单地从 Unicode 开始并保持在 Unicode 通常要容易得多。

标签: c++ variables playsound


【解决方案1】:

您必须将字符串转换为 LPCTSTR

使用How to convert std::string to LPCWSTR in C++ (Unicode)

#include <iostream>
#include <Windows.h>

using namespace std;

std::wstring s2ws(const std::string& s)
{
    int len;
    int slength = (int)s.length() + 1;
    len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0);
    wchar_t* buf = new wchar_t[len];
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
    std::wstring r(buf);
    delete[] buf;
    return r;
}


int main() {
    while (true) {
        for (int i = 8; i <= 255; i++) {
            if (GetAsyncKeyState(i) == -32767) {
                string sound = i + ".wav";
                PlaySound(s2ws(sound).c_str(), NULL, SND_FILENAME | SND_ASYNC);
            }
        }
    }
    return 0;
}

【讨论】:

    【解决方案2】:

    只需从一开始就传递一个宽字符串。

    std::wstring sound = i + L".wav";
    PlaySound(sound.c_str(), NULL, ... 
    

    在 Windows 中,原生字符串是 UTF-16,由 wchar_t 和 STL 中 w 的变体(wstring 等)表示。

    【讨论】:

      【解决方案3】:

      解决方案取决于您的“字符集”属性(项目属性/高级/字符集)设置为什么。

      如果是“使用多字节字符集”:

      string sound = to_string(i) + ".wav";
      PlaySound(sound.c_str(), NULL, SND_FILENAME | SND_ASYNC);
      

      如果是“使用 Unicode 字符集”:

      wstring sound = to_wstring(i) + L".wav";
      PlaySound(sound.c_str(), NULL, SND_FILENAME | SND_ASYNC);
      

      另外,不要忘记在#include &lt;string&gt; 中包含string 头文件。

      【讨论】:

      • 如果我没记错的话,to_string(i) 会将i 转换为int,然后吐出一个数字,而不是代表密钥的预期字母。
      • 你说得对,我误解了这个问题。在这种情况下,还有两件事需要解决。首先,该范围内有不可打印的字符。其次,string sound = i + ".wav";是指针算法,所以也得处理。
      猜你喜欢
      • 2020-06-15
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 2023-03-24
      相关资源
      最近更新 更多