【问题标题】:Cast (const) char * to LPCWSTR [duplicate]将(const)char *转换为LPCWSTR [重复]
【发布时间】:2013-07-24 01:40:02
【问题描述】:

我正在尝试使用 WinAPI 中的FindWindow(),我想向用户询问窗口标题的输入:

char *input;
cout << "Window title: ";
cin >> input;

相当标准。 那么,如何将其转换为LPCWSTR 以获取FindWindow()

我已经尝试过以下方法:_T(input)TEXT(input)(LPCWSTR)input,但它们都没有奏效。 我也尝试过使用wchar_t 而不是char,但我在其他任何地方都需要char,所以使用wchar_t 而不是char 会出现几十个错误...

【问题讨论】:

  • 如果您要读取 ANSI 字符串,那么您不妨致电 FindWindowA。如果你想支持 UTF-16,那么你最好停止将字符串存储在 ANSI char 数组中。
  • 您可以使用 mbstowcs_s 和 wcstombs_s 在宽/多字节字符数组之间进行转换。见thisthis
  • 我将使用字符串作为输入,并使用MyString.c_str()&amp;MyString[0] 为API 函数提供参数。

标签: c++ winapi char wchar-t lpcwstr


【解决方案1】:

我会使用:

#ifdef UNICODE
typedef std::wstring String;
#define Char         wchar_t
#define out          wcout
#define in           wcin
#else
typedef std::string String;
#define Char        char
#define out         cout
#define in          cin
#endif

String input;
out << _T("Window title: ");
in >> input;
FindWindow(input.c_str(), ...);

如果您确定UNICODE 是否已定义,则可以不进行定义,但我建议将 typedef 用于字符串类型并使用字符串而不是 api 指针类型,因为它类型更安全且更易于阅读代码。在这种情况下,您需要调用 c_str() 方法,该方法返回指向第一个元素的指针。你也可以使用&amp;string[0]

【讨论】:

    【解决方案2】:

    你认为你为什么想要LPCWSTRLPCWSTR 用于为 UNICODE 编译的程序中。如果您在任何地方都使用 char 类型,那么您应该将项目属性字符集从“使用UNICODE 字符集”更改为“使用多字节字符集”。如果这样做,那么FindWindow 将接受一个字符数组,例如

    char input[256];
    

    【讨论】:

    • 你为什么认为你想要 LPCWSTR? 显然是因为编译器这么说的。
    【解决方案3】:

    首先,您可以让用户输入wchar_t* 而不是char*。我认为这将是最好的选择。


    LPCWSTR 是指向宽字符数组的指针,因此您需要将每个char 转换为wchar_t

    假设你有:

    char arr[] = "Some string";
    

    所以你的行动:

    size_t size = strlen(arr);
    wchar_t* wArr = new wchar_t[size];
    for (size_t i = 0; i < size; ++i)
        wArr[i] = arr[i];
    

    如果您需要LPCWSTR,您只需使用&amp;wArr[0](或其他一些索引)。

    重要提示:不要忘记释放内存。

    【讨论】:

      【解决方案4】:

      您可以使用 cin 和 cout 的广泛变体:

      wchar_t input[256];    // don't really use a fixed size buffer!
      wcout << L"Window title: ";
      wcin >> input;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-31
        • 2018-06-08
        • 2019-05-15
        • 2017-10-14
        • 2016-07-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多