windows下如何获取键盘硬件扫描码(hardware scancode)

姑苏老白杨 2012-12-21 11:31:48
KBDLLHOOKSTRUCT 中对 lparam 参数进行了解析,第16-23位:指定扫描码. 依赖于OEM。
这样取出来的只有1个字节。

但是有的key的scancode 有2,或3个字节。例如右Ctrl , pause 等 。
他们的scancode 前面为 E0, E1, E2 等。

网上查了很久,没有找到在Windows下可以正确获取scancode 的方法。


您有方法吗? 谢谢!
...全文
1730 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
姑苏老白杨 2012-12-25
  • 打赏
  • 举报
回复
ls , 具体怎样操作 ? 就我所知, windows 下 通过 Hook 捕捉到 Keyboard event 传送过来的信息也就在 wParam , lParam 这两个参数里面, 而lParam 中的 scancode 只有1Byte 。 这样检查出来的, 例如 左边的ctrl scanCode是 1D, 右边的Ctrl 也是1D (实际上,应该是 E0 1D) 2Byte. 有些特殊的key , 例如pause ,是3Byte . 3Q
科比布莱恩特 2012-12-24
  • 打赏
  • 举报
回复
引用 楼主 fdyang2008 的回复:
KBDLLHOOKSTRUCT 中对 lparam 参数进行了解析,第16-23位:指定扫描码. 依赖于OEM。 这样取出来的只有1个字节。 但是有的key的scancode 有2,或3个字节。例如右Ctrl , pause 等 。 他们的scancode 前面为 E0, E1, E2 等。 网上查了很久,没有找到在Windows下可以正确获取scanc……
HOOK keyboradevent即可
using System; using System.Runtime.InteropServices; using System.Reflection; using System.Windows.Forms; namespace KeyboardHook { public enum KeyboardEvents { KeyDown = 0x0100, KeyUp = 0x0101, SystemKeyDown = 0x0104, SystemKeyUp = 0x0105 } [StructLayout(LayoutKind.Sequential)] public struct KeyboardHookStruct { public int vkCode; //表示一个在1到254间的虚似键盘 public int scanCode; //表示硬件扫描 public int flags; public int time; public int dwExtraInfo; } public delegate void KeyboardEventHandler(KeyboardEvents keyEvent, System.Windows.Forms.Keys key); public class Hook { public event KeyboardEventHandler KeyboardEvent; public enum HookType { WH_JOURNALRECORD = 0, WH_JOURNALPLAYBACK = 1, WH_KEYBOARD = 2, WH_GETMESSAGE = 3, WH_CALLWNDPROC = 4, WH_CBT = 5, WH_SYSMSGFILTER = 6, WH_MOUSE = 7, WH_HARDWARE = 8, WH_DEBUG = 9, WH_SHELL = 10, WH_FOREGROUNDIDLE = 11, WH_CALLWNDPROCRET = 12, WH_KEYBOARD_LL = 13, WH_MOUSE_LL = 14, WH_MSGFILTER = -1, } public delegate IntPtr HookProc(int code, int wParam, IntPtr lParam); [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern IntPtr SetWindowsHookEx(HookType hookType, HookProc hook, IntPtr instance, int threadID); [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern IntPtr CallNextHookEx(IntPtr hookHandle, int code, int wParam, IntPtr lParam); [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern bool UnhookWindowsHookEx(IntPtr hookHandle); private IntPtr instance; private IntPtr hookHandle; private int threadID; private HookProc hookProcEx; public Hook()

2,644

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧