我正在编写一个类似于 Windows 8 中的屏幕键盘。使用 Win32 的 SendInput 发送我需要的大部分字符都没有问题。
问题在于新的 Windows 8 表情符号。它们从 U+1F600 开始,使用 Segoe UI Symbol 字体。
在 Windows 8 屏幕键盘上使用 Spy++,我得到所有表情符号字形的以下输出。
<00001> 000C064A P WM_KEYDOWN nVirtKey:VK_PACKET cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00002> 000C064A P WM_CHAR chCharCode:'63' (63) cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00003> 000C064A P WM_KEYUP nVirtKey:VK_PACKET cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:1 fUp:1
<00004> 000C064A P WM_KEYDOWN nVirtKey:VK_PACKET cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00005> 000C064A P WM_CHAR chCharCode:'63' (63) cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00006> 000C064A P WM_KEYUP nVirtKey:VK_PACKET cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:1 fUp:1
由于它们都产生相同的输出,我看不到实际识别唯一字形的发送内容。
我知道 SendInput 有一个用于发送 unicode 字符的 KEYEVENTF_UNICODE 参数。但是这些字符似乎在某种扩展的 unicode 页面中。在 16 位 unicode 范围(U+0000 到 U+FFFF)之外,可以表示 C# char 或 INPUT 结构中的短 wScan 值。
这是我的 SendCharUnicode 方法。
public static void SendCharUnicode(char ch)
{
Win32.INPUT[] input = new Win32.INPUT[2];
input[0] = new Win32.INPUT();
input[0].type = Win32.INPUT_KEYBOARD;
input[0].ki.wVk = 0;
input[0].ki.wScan = (short)ch;
input[0].ki.time = 0;
input[0].ki.dwFlags = Win32.KEYEVENTF_UNICODE;
input[0].ki.dwExtraInfo = Win32.GetMessageExtraInfo();
input[1] = new Win32.INPUT();
input[1].type = Win32.INPUT_KEYBOARD;
input[1].ki.wVk = 0;
input[1].ki.wScan = (short)ch;
input[1].ki.time = 0;
input[1].ki.dwFlags = Win32.KEYEVENTF_UNICODE | Win32.KEYEVENTF_KEYUP;
input[1].ki.dwExtraInfo = Win32.GetMessageExtraInfo();
Win32.SendInput(2, input, Marshal.SizeOf(typeof(Win32.INPUT)));
}
如何修改此方法以成功发送 Unicode 字符,例如 (U+1F600)?