查看: 2690|回复: 5

请教给OSG窗口发送键盘消息的问题

[复制链接]

该用户从未签到

发表于 2010-9-29 11:05:37 | 显示全部楼层 |阅读模式
从一独立线程发送键盘消息给OSG窗口,消息类型能正确收到,但消息参数没有正确传过去,OSG获取的键值总是为0,请教大家。相关代码如下:

/// 获取OSG窗口
osg::GraphicsContext* GC = viewer.getCamera()->getGraphicsContext();
osg::ref_ptr<osgViewer::GraphicsWindowWin32> _GCWin32
= dynamic_cast<osgViewer::GraphicsWindowWin32*>(GC);
if (_GCWin32.valid())
{
/// 发送键盘消息,参数有问题吗
::SendMessage(_GCWin32->getHWND(),WM_KEYUP,VK_RETURN,0);
::SendMessage(_GCWin32->getHWND(),WM_KEYUP,'d',0);
}


/// OSG处理事件
bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)
{
int _Key = ea.getKey(); ///这里键值不对,总是为0
switch(ea.getEventType())
{
case(osgGA::GUIEventAdapter::KEYDOWN):
  ...
  break;
case(osgGA::GUIEventAdapter::KEYUP):///事件能接收到,事件类型也正确
  ...
  break;
default:
  break;
}
return false;
}

该用户从未签到

发表于 2010-9-29 16:28:15 | 显示全部楼层
如果您用SendMessage传递Windows消息的话,请参照MSDN正确表达wparam和lparam的内容:VK_RETURN,0和'd',0恐怕并不能被Windows正确识别,因而也不会被OSG正确识别

该用户从未签到

 楼主| 发表于 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);

该用户从未签到

 楼主| 发表于 2010-9-29 17:28:28 | 显示全部楼层
另外,找到个相关主题的帖子,留在这里mark一下
http://forum.openscenegraph.org/viewtopic.php?t=6614

该用户从未签到

发表于 2010-9-30 08:24:32 | 显示全部楼层
您的解决方法应该是对SendMessage的正确运用

该用户从未签到

发表于 2010-9-30 11:21:33 | 显示全部楼层
mark了解下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表