Keyboard Input键盘输入

键盘输入编程与处理
一、概述
1.1 键盘输入模型
系统通过键盘驱动提供设备无关的键盘输入给应用程序,每个按钮都对应一个唯一的扫描码。一个按键产生两个扫描码,一个是键盘按下的时候,另一个是键盘松开的时候。键盘驱动将扫描码转换成虚拟键,产生一个键盘消息,包含扫描码、虚拟键、按键信息,加入到系统消息队列中,系统又将消息从系统消息队列中移除出来,发送到应用程序的消息队列中。
1.2 键盘焦点与激活
键盘焦点是窗口的一个属性,拥有键盘焦点的窗口接收键盘的所有输入,直到焦点转移到其他窗口。所有线程可以GetFocus确定当前拥有焦点的窗口,SetFocus将焦点设置给窗口。当焦点被转移给其他窗口,原来拥有焦点的窗口会受到WM_KILLFOCUS消息,而新的窗口会受到WM_SETFOCUS消息。键盘焦点相关的另一个概念就是活动窗口。活动窗口就是当前工作的顶层窗口。拥有焦点的窗口要么是顶层窗口,要么就是顶层窗口的子窗口。当窗口拥有焦点,系统会将其放置Z方向最顶层,并将其标题栏高亮显示,边框高亮。用户激活窗口的方法:点击窗口、ALT+TAB或ALT+ESC组合件选择、任务列表选择。线程激活窗口:SetActiveEWindow。线程查询窗口是否激活: GetActiveWindow。窗口的激活状态改变将会接收到WM_ACTIVE消息。
1.3 击键消息
按下键盘WM_KEYDOWN或WM_SYSKEYDOWN消息,释放键盘WM_KEYUP或WM_SYSKEYUP。一般情况下,按下与释放是成对出现的,但是用户按下一直不放,则会是键盘产生重复按下消息并生成一系列WM_KEYDOWN消息,松开的时候只产生一个WM_KEYUP消息。
(1)系统与非系统击键
系统击键产生WM_SYSKEYDOWN与WM_SYSKEYUP消息,而非系统击键WM_KEYDOWN与WM_KEYUP。系统击键主要由系统使用。按下ALT+其他按键产生系统击键。
(2)虚拟键
键盘消息的WPARAM包含虚拟键代码,窗口可以通过虚拟键代码判断是否处理消息。
(3)击键消息标识
击键消息的lParam包含附加信息,包含重复次数、扫描码、扩展键标识、环境代码(context code)、前一次的按键状态、过渡状态。

1.4 字符消息
击键消息包含了击键信息,但是不包含字符信息,要获得字符信息还需要在消息循环中调用TranslateMessage转换WM_KEYDOWN与WM_KEYUP消息。

1.5 Key State
GetKeyState获取一个虚拟键的状态, 收到当前消息的时候。GetAsyncKeyState获取键盘虚拟键当前的状态。

1.6 Hot-key 热键(快捷键)
热键是一些组合键,系统会放在消息队列的前端,能产生WM_HOTKEY消息。RegisterHotKey定义热键。UnregisterHotKey释放热键。

1.7 模拟输入
模拟输入事件,使用SendInput函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
void NotifyKBEvent(wchar_t ch) { SHORT vks = VkKeyScanW(ch); BYTE vk = LOBYTE(vks); BYTE Shift = HIBYTE(vks); if (vk == (BYTE)-1/* || Shift == (BYTE)-1*/) {//UNICODE 字符 INPUT input[2]; input[0].type = INPUT_KEYBOARD; input[0].ki.wVk = 0; input[0].ki.wScan = ch; input[0].ki.dwFlags = 0x4;//KEYEVENTF_UNICODE; input[1].type = INPUT_KEYBOARD; input[1].ki.wVk = 0; input[1].ki.wScan = ch; input[1].ki.dwFlags = KEYEVENTF_KEYUP | 0x4;//KEYEVENTF_UNICODE; SendInput(2, input, sizeof(INPUT)); } else {// if (Shift) { INPUT input[4] = {0}; input[0].type = INPUT_KEYBOARD; input[0].ki.wVk = Shift;//VK_SHIFT; input[1].type = INPUT_KEYBOARD; input[1].ki.wVk = ch; input[2].type = INPUT_KEYBOARD; input[2].ki.wVk = ch; input[2].ki.dwFlags = KEYEVENTF_KEYUP; input[3].type = INPUT_KEYBOARD; input[3].ki.wVk = Shift;//VK_SHIFT; input[3].ki.dwFlags = KEYEVENTF_KEYUP; SendInput(4, input, sizeof(INPUT)); } else { INPUT input[2] = {0}; input[0].type = INPUT_KEYBOARD; input[0].ki.wVk = vks; input[1].type = INPUT_KEYBOARD; input[1].ki.wVk = vks; input[1].ki.dwFlags = KEYEVENTF_KEYUP; SendInput(2, input, sizeof(INPUT)); } } } void NotifyKBEvent(wchar_t* chs) { if (chs == NULL) return ; while(*chs) NotifyKBEvent(*chs++); } void SendKBEvent(WORD wVk, DWORD dwFlags = 0, DWORD dwExtraInfo = 0) { INPUT input[1] = {0}; input[0].type = INPUT_KEYBOARD; input[0].ki.wVk = wVk; input[0].ki.wScan = MapVirtualKey(wVk, 0); input[0].ki.dwFlags = dwFlags; input[0].ki.dwExtraInfo = dwExtraInfo; input[0].ki.time = GetTickCount(); SendInput(1, input, sizeof(INPUT)); } //去掉任务栏图标 和 始终不处于活动状态 ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW | 0x08000000); //初始不活动 SetWindowPos(&CWnd;::wndTopMost, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值