mfc 程序(VC) 捕捉工业小键盘消息
程序软件要外接一个工业小键盘,键盘上的键对应是@1,@2,@3,@4请问像这样的键我应该怎么补捉到,我有两个思路:一个自定义消息但这种方法我只会捕捉Ctrl|ALT|SH...
程序软件要外接一个工业小键盘,键盘上的键对应是 @1, @2, @3, @4请问像这样的键我应该怎么补捉到,我有两个思路:一个 自定义消息 但这种方法 我只会捕捉Ctrl | ALT|SHIFT + ?的键盘,也就是只会捕捉2个组合键,三个组合键 如:shift +2+2就不会了, 二个 是用PreTranslateMessage(MSG* pMsg) 我知道有这个函数可以捕捉 ,但是像我遇到的这种消息我不知道怎么捕捉,希望高手帮我解决下这个问题 急急急
还有人知道 吗? 展开
还有人知道 吗? 展开
展开全部
用键盘钩子,钩键盘按键消息,钩子的话,捕捉多少个键都行,但是象“清风or朗月”兄说的,你那工业小键盘的键值应该是生产厂商自定义的吧,那你就要联系相关的技术支持把键盘键值说明拿来。
键盘钩子的话用SetWindowHoolEx,第一个为钩子类型,键盘的话就是WH_KEYBOARD_LL,流程的话就是安装钩子,设置钩子消息处理回调函数,然后在回调函数中处理消息。不难的。
/************************************************
*@函数名: MyTaskKeyHookLL
*@函数功能: 键盘钩子回调函数
*@函数参数: nCode, wp, lp
*@入参:
* nCode:钩子代号
* wp:消息,如,按键按下消息,按键弹起消息等
* 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_ESCAPE?TRUE: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。
键盘钩子的话用SetWindowHoolEx,第一个为钩子类型,键盘的话就是WH_KEYBOARD_LL,流程的话就是安装钩子,设置钩子消息处理回调函数,然后在回调函数中处理消息。不难的。
/************************************************
*@函数名: MyTaskKeyHookLL
*@函数功能: 键盘钩子回调函数
*@函数参数: nCode, wp, lp
*@入参:
* nCode:钩子代号
* wp:消息,如,按键按下消息,按键弹起消息等
* 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_ESCAPE?TRUE: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。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询