不太确定我们是否在谈论相同的场景,但我最近遇到了类似的问题,即 ToUnicodeEx 中断了用户的击键(当使用诸如“alt+numpad”之类的修饰符或在德语键盘上使用“+”键修饰符时),导致如果需要,则将意外的字母打印到屏幕上。
通过在运行 ToUnicodeEx 之前将 @Nejchy 的代码与 ClearKeyboardBuffer 方法相结合解决了我的问题:
private static bool ClearKeyboardBuffer(uint vk, uint sc, IntPtr hkl)
{
StringBuilder sb = new StringBuilder(10);
int rc = -1;
bool isDeadKey = false;
while (rc < 0)
{
rc = user32.ToUnicodeEx(vk, sc, new byte[256], sb, sb.Capacity, 0, hkl);
if (!isDeadKey && rc == -1) isDeadKey = true;
Console.Write(rc);
}
return isDeadKey;
}
在执行“ToUnicodeEx”的代码中:
var isDeadKey = ClearKeyboardBuffer((uint)aKey, 0, hKd);
if (isDeadKey) return;
user32.ToUnicodeEx((uint)aKey, vkCode, keyboardState, characters, 10, (uint)0, hKd);
参考:
http://www.siao2.com/2006/03/23/558658.aspx
http://www.siao2.com/2006/04/06/569632.aspx
再看他的代码:
https://stackoverflow.com/a/8705696/802848