在Winform中屏蔽UnityWebPlayer的右键以及自带Logo解决方案整理
根据项目的需要,对已经完成的Unity三维模型以及游戏要使用Winform进行包装,也就是使用Winform做一层外壳。因此在展示Unity的时候使用到了UnityWebPlayer这个插件,对于此插件就不多说了,无论是想把Unity嵌在网页中还是winform中都要使用到。
网上很多资料是在Web中使用Unity的,很自然的把Unity发布成Web类型,在此如何在Web中使用Unity也就不多说了,重点是解决在winform中使用Unity出现的插件自带的右键问题以及Logo问题。
一、winform中使用Unity
在winform中使用Unity,同样是像网页形式把做好的Unity发布成Web类型,然后直接使用文件格式为.unity3d的文件。把Unity文件的路径赋值给UnityWebplayer的src属性即可,对于动态赋值,从网上找到如下方法:
/// <summary>
/// 实例化UnitywebPlayer控件并添加到界面上
/// </summary>
/// <param name="panel">承载unity的控件</param>
/// <param name="unityfileServerpath">服务端路径</param>
public void BindUnity(Panel panel,string unityfileServerpath)
{
if (panel.Controls.Count > )
{
panel.Controls[].Dispose();
}
panel.Controls.Clear();
///指定空的Unity3D,用来做外壳
string unityfilepath = Application.StartupPath + unityfileServerpath;//"/U3D/LoadAsset.unity3d";
unityex = new UnityWebPlayerEx();
((System.ComponentModel.ISupportInitialize)(unityex)).BeginInit();
this.Controls.Add(unityex);
((System.ComponentModel.ISupportInitialize)(unityex)).EndInit();
unityex.src = unityfilepath;
AxHost.State state = unityex.OcxState;
unityex.Dispose();
unityex = new UnityWebPlayerEx();
((System.ComponentModel.ISupportInitialize)(unityex)).BeginInit();
this.SuspendLayout();
unityex.Dock = DockStyle.Fill;
unityex.Name = "Unityex";
unityex.OcxState = state;
unityex.TabIndex = ;
unityex.DisableContextMenu = true;
unityex.OnExternalCall += new AxUnityWebPlayerAXLib._DUnityWebPlayerAXEvents_OnExternalCallEventHandler(unityex_OnExternalCall);
panel.Controls.Add(unityex);
((System.ComponentModel.ISupportInitialize)(unityex)).EndInit();
this.ResumeLayout(false);
}
二、屏蔽UnityWebPlayer控件的右键问题
实现的代码如下:
class UnityWebPlayerEx : AxUnityWebPlayerAXLib.AxUnityWebPlayer
{
#region MyRegion
//private const int WM_RBUTTONDOWN = 0x204; //private const int WM_RBUTTONUP = 0x205; //private const int WM_RBUTTONBLCLK = 0x206; //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);
//}
#endregion public UnityWebPlayerEx()
{ }
[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)
{
_menuHided = false;
switch (m.Msg)
{
case WM_PARENTNOTIFY:
HideContextMenu(m);
break;
}
base.WndProc(ref m);
} /// <summary>
/// 是否隐藏右键菜单,默认还是要显示的,new出来后要设置一下
/// </summary>
public bool DisableContextMenu{ get; set; } private bool _menuHided { get; set; } 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()
{
//Unity.ContextSubmenu 为右键快键菜单的Form
IntPtr handle = FindWindow("Unity.ContextSubmenu", null);
if (handle != IntPtr.Zero)
{
//把快捷菜单Form移到左上角并设置其大小为0
MoveWindow(handle, , , , , true);
MoveWindow(handle, , , , , true);
_menuHided = true;
}
}
}
需要注意的是在关闭使用的窗体的时候需要释放Unitywebplayer所占用的资源,否则在第二次进来的点击的第一次右键还是会弹出快捷菜单。
三、遮住unitywebplayer的Logo
在网上找了很多资料,基本都是网页形式通过修改param参数来更换Logo的,但是winform中直接使用Unity文件,也就没有使用到其一起发布的js文件,所以此方式的可能性不大。一开始也还是抱着可行的态度尝试了使用C#调用js的方式,然并没有解决。在网上是在找不到方法的时候想到了一种“投机取巧”的方法:先遮住UnityWebPlayer,等加载完成后在显示出来。于是在初始化UnityWebPlayer的时候先在其上边添加一个遮挡物,遮挡物可以自定义,比如使用Panel或者自定义一个用户控件,把界面做得好看些。
//实例化遮挡物
shadeuc = new ShadeUC();
shadeuc.Name = "shadeuc1";
shadeuc.Dock = DockStyle.Fill;
//把遮罩层添加到界面
this.splitContainerEx1.Panel1.Controls.Add(shadeuc);
//遮罩层置顶以遮住底层
shadeuc.BringToFront();
接下来的一个问题是何时移除遮挡物,根据自己的项目我是在UnityWebPlayer的OnExternalCall事件中接收到Unity返回的消息时移除的,这种方式得到的效果还可以。还有一种不是太靠谱的方式是使用计时器,自定义一个时长移除遮挡物。
this.splitContainerEx1.Panel1.Controls.Remove(shadeuc);
在Winform中屏蔽UnityWebPlayer的右键以及自带Logo解决方案整理的更多相关文章
- c# winform 中的 工具栏自动隐藏 splitter用法 带源码
c# winform 中的 工具栏自动隐藏 splitter用法 带源码 代码下载地址 http://download.csdn.net/detail/simadi/7649313
- Winform中自定义添加ZedGraph右键实现设置所有Y轴刻度的上下限
场景 Winforn中实现ZedGraph自定义添加右键菜单项(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...
- Winform中怎样设置ContextMenuStrip右键菜单的选项ToolStripMenuItem添加照片
场景 怎样在Winform程序中添加鼠标右键时使子选项显示图片. 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程序猿 获取编程 ...
- 记一次WinForm中屏蔽空格键对按钮的作用
事件的起因是在做一个项目功能时,添加快捷键关闭声音,这个键最终选择了空格键,但是当按下空格键时,会把窗体中获取焦点的控件(比如按钮,文本框等)的单击事件触发,所以要屏蔽这个现象. 开始使用各种方法,在 ...
- 收藏:FLASH中键检测与右键屏蔽
原文:http://space.flash8.net/space/?591172/viewspace-708726.html <!DOCTYPE html PUBLIC "-//W3C ...
- Winform中自定义ZedGraph右键复制成功后的提示
场景 Winform中实现ZedGraph中曲线右键显示为中文: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100115292 ...
- 【HTML】如何在网页中屏蔽右键 ?
如何在网页中屏蔽右键 众所周知,要保护一个页面,最基础的就是要屏蔽右键.而现在网页上用得最多的是function click(),即下面这段代码: <script> function ...
- 在Winform中播放视频等【DotNet,C#】
在项目中遇到过这样的问题,就是如何在Winform中播放视频.当时考察了几种方式,第一种是直接使用Windows Media Player组件,这种最简单:第二种是利用DirectX直接在窗体或者控件 ...
- C#winform中ListView的使用
使用ListView模仿Windows系统的资源管理器界面,实现文件(夹)的浏览.重命名.删除及查询等功能,主要功能界面展示如下: 1.MainForm.cs及MainForm.Designer.cs ...
随机推荐
- ElementUi使用表单验证出现验证问题
问题: 使用vue element-ui中的form表单验证出现了输入框或者下拉框中明明有值, 但是却还是提示请输入或请选择,错误如下: <el-form status-icon :ref=&q ...
- canvas验证码实现
1 <!DOCTYPE html> <html> <!-- head --> <head> <meta charset="utf-8&q ...
- C++ 容器一图以蔽之
读完C++ primary 容器相关章节,有必要总结一下容器的要点,一图说明. 其中的问题,以下是我的一些想法,欢迎交流. 问题1. STL源码剖析 · vector 问题2. STL源码剖析 · R ...
- 免安装方式的Python之VSCode环境配置
概述 本文旨在介绍免安装方式,在VSCode中搭建Python(3.73)的配置环境.至于Python是什么.它能做些什么,诸如此类的介绍均不在此文中介绍,相信能看此文的人,多多少少都会有些了解. V ...
- openstack安装部署——计算服务(控制节点&计算节点)前言
1.前言Openstack计算服务通过认证服务获取认证:通过镜像服务获取镜像:通过仪表盘提供的用户界面与用户交互.镜像的存取受工程和用户的限制,配额受工程的限制(例如不同工程允许虚拟机实例数量不同). ...
- PowerBulider获取计算机mac地址
PowerBulider获取计算机mac地址 1.下载GETNET.DLL获取网络资源的API 2.PB的全局函数中的引入需要API,常用API列表如下 //得到计算机名字 function bool ...
- Vue.js面试题整理(转载)
一.什么是MVVM? MVVM是Model-View-ViewModel的缩写.MVVM是一种设计思想.Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑:View 代表UI ...
- window程序意外关闭自动重启脚本实现
@echo off : tasklist|find /i "xxxx"||start yyyy ping/n 127.1>nul 新建 .bat 文件,将其写入文件 xxxx ...
- 25-SQLServer中的DMV和DMF的使用
一.总结 1.什么事DMV和DMFDMV(Dynamic Management View):动态管理视图DMF(Dynamic Management Function):动态管理函数 二.操作步骤 1 ...
- phpstorm和ftp搭配使用
简单使用