|
楼主 |
发表于 2010-9-29 17:17:34
|
显示全部楼层
本帖最后由 leon 于 2010-9-29 17:20 编辑
多谢array。不过对于window程序,wparam置键值,lparam置0,好像是传递键盘消息的一般方法吧,我很少传递键盘消息,所以也不能确定。
不过问题解决了,虽然有些地方不明白,但把解决方法贴在这里吧,说不定有人能用上。
OSG中解释键盘消息的函数在GraphicsWindowWin32里,相关代码如下:
void GraphicsWindowWin32::adaptKey( WPARAM wParam, LPARAM lParam, int& keySymbol, unsigned int& modifierMask )
{
modifierMask = 0;
bool rightSide = (lParam & 0x01000000)!=0;
int virtualKey = ::MapVirtualKeyEx((lParam>>16) & 0xff, 3, ::GetKeyboardLayout(0));
......
keySymbol = remapWin32Key(virtualKey);
......
}
查了下MSDN,这里面首先把lparam里的原始扫描码转换成了虚拟键值,然后把虚拟键值转换成按键值。
要让OSG正确解码键值,就需要得到按键对应的虚拟键值和扫描码。因此,更改的代码如下:
::SendMessage(_GCWin32->getHWND(),WM_KEYUP,::VkKeyScan('d'),::MapVirtualKeyEx(::VkKeyScan('d'),0,::GetKeyboardLayout(0))<<16);
::SendMessage(_GCWin32->getHWND(),WM_KEYUP,VK_RETURN,::MapVirtualKeyEx(VK_RETURN,0,::GetKeyboardLayout(0))<<16); |
|