问题描述
情况是这样:C#的窗口调用了一个DX+C++的dll,显示一个三维游戏场景,并且可以响应键盘和鼠标操作,怎样做到当点击其他窗体时(其他任何窗口,比如浏览器),我的程序不再响应键盘和鼠标操作?注:此dll在C++写的窗口中时就是这样,但在我的C#窗口中时,不管窗口是否处于活动状态,三维场景都响应键盘和鼠标操作各位大侠,帮帮小弟吧,谢谢了!!!
解决方案
解决方案二:
你要看看C++的窗口里有没有特殊处理
解决方案三:
没有特殊处理啊,他是在Winmain函数里,先初始化InitD3D,然后在一个死循环里进行渲染,while(true)//(GetMessage(&msg,NULL,0,0)){//第二个参数是要获取哪个窗口的消息,为NULL是所有窗口的消息(HWND)//第三,四是消息最小,和最大取值if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))//(!GetMessage(&msg,NULL,0,0))//(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE)){if(msg.message==WM_QUIT){break;}TranslateMessage(&msg);//虚拟健盘的转换DispatchMessage(&msg);//传消息给回调函数}else{g_pD3D->Render();//调用D3D渲染图形//::WaitMessage();}}
但通过他的C++的演示,也许处理消息这一段有问题,但我不知道C#里如何获取系统消息并处理消息?
解决方案四:
你重写Form的WndProc方法,.net的Form通过这个方来来接收消息的。每次有消息发送到Form,都通过这个函数处理。
解决方案五:
恩,为了达到我在2楼的代码的效果,照你所说我重写了WndProc方法,调用了API函数,如下:[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand,Name="FullTrust")]protectedoverridevoidWndProc(refMessagem){if(PeekMessage(m,(IntPtr)null,0,0,0x0001)){if(m.Msg==0x0012){return;}TranslateMessage(m);DispatchMessage(m);}else{this.Invalidate();//重写的OnPaint方法里进行了渲染Render()}}
我是这样认为的,不知道对不对?重写的WndProc方法相当于那个While(true)的死循环了,然后调用API做了和2楼代码相同的处理,但是却没有达到我在顶楼所说的效果,是因为2楼那段代码在C#中有专门的处理方法吗?应该怎么做啊?
解决方案六:
在对键盘或鼠标进行处理之前,可以检测一下是不是活动窗口。
解决方案七:
看样子的确要判断当前窗口是不是活动窗口了,用系统API,GetForegroundWindow
解决方案八:
引用4楼sjianlyer的回复:
恩,为了达到我在2楼的代码的效果,照你所说我重写了WndProc方法,调用了API函数,如下:C#code[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand,Name="FullTrust")]protectedoverridevoidWndProc(refMessagem){if(PeekMessage(m,(IntPtr)null,0,0,0x0001)){if(m.Msg==0x0012)…
你把base.WndProc()也去掉了?可能窗口不会正常工作,base.WndProc()还是应该在最后调用的。