2013-07-24 30 views
2

我試圖使用FindWindow()從WinAPI的,我想問的輸入來自用戶窗口的標題:演員(常量)字符*到LPCWSTR

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

漂亮的標準。 然後,我該如何將其轉換爲LPCWSTRFindWindow()

我已經試過以下內容:_T(input),TEXT(input),(LPCWSTR)input但他們都沒有工作。 我也嘗試使用wchar_t代替char,但我需要char其他地方所以後來我得到幾十錯誤的使用wchar_t代替char ...

+1

如果您要讀取ANSI字符串,那麼您也可以調用'FindWindowA'。如果你想支持UTF-16,那麼你最好停止在ANSI字符數組中存儲字符串。 –

+0

您可以使用mbstowcs_s和wcstombs_s轉換爲/來自寬/多字節字符數組。請參閱[this](http://msdn.microsoft.com/en-us/library/eyktyxsx%28VS.80%29.aspx)和[this](http://msdn.microsoft.com/en-us/庫/ 5d7tc9zw.aspx)。 – sagym

+0

我會使用字符串進行輸入,並使用'MyString.c_str()'或'&MyString [0]'給API函數一個參數。 – ST3

回答

3

您可以使用CIN和COUT的廣泛變種:

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

爲什麼你認爲你想LPCWSTRLPCWSTR用於爲UNICODE編譯的程序。如果您使用的是char類型無處不在,那麼你應該更改項目性質字符從設置「使用UNICODE字符集」到「使用多字節字符集。」如果你這樣做,那麼FindWindow將接受一個字符數組,像

char input[256]; 
+1

*你爲什麼想要LPCWSTR?*很明顯,因爲編譯器這麼說。 –

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定義,你可以不作定義,但我建議使用類型定義字符串類型和使用字符串而非API指針類型,因爲它是類型安全閱讀代碼更容易,在這種情況下,您需要致電c_str()方法返回指向第一個元素的指針。你也可以使用&string[0]

0

首先,您可以將用戶輸入爲wchar_t*而不是char*。我認爲這將是最好的選擇。


LPCWSTR是一個指向寬字符數組,所以你需要轉換的每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](或其他一些指標)。

重要提示:不要忘記取消分配內存。