MFC有个OnKeyDown函数,具体有三个参数。
afx_msg void OnKeyDown(
UINT nChar,
UINT nRepCnt,
UINT nFlags
);
其中,第一个参数表示哪个按键。
nChar
Specifies the virtual key code of the given key For a list of of standard virtual key codes, see Winuserh
这些虚拟键值,有一些是系统常量,以VK_打头。比如Shift是VK_SHIFT(我不知道怎么区分左右),这些虚拟键值,可以在资源窗口中新建一个Accelerator,然后在右边双击,打开新建快捷键对话框,如图中红圈所示。
也可以直接使用无符号整数。
如果想知道具体哪个键对应哪个整数,可以专门写一个MFC程序,构造一个OnKeyDown函数,再使用一个控件输出nChar,就可以了。
其实我也是一知半解,希望对你能有所帮助。如果还有什么问题,可以发站内信,我一定知无不言。
参考资料是在线MSDN,可以看一看。
当你运行程序获得焦点时,才会捕捉相应的WM_KEYDOWN WM_MOUSEMOVE等消息,如果你想做一个后台程序,比如说改建精灵一类的,就需要用到钩子了。调用
HHOOK SetWindowsHookEx(
int idHook,
HOOKPROC lpfn,
HINSTANCE hMod,
DWORD dwThreadId
);
这个方法,第一个参数说明钩子的类型,有比如WH_MOUSE;第二个参数:标识钩子回调函数地址;第三个参数:钩子所在模块的句柄; 第四个参数:被钩线程的ID。具体用法可以去找MSDN或者网上有很多说明的。
用键盘钩子,钩键盘按键消息,钩子的话,捕捉多少个键都行,但是象“清风or朗月”兄说的,你那工业小键盘的键值应该是生产厂商自定义的吧,那你就要联系相关的技术支持把键盘键值说明拿来。
键盘钩子的话用SetWindowHoolEx,第一个为钩子类型,键盘的话就是WH_KEYBOARD_LL,流程的话就是安装钩子,设置钩子消息处理回调函数,然后在回调函数中处理消息。不难的。
/
@函数名: MyTaskKeyHookLL
@函数功能: 键盘钩子回调函数
@函数参数: nCode, wp, lp
@入参:
nCode:钩子代号
wp:消息,如,按键按下消息,按键d起消息等
lp:消息事件的具体结构指针
@出参:
@返回值:
@备注:
/
LRESULT CALLBACK MyTaskKeyHookLL(int nCode, WPARAM wp, LPARAM lp)
{
return 1;
// KBDLLHOOKSTRUCT pkh = (KBDLLHOOKSTRUCT ) lp;
//
// if (nCode==HC_ACTION)
// {
// BOOL bCtrlKeyDown =GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT) 8) - 1);
// BOOL bShift =GetAsyncKeyState(VK_LSHIFT)>>((sizeof(SHORT) 8) - 1);
// BOOL bAlt = GetAsyncKeyState(VK_LMENU)>>((sizeof(SHORT) 8) - 1);
// BOOL bEsc = pkh->vkCode==VK_ESCAPETRUE:FALSE;
// BOOL bWin = GetAsyncKeyState(VK_LWIN)>>((sizeof(SHORT) 8) - 1);
// }
// return CallNextHookEx(g_hHookKbdLL, nCode, wp, lp);
}
/
@函数名: MonopolizeHotKey
@函数功能: 屏蔽热键
@函数参数: bMonopolize
@入参:
bMonopolize:是否屏蔽,TRUE:屏蔽;FALSE:不屏蔽
@出参:
@返回值:
TRUE:屏蔽成功;FALSE:屏蔽失败
@备注:
/
BOOL CSysMonoOperation::MonopolizeHotKey(BOOL bMonopolize)
{
if (bMonopolize)
{
if (g_hHookKbdLL == NULL)
{
g_hHookKbdLL = SetWindowsHookEx(WH_KEYBOARD_LL, MyTaskKeyHookLL, (HINSTANCE)AfxGetApp()->m_hInstance, 0);
if (g_hHookKbdLL != NULL)
{
return TRUE;
}
return FALSE;
}
}
else
{
if (g_hHookKbdLL != NULL)
{
UnhookWindowsHookEx(g_hHookKbdLL);
g_hHookKbdLL = NULL;
}
}
return TRUE;
}
上面那个MonopolizeHotKey方法就是安装或者卸载钩子,安装bMonopolize就为TRUE,卸载bMonopolize为FALSE。
我是这么猜测的,未经测试,楼主自己调试看看吧。
当空间监听到键盘消息‘下’时,开始响应函数,此时光标并未移动,所以取得的数据时当前行。
当键盘响应函数完成时,mfc内部发送消息 将光标下移。
在用户看来,前2步会在一瞬间完成。就造成了光标下移,但数据确是上一行的现象。
----------------------------
更新数据的响应函数单用一个按钮来解决?
如果非要实现按‘下’后就立刻更新数据,试试响应‘下’ d起时响应。也许可以也许不可以- - 总之要试试。
要扯远点就每当按‘下’就建立一个临时线程,线程中随便sleep 1秒,然后获取当前选中的数据。
WM_KEYDOWN
当一个非系统键被按下时该消息发送给具有键盘焦点的窗口。非系统键即不与ALT联用的情况。
其中wParam 指定非系统键的虚拟键码, lParam 指定重复次数,扫描码,扩展键标识符,上下文代码,前一键状态标识符,以及转换状态标识符。
它们如下所示:
0-15
指定当前消息重复的次数。该值代表按键敲击的次数,就如同用户一直按下键盘按键一样。如果按键足够长,会发送多个消息。然而,重复次数不进行累加。
16-23
指定扫描码。该值取决于OEM。
24
指定键是否为扩展键,就如同101或102键盘内的右手的ATL和CTRL键。如果是一个扩展键,则该值是1,否则,它是0
25-28
保留,未使用。
29
指定上下文代码,对于WM_KEYDOWN消息,该值总是0
30
指定之前的键状态。如果在消息发送之前,键被按下,则该值是1,否则该值是0
31
指定转换状态。对于WM_KEYDOWN消息,该值总是0
返回值
应用程序如果处理了该消息,则返回值是0
响应 WM_KEYDOWN 消息,判断VK_SHIFT 和 VK_CONTROL。在MFC中是重载OnKeyDown函数,见下面代码
void CTestView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar == VK_SHIFT)
AfxMessageBox(_T("Shift"));
else if (nChar == VK_CONTROL)
AfxMessageBox(_T("Ctrl"));
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
以上就是关于MFC怎样处理键盘事件。想用mfc写个游戏,不知道怎样用键盘控制。全部的内容,包括:MFC怎样处理键盘事件。想用mfc写个游戏,不知道怎样用键盘控制。、怎么让MFC的对话框程序接收键盘事件、mfc 程序(VC) 捕捉工业小键盘消息等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)