使用WM_CHAR键入Unicode符号
Typing Unicode symbols using WM_CHAR
如何使用WM_CHAR消息键入一些Unicode符号(如cyrillic)?现在我有了不正确的cyrillic符号类型。这是我的代码:
DWORD dwCurrentTreadID = GetCurrentThreadId();
HWND hForeground = GetForegroundWindow();
DWORD dwForegroungThreadID = GetWindowThreadProcessId(hForeground, NULL);
AttachThreadInput(dwForegroungThreadID,dwCurrentTreadID,true);
PostMessageW(GetFocus(), WM_CHAR, character, 1);
您不能用PostMessage模拟键盘输入。改为使用SendInput()
:
INPUT input = {0};
input.type = INPUT_KEYBOARD;
input.ki.wScan = (WORD) character;
input.ki.dwFlags = KEYEVENTF_UNICODE;
SendInput(1, &input, sizeof(INPUT));
Windows中的Unicode使用UTF-16。wScan
是16位的,因此它只能容纳单独的UTF-16编码单元。您可以将高达U+FFFF
的Unicode代码点放入单个代码单元中,但要发送高于U+FFFF的代码点(需要2个代码单元),您必须提供2个INPUT
值,每个代码单元一个:
INPUT input[2] = {0};
int numInput;
// character should be a 32bit codepoint and not exceed 0x10FFFF...
if (character <= 0xFFFF)
{
input[0].type = INPUT_KEYBOARD;
input[0].ki.wScan = (WORD) character;
input[0].ki.dwFlags = KEYEVENTF_UNICODE;
numInput = 1;
}
else
{
character -= 0x010000;
input[0].type = INPUT_KEYBOARD;
input[0].ki.wScan = (WORD) (((character >> 10) & 0x03FF) + 0xD800);
input[0].ki.dwFlags = KEYEVENTF_UNICODE;
input[0].type = INPUT_KEYBOARD;
input[1].ki.wScan = (WORD) ((character & 0x03FF) + 0xDC00);
input[0].ki.dwFlags = KEYEVENTF_UNICODE;
numInput = 2;
}
SendInput(numInput, input, sizeof(INPUT));
您可以将其封装在一个函数中,该函数发送一个UTF-16编码的输入字符串:
void SendInputStr(const std::wstring &str) // in C++11, use std::u16string instead...
{
if (str.empty()) return;
std::vector<INPUT> input(str.length());
for (int i = 0; i < str.length(); ++i)
{
input[i].type = INPUT_KEYBOARD;
input[i].ki.wScan = (WORD) str[i];
input[i].ki.dwFlags = KEYEVENTF_UNICODE;
}
SendInput(input.size(), &input[0], sizeof(INPUT));
}
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 将无符号char*转换为std::istream*C++
- 无法从 std::string 中提取C++ Unicode 符号
- 将 unicode 字符串与 c ++ 符号进行比较?
- 链接器错误:切换到unicode生成给出:未解析的外部符号WinMain
- Unicode Chars显示为十进制数字而不是符号,我该如何修复
- Linux Ubuntu 中的文件内输出 unicode 符号
- 如何从 c++ 或 cocos2dx 中的表情符号中获取 unicode
- BSTR 中有 Unicode 符号吗?
- 为什么非unicode应用程序系统语言环境使Unicode字体具有错误显示的符号字符
- 使用WM_CHAR键入Unicode符号
- 如何将无符号十六进制值转换为相应的unicode字符,这些字符应该使用c++写入文件
- 将表情符号unicode从cpp核心级别传递到iosui级别
- 转换带有 ASCII/UTF8 重音符号的 Unicode 字母
- 使用Unicode C++的飞机符号
- 如何在C++中解析Unicode符号?(如u204c)
- SetDllDirectory由于某些unicode符号而失败
- 如何使用QT在Linux上正确显示unicode符号
- 如何从c++文本文件中读取Unicode符号