WinForm中UnityWebPlayer屏蔽右键菜单
来源:互联网 发布:hoya镜片怎么样知乎 编辑:程序博客网 时间:2024/05/14 06:12
百度到的解决方案:
鼠标右键的BUG
1).3D模型基本操作都是鼠标右键按下以后,拖动鼠标可以旋转模型视角,但是WPF加载后的UnityWebPlayer控件存在一个BUG:右键菜单。
2).网上有很多方法去除右键菜单的问题.但都是在网页中去除,UnityWebPlayer封装好的控件还是会携带右键菜单.经过几番周折,也没有直接在控件里去除右键菜单的问题.在网上,所有的方法都是在网页中修改JS代码解决右键菜单的问题.但是WPF是没有办法修改JS代码的.因为我们不需要用到Untiy3D发布后的html文件.那怎么解决这个问题呢?我的方式是截取鼠标右键的点击,抬起,按下三个事件,在截取的同时,向模型中发送鼠标消息.
public override bool PreProcessMessage(ref Message msg) {
switch (msg.Msg)
{
case 0x204://鼠标右键按下消息
this.SendMessage("ThiredViewCamera", "RightMouseButtonDown", null); this.SendMessage("FirstViewCamera", "RightMouseButtonDown", null);
this.SendMessage("Main Camera", "RightMouseButtonDown", null);
this.Focus();
return true;
case 0x205://鼠标右键抬起消息
this.SendMessage("ThiredViewCamera", "RightMouseButtonUp", null);
this.SendMessage("FirstViewCamera", "RightMouseButtonUp", null);
this.SendMessage("Main Camera", "RightMouseButtonUp", null);
return true;
case 0x206://鼠标右键点击消息
return true; }
return base.PreProcessMessage(ref msg);
}
}
原本是想在AxUnityWebPlayer以及其父类AxHost身上找到突破口的,网页中有个disableContextMenu属性可以设置,想找到对应的代码。
经过一番尝试,没有任何成果。
换换思路。
思路是用Api控制使右键菜单隐藏。
用Spy++ ,发现右键单击后会有个 Unity.ContextSubMenu 窗口。
API 函数 ShowWindow有点效果,但不理想,Minisize无法完全隐藏。
用MoveWindow(0, 0, 0, 0, true); 可以完全隐藏掉,但是会留下一个透明的阴影。
为了解决这个阴影花了点时间,无论Invalidate,Refresh,UpdateWindow都没有效果。
因为鼠标点击后阴影就消失了,尝试用api模拟鼠标点击事件,但是MouseDown和MouseUp的中间必须有个间隔时间,不然会导致主界面卡一下的bug(这个没找到原因)。这会导致闪一下,最好是能马上消失,而且没副作用。
总之就是让界面刷新,用MoveWindow修改主界面位置,之间修改主界面的Width,尝试无果。
也不知怎么就加了个MoveWindow(0, 0, 10, 10, true);居然就好了。
/// <summary>
/// 封装U3d WebPlayer控件,屏蔽ocx中的鼠标右键显示菜单功能
/// </summary>
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int MoveWindow(IntPtr hwnd, int x, int y, int nWidth, int nHeight, bool bRepaint);
[DllImport("user32")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
private const int WM_PARENTNOTIFY = 0x210;
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_PARENTNOTIFY:
HideContextMenu(m);
break;
}
base.WndProc(ref m);
}
/// <summary>
/// 是否隐藏右键菜单,默认还是要显示的,new出来后要设置一下
/// </summary>
public bool DisableContextMenu { get; set; }
private bool _menuHided;
private void HideContextMenu(Message m)
{
if (_menuHided) return;
if (DisableContextMenu == false) return;
if (m.ToString().Contains("WM_RBUTTONDOWN"))
{
if (_menuHided == false)
{
new Thread(() =>
{
while (_menuHided == false)
{
HideContextMenu();
}
}).Start();
}
}
}
private void HideContextMenu()
{
IntPtr handle = FindWindow("Unity.ContextSubmenu", null);
if (handle != IntPtr.Zero)
{
MoveWindow(handle, 0, 0, 10, 10, true); //这个必须要,不然会有阴影,而且怎么Refresh(),Inalidate()都没法去掉
MoveWindow(handle, 0, 0, 0, 0, true);
_menuHided = true;
}
}
}
- WinForm中UnityWebPlayer屏蔽右键菜单
- unitywebplayer屏蔽鼠标右键
- UnityWebPlayer屏蔽右键及全屏
- 控制WinForm中右键菜单
- 在程序中屏蔽右键菜单
- WinForm中右键菜单的添加
- WinForm中右键菜单的添加
- 屏蔽右键菜单
- JS屏蔽右键菜单
- JS 屏蔽右键菜单
- JS 屏蔽右键菜单
- 屏蔽鼠标右键菜单
- 屏蔽FLEX右键菜单
- JS 屏蔽右键菜单 .
- 屏蔽右键菜单
- 屏蔽右键菜单
- js屏蔽右键菜单
- 网页屏蔽右键菜单
- X264编码
- unity如何同时打开多个工程
- 微薄Restful API
- Yii2 高级版使用默认的表
- Eclipse上传项目到github报错:cannot open git-upload-pack
- WinForm中UnityWebPlayer屏蔽右键菜单
- ios nil Nil NULL NSNull区别
- 判断ie浏览器的方法
- 如果我可以重新学习iOS开发
- HDU 1671 字典树
- android Listview,gridview局部刷新,部分刷新
- JObject 排序操作
- tinyhttpd源码详解
- ZStack-CC2530-2.3.0-1.4.0中simpleApp函数中led的驱动