我正在编写一个类似于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有一个KEYEVENTF_UNICODE参数用于发送Unicode字符。但是这些字符似乎在某种扩展的Unicode页面中。超出了16位Unicode范围(U+0000至U+FFFF),C# char或INPUT结构中的short 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)?
WM_UNICHAR
吗? - Cory Nelson