将(const) char*转换为LPCWSTR

4

我想使用WinAPI中的FindWindow(),并且我希望能够从用户那里获得窗口标题的输入:

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

非常标准。 那么,我如何将其转换为LPCWSTR以供FindWindow()使用呢?

我已经尝试了以下方法:_T(input)TEXT(input)(LPCWSTR)input,但它们都没有起作用。 我还尝试使用wchar_t代替char,但我在其他地方需要使用char,所以我会因为使用wchar_t而得到数十个错误...


1
如果你要读取 ANSI 字符串,那么最好调用 FindWindowA。如果你想支持 UTF-16,那么最好不要在 ANSI 字符数组中存储字符串。 - David Heffernan
你可以使用 mbstowcs_s 和 wcstombs_s 函数来转换宽字符数组和多字节字符数组。请参考 这个链接这个链接 - sagym
我会使用字符串作为输入,并使用 MyString.c_str()&MyString[0] 将其作为参数传递给 API 函数。 - ST3
4个回答

5

您可以使用cin和cout的宽变量:

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

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

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

char input[256];

4
你为什么认为你需要 LPCWSTR?显然是因为编译器这样说。 - David Heffernan

1

首先,您可以将用户输入作为而不是< 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](或其他某个索引)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接