我希望有一个C#应用程序实现Konami代码来显示复活节彩蛋. http://en.wikipedia.org/wiki/Konami_Code
做这个的最好方式是什么?
这是一个标准的C#windows窗体应用程序.
似乎如果你在全局WH_KEYBOARD_LL钩子中调用ToAscii()或者ToUnicode()同时按下死键,它将被"销毁".
例如,假设您已将Windows中的输入语言配置为西班牙语,并且您希望在程序中键入带重音的字母á.通常情况下,您按下单引号键(死键),然后按字母"a",然后在屏幕上显示重音á,如预期的那样.
但是,如果您调用ToAscii()或ToUnicode()使用低级键盘挂钩功能,则此功能无效.看来,死键被破坏,所以没有重音字母á显示了在屏幕上.删除对上述函数的调用可以解决问题...但不幸的是,我需要能够调用这些函数.
我用谷歌搜索了一段时间,虽然很多人似乎都有这个问题,但没有提供好的解决方案.
任何帮助将非常感激!
编辑:我正在调用ToAscii()将我的LowLevelKeyboardProc钩子函数中收到的虚拟键代码和扫描代码转换为将在屏幕上显示给用户的结果字符.
我尝试过MapVirtualKey(kbHookData->vkCode, 2),但这并不像"完整"那样功能ToAscii(); 例如,如果你按Shift + 2,你将得到'2',而不是'@'(或者Shift + 2将为用户的键盘布局/语言产生).
ToAscii() 是完美的...直到按下死键.
EDIT2:这是钩子函数,删除了无关信息:
LRESULT CALLBACK keyboard_LL_hook_func(int code, WPARAM wParam, LPARAM lParam) {
LPKBDLLHOOKSTRUCT kbHookData = (LPKBDLLHOOKSTRUCT)lParam;
BYTE keyboard_state[256];
if (code < 0) {
return CallNextHookEx(keyHook, code, wParam, lParam);
}
WORD wCharacter = 0;
GetKeyboardState(&keyboard_state);
int ta = ToAscii((UINT)kbHookData->vkCode, kbHookData->scanCode,
keyboard_state, &wCharacter, 0); …Run Code Online (Sandbox Code Playgroud) 我有一个长度为256的缓冲区,它接收来自蓝牙的字节序列.我需要提取的实际数据包是以字节开头和结尾126.我想使用LINQ在缓冲区中提取最新的数据包.
我现在正在做的是检查最后一个索引,126然后向后计数,直到我到达另一个126.还存在一些缺陷,例如,两个相邻的数据包可能导致两个字节126紧挨着.
这是缓冲区的示例:
126 6 0 5 232 125 93 126 126 69 0 0 1 0 2 2 34 6 0 5 232 125 93 126 126 69 0 0 1 0 2 2 34 6 0 5 232 125 93 126 126 69 0 0 1 0 2 2 34 6 0 5 232 125 93 126 126 69 0 0
所以我的信息是:
所以最后我希望有一个包含正确数据包的数组或列表.例如:
126 …Run Code Online (Sandbox Code Playgroud)