游戏开发论坛

 找回密码
 立即注册
搜索
查看: 9738|回复: 7

OGRE放到mfc里面捕捉不到鼠标?

[复制链接]

22

主题

309

帖子

353

积分

中级会员

Rank: 3Rank: 3

积分
353
QQ
发表于 2007-6-7 22:54:00 | 显示全部楼层 |阅读模式
OIS总是获取设备失败,然后我就把mfc的鼠标键盘消息截获了再发给OGRE窗口

新问题是,OGRE里面的鼠标光标位置和真实的光标位置不一样!就是有2个光标..咋办?

5

主题

34

帖子

34

积分

注册会员

Rank: 2

积分
34
发表于 2007-6-8 13:02:00 | 显示全部楼层

Re:OGRE放到mfc里面捕捉不到鼠标?

呵呵,MFC中OIS createInputObject 失败这个问题我以前碰到过
跟踪到OIS的代码里,发现是因为OIS调用IDirectInputDevice8::SetCooperativeLevel时失败所置(返回E_HANDLE)。查了一下MSDN,发现SetCooperativeLevel的hWnd参数必须是一个valid 的top level window的句柄! 把传给OIS的"WINDOW"参数改成 StringConverter::toString((unsigned long)AfxGetMainWnd()->GetSafeHwnd())就OK了 (原来我用的是view的wnd的handle)!

所以,根本没有必要把mfc的鼠标键盘消息截获了再发给OGRE窗口

4

主题

110

帖子

120

积分

注册会员

Rank: 2

积分
120
发表于 2007-6-8 14:02:00 | 显示全部楼层

Re:OGRE放到mfc里面捕捉不到鼠标?

楼主的问题我也遇到了。。目前还没解决。。
期待有人帮忙解答啊

5

主题

34

帖子

34

积分

注册会员

Rank: 2

积分
34
发表于 2007-6-8 14:55:00 | 显示全部楼层

Re:OGRE放到mfc里面捕捉不到鼠标?

cnnwm, 按照我说的方法没有解决么?

5

主题

34

帖子

34

积分

注册会员

Rank: 2

积分
34
发表于 2007-6-8 15:04:00 | 显示全部楼层

Re:OGRE放到mfc里面捕捉不到鼠标?

ExampleFrameListener::ExampleFrameListener()
{
...       
LogManager::getSingletonPtr()->logMessage("*** Initializing OIS ***");
ParamList pl;
       
#if 0
size_t windowHnd = 0;
std:stringstream windowHndStr;

win->getCustomAttribute("WINDOW", &windowHnd);
windowHndStr << windowHnd;
pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
#endif

unsigned long h = (unsigned long)AfxGetMainWnd()->GetSafeHwnd();
pl.insert(std::make_pair(std::string("WINDOW"), StringConverter::toString(h));
       
pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_NONEXCLUSIVE")));
pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_FOREGROUND")));
pl.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_NONEXCLUSIVE")));
pl.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_FOREGROUND")));
mInputManager = InputManager::createInputSystem( pl );

...
}

或者创建RenderWindow时不传视图窗口的handle,改传MainFrame的
NameValuePairList miscParams;
miscParams["externalWindowHandle"] = StringConverter::toString((unsigned int)AfxGetMainWnd()->GetSafeHwnd());
mWindow = mRoot->createRenderWindow( "View", 640, 480, false, &miscParams );
这样,ois创建输入对象时使用RenderWindow::getCustomAttribute("WINDOW", &windowHnd);获取到也是mainframe的窗口的handle
       

193

主题

870

帖子

903

积分

高级会员

Rank: 4

积分
903
QQ
发表于 2007-6-8 23:15:00 | 显示全部楼层

Re:OGRE放到mfc里面捕捉不到鼠标?

OIS需要 根窗口的句柄来处理,不要把显示子窗口的句柄传过去:)

22

主题

309

帖子

353

积分

中级会员

Rank: 3Rank: 3

积分
353
QQ
 楼主| 发表于 2007-6-8 23:46:00 | 显示全部楼层

Re:OGRE放到mfc里面捕捉不到鼠标?

明白了哈...3Q~~~~

4

主题

110

帖子

120

积分

注册会员

Rank: 2

积分
120
发表于 2007-6-11 16:52:00 | 显示全部楼层

Re:OGRE放到mfc里面捕捉不到鼠标?

我没有用MFC。。怎么获得窗口句柄啊
unsigned long h = (unsigned long)AfxGetMainWnd()->GetSafeHwnd();
pl.insert(std::make_pair(std::string("WINDOW"), StringConverter::toString(h));
这里。。
这个能解决OGRE里面的鼠标光标位置和真实的光标位置不一样的问题吗
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 04:33

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表