2015-11-13 62 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));