将(const)char *转换为LPCWSTR

时间:2013-07-24 14:07:27

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

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

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

非常标准。 现在,如何将其转换为LPCWSTR的{​​{1}}?

我已尝试过以下操作:FindWindow()_T(input)TEXT(input),但这些都没有奏效。 我还尝试使用(LPCWSTR)input代替wchar_t,但我需要char其他地方,因此我使用char代替wchar_t时遇到了很多错误。

4 个答案:

答案 0 :(得分:4)

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

char input[256];

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

我会用:

#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()方法,该方法返回指向第一个元素的指针。您也可以使用&string[0]

答案 3 :(得分:0)

首先,您可以将用户输入为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,只需使用&wArr[0](或其他一些索引)。

重要提示:不要忘记取消分配内存。