- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在从 CView
继承的 PreTranslateMessage(MSG *pMsg)
中的 MFC 应用程序中,我有这个:
if (pMsg->message == WM_KEYDOWN) ...
WM_KEYDOWN
中的字段已记录 here .虚拟键VK_
的值在pMsg->wParam
中,pMsg->lParam
包含几个字段,其中第16-23位是键盘扫码。
所以在我的代码中我使用:
const int virtualKey = pMsg->wParam;
const int hardwareScanCode = (pMsg->lParam >> 16) & 0x00ff; // bits 16-23
例如,在我的非美式键盘上,当我按下“#”字符时,我得到以下信息:
virtualKey == 0xde --> VK_OEM_7 "Used for miscellaneous characters; it can vary by keyboard."
hardwareScanCode == 0x29 (41 decimal)
我想“捕获”或以不同方式处理的字符是 ASCII“#”,0x23(十进制 35)。
我的问题
无论语言或键盘布局如何,如何翻译 WM_KEYDOWN
信息以获得我可以比较的内容?我需要确定 #
键是用户使用的是标准美式键盘还是其他键盘。
例如,我一直在查看以下函数,例如:
MapVirtualKey(virtualkey, MAPVK_VSC_TO_VK);
// previous line is useless, the key VK_OEM_7 doesn't map to anything without the scan code
ToAscii(virtualKey, hardwareScanCode, nullptr, &word, 0);
// previous line returns zero, and zero is written to `word`
编辑:
长话短说:在美式键盘上,SHIFT+3 = #
,而在法语键盘上,SHIFT+3 = /
。所以我不想查看单个键,而是想了解字符。
在处理 WM_KEYDOWN 时,如何转换 lParam 和 wParam(“键”)以找出键盘和 Windows 将要生成的字符?
最佳答案
我相信这是一个更好的解决方案。此键盘已使用标准美国键盘布局和加拿大-法语键盘布局进行了测试。
const int wParam = pMsg->wParam;
const int lParam = pMsg->lParam;
const int keyboardScanCode = (lParam >> 16) & 0x00ff;
const int virtualKey = wParam;
BYTE keyboardState[256];
GetKeyboardState(keyboardState);
WORD ascii = 0;
const int len = ToAscii(virtualKey, keyboardScanCode, keyboardState, &ascii, 0);
if (len == 1 && ascii == '#')
{
// ...etc...
}
即使帮助页面似乎暗示 keyboardState
对于 ToAscii()
的调用是可选的,但我发现它是我尝试的字符所必需的检测。
关于windows - 如何从 PreTranslateMessage(MSG*pMsg) 中的 WM_KEYDOWN 中提取字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44660035/
注意:这与Determine number of bits in integral type at compile time非常相似,但是这是一个非常简化的版本,所有内容都包含在一个 .cpp 中 编
var err1 = Error('message'); var err2 = new Error('message'); 有什么区别?在 chrome 控制台中查看它们,它们看起来相同。对象上的相同
我有一些 jquery/php 代码,它使用 ajax 调用另一个页面。 var pall_id = $(this).attr('id'); $.ajax({ t
我当时正在开发一个在 Linux 上运行了 20 多年的遗留代码。它有3个模块,由3个不同的人处理。我只能更改一个模块。 现在我的任务是在 Windows 中构建具有最少功能的相同代码。 对于进程间通
public JsonResult Authe(string Email, string Password, bool ? Active) { var x = (from n in db.Au
var err1 = Error('message'); var err2 = new Error('message'); 有什么区别?在 Chrome 控制台中查看它们,它们看起来相同。对象上的相同
!!msg.message && msg.message 和 msg?.message 之间的区别? 第一个是当 msg 未定义时 msg.message 将不会被执行。 第二个是什么意思? 最佳答案
我正在做一个项目,我的队友和我正在讨论哪种方法更好。 在我看来Html msg似乎更通用,所以我认为我们应该尽可能使用它,但我不能给他其他理由。 另外,我来自 React 和 Redux,对我来说看起
您好,问题如下: 假设我们有链接的进程 A 和 B。进程的 A 标志 trap_exit 设置为 true。让 B 进程向 A 发送一个 msg 然后退出: PidA ! 'msg', exit(re
有没有人知道任何 JavaScript 库可以打开现有的 *.msg Outlook 文件,例如创建为模板,并可以使用代码将数据放入主题、任何其他 {} 数据并将其作为新数据保存到磁盘。消息文件? 详
我是 google protobuf 的新手,我想知道以下方法之间有什么不同: 1) foo.mutable_bar()->set_somefield(...) 和 2) nestedmsg = fo
如果我这样调用它,我会看到一个很好的差异: self.assertEqual(a, b) 如果我这样调用它,我只会看到消息: self.assertEqual(a, b, msg) 有没有简单的方法来
我是 akka 的初学者。有人可以向我解释为什么 tell 方法定义如下: receiver.tell(msg, sender); 在我看来,有人向其他人发送消息,在 OOP 中它会这样: sende
目前我的代码有 CString DisplayMessage,我的代码全部使用它在客户端和服务器之间交换 DisplayMessage。现在随着软件走向国际化,我希望 DisplayMessage 具
当我使用 Handler.dispatchMessage(msg) 时,handleMessage(Message msg) 将在新线程上运行,但是当我使用 Handler.sendMessage(
今天我遇到了一个事实,即从子线程调用的 sys.exit() 不会终止主进程。我以前不知道这一点,这没关系,但我需要很长时间才能意识到这一点。如果 sys.exit(msg) 会将 msg 打印到 s
我复制了 rabbitmq go example 并稍作改动以进行测试。 Example URL .正常工作 代码结构: func main() { //dial rabbit serve
我正在阅读 Java 9 中引入的 System.Logger API。我无法理解为什么他们开发了如此奇怪 API: System.Logger { public default void log
msg.chat.id 之间有什么区别和 msg.from.id在 Telegeram 机器人中? 显然,两者都是相同的并且返回用户ID。 bot.sendMessage(msg.chat.id, '
我目前正在学习 elm,我只是偶然发现了 div 返回 Html (String -> Msg) 而不是 Html Msg 的问题。 我收到的错误信息 这个 div 调用产生: Html (Strin
我是一名优秀的程序员,十分优秀!