2015-11-13 59 views
-2

我有一個特殊字符的字符串,像這樣std::string test = "hello é -";我想用keybd_event寫這個字符串,但特殊字符顯示不好。 我這樣做:特殊字符keybd_event C++

std::string result = "Hello é -"; 
int taille = result.size(); 

for (int i = 0 ; i < taille ; i++) 
{ 
    keybd_event(VkKeyScan(result.at(i)),0x9e,0 , 0); 
    keybd_event(VkKeyScan(result.at(i)),0x9e, KEYEVENTF_KEYUP,0); 
} 

我做了一些研究,發現std::wstring對Unicode的,但即使它不工作,任何想法?

+0

問問自己,你會怎麼** **型鍵盤上的任意字符。然後重現那個。更好的是,我們自動化。 –

+0

直接從[keybd_event]的文檔(https://msdn.microsoft.com/en-us/library/windows/desktop/ms646304.aspx):*「此功能已被取代。使用[SendInput](https: //msdn.microsoft.com/en-us/library/windows/desktop/ms646310.aspx)。「*發送不得與其他來源的鍵盤輸入交錯的擊鍵序列(如您的問題中的情況)是爲什麼'keybd_event'已被替換爲'SendInput'的原因。 – IInspectable

+0

是的,我讀了關於'SendInput'的文檔,但我真的不知道如何發送特殊字符到'SendInput' @IInspectable – simon

回答

1

您需要使用SendInput()代替keybd_event(),如:

std::wstring result = L"Hello é -"; 
int taille = result.size(); 

std::vector<INPUT> inputs(taille); 

for (int i = 0; i < taille; ++i) 
{ 
    INPUT &input = inputs[i]; 
    input.type = INPUT_KEYBOARD; 
    input.ki.wVk = 0; 
    input.ki.wScan = result.at(i); 
    input.ki.dwFlags = KEYEVENTF_UNICODE; 
    input.ki.time = 0; 
    input.ki.dwExtraInfo = GetMessageExtraInfo(); 
} 

SendInput(inputs.size(), &inputs[0], sizeof(INPUT));