MFC怎样处理键盘事件。想用mfc写个游戏,不知道怎样用键盘控制。

MFC怎样处理键盘事件。想用mfc写个游戏,不知道怎样用键盘控制。,第1张

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) 捕捉工业小键盘消息等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10174930.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存