4

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

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

很标准。那么,如何将其转换为LPCWSTRfor FindWindow()

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

4

4 回答 4

5

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

wchar_t input[256];    // don't really use a fixed size buffer!
wcout << L"Window title: ";
wcin >> input;
于 2013-07-24T14:11:39.223 回答
3

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

char input[256];
于 2013-07-24T14:31:46.573 回答
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(), ...);

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

于 2013-07-24T15:32:22.357 回答
1

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


LPCWSTR是指向宽 char 数组的指针,因此您需要将 each 转换charwchar_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](或其他索引)。

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

于 2013-10-22T08:34:04.620 回答