挂钩键盘更改密钥代码
问题描述:
我买了这个键盘http://www.mobilitylab.eu/mini-design-touch-silver.html 107触摸, ,我想要一个键盘把它放在我的左手上。 但是当我们激活键盘的numlock时,它激活键盘上的numlock。 所以我们有456-而不是uiop。 我发现这个程序,但它不适用于64位操作系统。 http://www.bellamyjc.org/fr/systeme.html#knumlock。挂钩键盘更改密钥代码
所以我想用C++做我自己的程序,但它不能正常工作,挂钩是好的(WH_GETMESSAGE),但我不明白我们如何改变键码以及如何找到它是一个键盘或键盘的键?
这里,这是我的代码,我尝试更改消息:
//-----------------Keyboard Hook Callback---------------//
Hookmsg_API LRESULT CALLBACK Hookmsg(int ncode,WPARAM wparam,LPARAM lparam){
//if(ncode>=0) //
if(ncode<0)
return CallNextHookEx(hook,ncode,wparam,lparam);
MSG *msg;
msg=(MSG *)lparam;
WORD newVK,oldVK;
WORD newSC,oldSC;
if(ncode==HC_ACTION)
{
if((msg->message == WM_KEYUP))//Check whether key was pressed(not released).)
{
oldVK=msg->wParam;
oldSC=SCANCODE(msg->lParam);
bool extendkey=false;
if(((HIWORD(msg->wParam) & 0x0100) == 0x0100))
{
extendkey=true;
}
if(!extendkey)
{
bool modif=true;
switch(oldVK)//wparam
{
case VK_INSERT: newVK=VK_NUMPAD0; break;
case VK_END: newVK=VK_NUMPAD1; break;
case VK_DOWN: newVK=VK_NUMPAD2; break;
case VK_NEXT: newVK=VK_NUMPAD3; break;
case VK_LEFT: newVK=VK_NUMPAD4; break;
case VK_CLEAR: newVK=VK_NUMPAD5; break;
case VK_RIGHT: newVK=VK_NUMPAD6; break;
case VK_HOME: newVK=VK_NUMPAD7; break;
case VK_UP: newVK=VK_NUMPAD8; break;
case VK_PRIOR: newVK=VK_NUMPAD9; break;
case VK_DELETE: newVK=VK_DECIMAL; break;
default: modif=false;
}
if(modif==true)
{
msg->wParam = VK_NUMPAD0;
UINT newSC=MapVirtualKey(VK_NUMPAD0,MAPVK_VK_TO_VSC);
msg->lParam &= 0xFF00;
msg->lParam += (newSC << 16);
//MessageBox(NULL, TEXT("OK"), TEXT("Error!"), MB_OK);
}
}
}
}
return (CallNextHookEx(hook,ncode,wparam,lparam));//pass control to next hook in the hook chain.
}
答
无法理解ü...
ü有2个键盘?
如果是,尝试使用原始输入(原始数据从USB HID设备)
http://msdn.microsoft.com/en-us/library/windows/desktop/ms645543(v=vs.85).aspx
wParam和lParam不为其他应用程序可见。
答
键盘输入不仅仅是windows消息。在某些情况下修改这些消息可能会起作用,但这是一个非常不完整的解决方案。您还需要考虑驾驶员状态,GetKeyboardState
等。
如果要重新映射键盘上的键,可以创建新的键盘布局并将其分配给语言环境。
如果键盘布局不能满足您的需求,您将需要编写一个键盘设备驱动程序。
如果您只在特定应用程序(而非全局系统)中需要此功能,那么您可能会很幸运并且只能修改Windows消息。