Fix(Web): Map unshifted OEM symbols, send multi-char IME commits
This commit is contained in:
@@ -2916,36 +2916,38 @@ inline std::string GetWebPageHTML() {
|
|||||||
sendKey(e.keyCode, false, e.altKey);
|
sendKey(e.keyCode, false, e.altKey);
|
||||||
});
|
});
|
||||||
|
|
||||||
mobileKeyboard.addEventListener('input', function(e) {
|
// 字符 → Win32 VK 映射表(提到 listener 外避免每次输入重建)。
|
||||||
const char = e.data;
|
// US 键盘上"不需要 Shift"的 OEM 符号 ASCII 码 ≠ VK 码,必须显式映射。
|
||||||
if (char) {
|
const SHIFT_SYMBOLS = '~!@#$%^&*()_+{}|:"<>?';
|
||||||
// Check if character needs Shift key
|
const SYMBOL_VK_MAP = {
|
||||||
const isUpperCase = char >= 'A' && char <= 'Z';
|
// —— Unshifted OEM symbols (US layout) ——
|
||||||
const shiftSymbols = '~!@#$%^&*()_+{}|:"<>?';
|
'`': 192, '-': 189, '=': 187, '[': 219, ']': 221, '\\': 220,
|
||||||
const needsShift = isUpperCase || shiftSymbols.includes(char);
|
';': 186, "'": 222, ',': 188, '.': 190, '/': 191,
|
||||||
|
// —— Shifted symbols (与 above 共享 VK,多了 Shift 修饰) ——
|
||||||
// Map symbols to their base keys
|
|
||||||
const symbolMap = {
|
|
||||||
'~': 192, '!': 49, '@': 50, '#': 51, '$': 52, '%': 53,
|
'~': 192, '!': 49, '@': 50, '#': 51, '$': 52, '%': 53,
|
||||||
'^': 54, '&': 55, '*': 56, '(': 57, ')': 48, '_': 189,
|
'^': 54, '&': 55, '*': 56, '(': 57, ')': 48, '_': 189,
|
||||||
'+': 187, '{': 219, '}': 221, '|': 220, ':': 186,
|
'+': 187, '{': 219, '}': 221, '|': 220, ':': 186,
|
||||||
'"': 222, '<': 188, '>': 190, '?': 191
|
'"': 222, '<': 188, '>': 190, '?': 191
|
||||||
};
|
};
|
||||||
|
|
||||||
let keyCode;
|
// 把单个字符发成一对 keyDown/keyUp(必要时夹一对 Shift)
|
||||||
if (symbolMap[char]) {
|
function sendCharAsKey(ch) {
|
||||||
keyCode = symbolMap[char];
|
const isUpperCase = ch >= 'A' && ch <= 'Z';
|
||||||
} else {
|
const needsShift = isUpperCase || SHIFT_SYMBOLS.includes(ch);
|
||||||
keyCode = char.toUpperCase().charCodeAt(0);
|
const keyCode = SYMBOL_VK_MAP[ch] || ch.toUpperCase().charCodeAt(0);
|
||||||
}
|
|
||||||
|
|
||||||
// Send Shift down if needed
|
|
||||||
if (needsShift) sendKey(16, true); // VK_SHIFT = 16
|
if (needsShift) sendKey(16, true); // VK_SHIFT = 16
|
||||||
sendKey(keyCode, true);
|
sendKey(keyCode, true);
|
||||||
sendKey(keyCode, false);
|
sendKey(keyCode, false);
|
||||||
// Send Shift up if needed
|
|
||||||
if (needsShift) sendKey(16, false);
|
if (needsShift) sendKey(16, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mobileKeyboard.addEventListener('input', function(e) {
|
||||||
|
// e.data 可能携带多个字符(中/日/韩 IME 候选词上屏、Gboard 滑行输入、
|
||||||
|
// 剪贴板粘贴一段文本都会一次性 commit)。逐字符发送,保证每个都到达 host。
|
||||||
|
const text = e.data;
|
||||||
|
if (text) {
|
||||||
|
for (const ch of text) sendCharAsKey(ch);
|
||||||
|
}
|
||||||
mobileKeyboard.value = '';
|
mobileKeyboard.value = '';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user