You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

674 lines
24 KiB

using IOTContainer.Common;
using IOTContainer.Model;
using Microsoft.Web.WebView2.Core;
using Newtonsoft.Json;
using SpeechLib;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;
using static IOTContainer.Common.WinApi;
namespace IOTContainer.View
{
/// <summary>
/// EdgeWindow.xaml 的交互逻辑
/// </summary>
public partial class EdgeWindow : Window
{
private int _maxTryCount = 5;
LASTINPUTINFO _mLastInputInfo;
private DispatcherTimer _timer = null;
//倒计时
public DispatcherTimer CountdownTimer;
public EdgeWindow()
{
try
{
InitializeComponent();
if (!HasInstallWebview2())
{
this.Close();
return;
}
this.Top = 0;
this.Left = 0;
this.WindowState = WindowState.Maximized;
this.Height = SystemParameters.PrimaryScreenHeight;
this.Width = SystemParameters.PrimaryScreenWidth;
ComParameters.Parameters.EdgeWindow = this;
#region 定时器
//_mLastInputInfo =new LASTINPUTINFO();
//_mLastInputInfo.cbSize = Marshal.SizeOf(_mLastInputInfo);
//InitTimer();
#endregion
//CheckAndPlay();
CreateWebView();
Exit exit = new Exit();
exit.Show();
WinApi.FindSetTop(null, "Exit");
}
catch (Exception ex)
{
Log.MyLog.WriteLogFile($"Edge初始化出错:{ex}", "EdgeError");
}
}
#region 事件
private async void Window_Closed(object sender, EventArgs e)
{
ComParameters.Parameters.EdgeWindow = null;
Exit exit = new Exit();
exit.Close();
if (null != webView && null != webView.CoreWebView2)
{
webView.CoreWebView2.Stop();
await webView.CoreWebView2.Profile.ClearBrowsingDataAsync();
//webView.Dispose();
}
}
#endregion
#region 逻辑方法
/// <summary>
/// 有节目才出信发 没节目则一直在导视
/// </summary>
public void CheckAndPlay()
{
if (!ComParameters.Parameters.IsPlay)
{
try
{
List<ScheduleModel> result = HttpComm.Http.GetResource();
if (result == null || result.Count == 0)
{
//如果没有节目,则继续展示导视
ComParameters.Parameters.EdgeWindow.LeaveScreenSave();
return;
}
else
{
result = result.Where(i => Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " " + i.endTime) > DateTime.Now).OrderBy(i => i.beginTime).ToList();
if (result != null && result.Count > 0)
{
if (Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " " + result[0].beginTime) <= DateTime.Now)
{
ComParameters.Parameters.IsPlay = true;
this.Dispatcher.Invoke(() =>
{
var screenview = new ScreenWindowNew(0);
screenview.Show();
WinApi.FindSetTop(null, "ScreenWindowNew");
});
}
else
{
ComParameters.Parameters.EdgeWindow.LeaveScreenSave();
}
}
else
{
ComParameters.Parameters.EdgeWindow.LeaveScreenSave();
}
}
}
catch (Exception ex)
{
Log.MyLog.WriteLogFile("CheckAndPlay:" + ex.ToString(), "ScreenWindowNew");
}
}
//if (!ComParameters.Parameters.IsPlay)
//{
// List<ProgrammeModel> pro = null;
// List<SubtitleModel> sub = null;
// var now = DateTime.Now;
// ComParameters.rwl.EnterReadLock();
// var content = FileManage.ReadJsonFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Programme", "ProgrammeList.txt"));//普通节目
// ComParameters.rwl.ExitReadLock();
// if (!string.IsNullOrEmpty(content))
// {
// pro = JsonConvert.DeserializeObject<List<ProgrammeModel>>(content);
// pro = pro.Where(p => p.LaunchTime <= now && p.ExpiryDate >= now).ToList();
// }
// ComParameters.srwl.EnterReadLock();
// var subcontent = FileManage.ReadJsonFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Programme", "SubtitleList.txt"));//字幕
// ComParameters.srwl.ExitReadLock();
// if (!string.IsNullOrEmpty(subcontent))
// {
// sub = JsonConvert.DeserializeObject<List<SubtitleModel>>(subcontent);
// sub = sub.Where(p => p.startTime <= now && p.endTime >= now).ToList();
// }
// if ((pro != null && pro.Any()) || (sub != null && sub.Any()))
// {
// if (!ComParameters.Parameters.IsPlay)
// {
// ComParameters.Parameters.IsPlay = true;
// this.Dispatcher.Invoke(() =>
// {
// var scerrnview = new ScreenWindowNew();
// scerrnview.Show();
// });
// }
// }
//}
}
private void LongDetect(object sender,EventArgs e)
{
if (WinApi.GetLastInputInfo(ref _mLastInputInfo))
{
if ((Environment.TickCount - (long)_mLastInputInfo.dwTime)> ComParameters.Parameters.totalNoTouchSeconds)
{
CheckAndPlay();
}
}
}
private void InitTimer()
{
_timer = new DispatcherTimer();
_timer.Tick += new EventHandler(LongDetect);
_timer.Interval = TimeSpan.FromSeconds(1);
_timer.Start();
}
public void StartNewTimer()
{
if (null != _timer && _timer.IsEnabled == false)
{
_timer.Start();
}
}
public void StopTimer()
{
if (null != _timer && _timer.IsEnabled == true)
{
_timer.Stop();
}
}
#endregion
#region 内部方法
public async void CreateWebView()
{
try
{
#region 启动导视网页
webView.CoreWebView2InitializationCompleted += WebView_CoreWebView2InitializationCompleted;
//--incognito 隐私模式 --kiosk 大屏导视模式 开发人员要调试 就取消了 --disable-pinch 禁用缩放
//var env = await CoreWebView2Environment.CreateAsync(null, null, new CoreWebView2EnvironmentOptions(additionalBrowserArguments: "--remote-debugging-port=9221 --incognito --kiosk --disable-pinch"));
//var env = await CoreWebView2Environment.CreateAsync(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "WebView2"), null, new CoreWebView2EnvironmentOptions(additionalBrowserArguments: "--remote-debugging-port=9221 --disable-web-security", allowSingleSignOnUsingOSPrimaryAccount:true));
var env = await CoreWebView2Environment.CreateAsync(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "WebView2"), null, new CoreWebView2EnvironmentOptions(additionalBrowserArguments: "google-chrome --remote-debugging-port=9221 --remote-debugging-address=0.0.0.0 --disable-web-security", allowSingleSignOnUsingOSPrimaryAccount: true));
//var env = await CoreWebView2Environment.CreateAsync(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "WebView2"), null, null);
//var env = await CoreWebView2Environment.CreateAsync();
await webView.EnsureCoreWebView2Async(env);
webView.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false;//取消右键
webView.CoreWebView2.Settings.IsZoomControlEnabled = false;//取消缩放
webView.CoreWebView2.Settings.IsPinchZoomEnabled = false;//取消捏合缩放
webView.CoreWebView2.Settings.IsGeneralAutofillEnabled = false;//取消自动填充
webView.CoreWebView2.Settings.IsPasswordAutosaveEnabled = false;//取消密码自动保存
webView.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false;//禁用右键菜单
webView.CoreWebView2.Settings.IsScriptEnabled = true;//启用js脚本
//webView.CoreWebView2.Settings.IsStatusBarEnabled = true;
//webView.CoreWebView2.WebMessageReceived += CoreWebView2_WebMessageReceived;
webView.CoreWebView2.ProcessFailed += CoreWebView2_ProcessFailed;
#endregion
}
catch (Exception ex)
{
if (_maxTryCount > 0)
{
_maxTryCount -= 1;
CreateWebView();
}else
{
ExternalCall.StartExplorer();
Log.MyLog.WriteLogFile($"打开WebView2浏览器出错:{ex}", "EdgeError");
Environment.Exit(0);
}
}
}
//private void CoreWebView2_WebMessageReceived(object sender, CoreWebView2WebMessageReceivedEventArgs e)
//{
// var jo = JObject.Parse(e.WebMessageAsJson);
//}
private void WebView_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
try
{
if (null != webView && null != webView.CoreWebView2)
{
//调用方法js:csobj_sync.EnterScreenSaver() 或 await csobj.EnterScreenSaver()
//注册csobj脚本c#互操作
webView.CoreWebView2.AddHostObjectToScript("csobj", new ScriptCallbackObject());
//注册全局变量csobj
webView.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync("var csobj = window.chrome.webview.hostObjects.csobj;");
webView.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync("var csobj_sync = window.chrome.webview.hostObjects.sync.csobj;");
webView.CoreWebView2.SetVirtualHostNameToFolderMapping("navigation", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "www"), CoreWebView2HostResourceAccessKind.Allow);
Thread.Sleep(3000);
webView.CoreWebView2.Navigate("http://navigation/index.html");
//webView.Source = new Uri("http://192.168.1.114:5500/index.html");
}
}
catch (Exception ex)
{
Log.MyLog.WriteLogFile($"打开应用出错:{ex}", "EdgeError");
}
}
//离开屏保
public async void LeaveScreenSave()
{
if (webView != null && webView.CoreWebView2 != null)
{
try
{
Log.MyLog.WriteLogFile($"离开屏保", "EdgeFunction");
await webView.CoreWebView2.ExecuteScriptAsync("leaveScreenSave()");
}
catch (Exception ex)
{
Log.MyLog.WriteLogFile($"LeaveScreenSave:{ex}", "EdgeError");
}
}
}
//发送语音消息
public async void SendVoiceMsg(string VoiceMsg)
{
try
{
Log.MyLog.WriteLogFile($"发送语音:{VoiceMsg}", "EdgeFunction");
await webView.CoreWebView2.ExecuteScriptAsync($"voiceContent('{VoiceMsg}')");
IflytekSpecch.iflyteSpeech.stopVoice();
}
catch (Exception ex)
{
Log.MyLog.WriteLogFile($"SendVoiceMsg:{ex}", "EdgeFunction");
}
}
public void SendVoiceMsgBaidu(string VoiceMsg)
{
try
{
Log.MyLog.WriteLogFile($"发送语音:{VoiceMsg}", "EdgeFunction");
this.Dispatcher.Invoke(new Action(() =>
{
webView.CoreWebView2.ExecuteScriptAsync($"voiceContent('{VoiceMsg}')");
}));
}
catch (Exception ex)
{
Log.MyLog.WriteLogFile($"SendVoiceMsg:{ex}", "EdgeFunction");
}
}
//发送视频流
public void pushFaceBase(string FaceData)
{
try
{
this.Dispatcher.Invoke(new Action(() =>
{
//Log.MyLog.WriteLogFile($"发送视频流:{FaceData}", "EdgeFunction");
webView.CoreWebView2.ExecuteScriptAsync($"pushFaceBase('{FaceData}')");
}));
}
catch (Exception ex)
{
Log.MyLog.WriteLogFile($"pushFaceBase:{ex}", "EdgeFunction");
}
}
private void CoreWebView2_ProcessFailed(object sender, CoreWebView2ProcessFailedEventArgs e)
{
Log.MyLog.WriteLogFile("WebView2进程错误:" + e.ToString(), "WebView2Error") ;
Reload();
Activate();
//if (_maxTryCount > 0)
//{
// _maxTryCount -= 1;
// CreateWebView();
//}
}
/// <summary>
/// 检测浏览器运行环境是否安装
/// </summary>
/// <returns></returns>
public static bool HasInstallWebview2()
{
string result = "";
try
{
result = CoreWebView2Environment.GetAvailableBrowserVersionString(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "WebView2"));
}
catch (System.Exception)
{
}
if (result == "" || result == null)
{
return false;
}
return true;
}
/// <summary>
/// 浏览器重新加载
/// </summary>
public async void Reload()
{
if (null != webView && null != webView.CoreWebView2)
{
webView.CoreWebView2.Reload();
await webView.CoreWebView2.Profile.ClearBrowsingDataAsync();
}
//else
//{
// SystemManage.CloseProgress("chrome");
// ExternalCall.RunCmdComm(ComParameters.Parameters.CmdChrome);
//}
}
/// <summary>
/// 挂起网页以减少内存使用
/// </summary>
/// <returns></returns>
public async Task<bool> SuspendCore()
{
bool result = false;
if (null != webView && null != webView.CoreWebView2)
{
result = await webView.CoreWebView2.TrySuspendAsync();
}
return result;
}
/// <summary>
/// 判断网页是否挂起
/// </summary>
/// <returns></returns>
public bool IsSuspendCore()
{
bool result = false;
if (null != webView && null != webView.CoreWebView2)
{
result = webView.CoreWebView2.IsSuspended;
}
return result;
}
/// <summary>
/// 激活网页
/// </summary>
public void ResumeCore()
{
if (null != webView && null != webView.CoreWebView2)
{
webView.CoreWebView2.Resume();
}
}
/// <summary>
/// 应用启动是否正常判断,配合detectOnline()方法
/// </summary>
int Countdown = 15;
private void Countdown_timer()
{
CountdownTimer = new DispatcherTimer() { IsEnabled = true, Interval = TimeSpan.FromSeconds(1) };
CountdownTimer.Tick += new EventHandler((sender, e) =>
{
if (--Countdown < 0)
{
Reload();
}
});
}
#region 通信类
/// <summary>
/// 发送Message
/// </summary>
/// <param name="message"></param>
public void SendString(string message)
{
if (null != webView && null != webView.CoreWebView2)
{
webView.CoreWebView2.PostWebMessageAsString(message);
}
}
/// <summary>
/// 发送Json
/// </summary>
/// <param name="message"></param>
public void SendJson(string json)
{
if (null != webView && null != webView.CoreWebView2)
{
webView.CoreWebView2.PostWebMessageAsJson(json);
}
}
/// <summary>
/// 调用JS代码(可直接执行定义好的方法)
/// </summary>
/// <param name="message"></param>
public async void ExecuteJSScriptAsync(string script)
{
if (null != webView && null != webView.CoreWebView2)
{
await webView.CoreWebView2.ExecuteScriptAsync(script);
}
}
#endregion
#endregion
}
/// <summary>
/// 数据交互的类
/// </summary>
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public class ScriptCallbackObject
{
//提供设备信息
public string deviceInfo()
{
var dic = new Dictionary<string, string>();
dic.Add("width", SystemParameters.PrimaryScreenWidth.ToString());
dic.Add("height", SystemParameters.PrimaryScreenHeight.ToString());
dic.Add("ip", SystemManage.GetLocalIp());
dic.Add("mac", SystemManage.GetMac());
dic.Add("code", ComParameters.Parameters.devCode);
dic.Add("serverIP", ComParameters.Parameters.httpServer);
return JsonConvert.SerializeObject(dic);
}
//屏保跳转
public void goScreenSave()
{
IntPtr Win = FindWindow(null, "ScreenWindowNew");
if (Win == null || Win == IntPtr.Zero)
{
ComParameters.Parameters.EdgeWindow?.Dispatcher.Invoke(() =>
{
Log.MyLog.WriteLogFile($"进入屏保", "EdgeFunction");
ComParameters.Parameters.EdgeWindow.CheckAndPlay();
});
}
else
{
WinApi.FindSetTop(null, "ScreenWindowNew");
}
}
//判断有没有节目
public bool hasProgram()
{
try
{
List<ScheduleModel> result = HttpComm.Http.GetResource();
if (result == null || result.Count == 0)
{
return false;
}
return true;
}
catch (Exception ex)
{
Log.MyLog.WriteLogFile("CheckAndPlay:" + ex.ToString(), "ScreenWindowNew");
return true;
}
}
//开始语音识别
private bool initVoice = false;
public void startVoice()
{
#region 科大语音
//if (!initVoice)
//{
// initVoice = true;
// IflytekSpecch.iflyteSpeech.InitSpeech();
//}
//IflytekSpecch.iflyteSpeech.startVoice();
#endregion
#region 百度语音
BaiduSpeechForWebApi.baiduSpeechForWebApi.startVoice();
#endregion
}
//结束语音识别
public void stopVoice()
{
#region 科大语音
//IflytekSpecch.iflyteSpeech.stopVoice();
#endregion
#region 百度语音
BaiduSpeechForWebApi.baiduSpeechForWebApi.stopVoice();
#endregion
}
//程序退出功能
public void exitIOTContainer()
{
ExternalCall.CheckStartExplorer();
Environment.Exit(0);
}
//守护导视进程
public bool detectOnline()
{
var web = new EdgeWindow();
web.CountdownTimer.IsEnabled = false;
return true;
}
//语音播报
public void TTS(string testSpeech)
{
try
{
SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
SpVoice Voice = new SpVoice();
Voice.Speak(testSpeech, SpFlags);
}
catch (Exception ex)
{
Log.MyLog.WriteLogFile($"语音播报出错:{ex}", "EdgeError");
}
}
//开启人脸功能
private bool initFace = false;
public void startFace()
{
Task.Run(() =>
{
try
{
if (!initFace)
{
initFace = true;
//百度SDK初始化
BaiduFace.SDK.Init();
BaiduFace.SDK.USBVideoTract();
}
FaceParameters.Parameters._isOpenLive = true;
if (!FaceParameters.Parameters.isInit)
{
var faceData = new FaceSendModel
{
age = 28,
genderMale = "男",
vipId = "",
faceID = "",
carNo = "",
isOK = "1",
faceImage = ""
};
//主要逻辑
Thread.Sleep(20000);
ComParameters.Parameters.EdgeWindow.pushFaceBase(JsonConvert.SerializeObject(faceData));
}
}
catch (Exception ex)
{
Log.MyLog.WriteLogFile($"开启人脸功能出错:{ex}", "EdgeError");
var faceData = new FaceSendModel
{
age = 28,
genderMale = "男",
vipId = "",
faceID = "",
carNo = "",
isOK = "1",
faceImage = ""
};
Thread.Sleep(20000);
ComParameters.Parameters.EdgeWindow.pushFaceBase(JsonConvert.SerializeObject(faceData));
}
});
}
//结束人脸功能
public void stopFace()
{
try
{
Log.MyLog.WriteLogFile($"结束人脸功能", "EdgeFunction");
FaceParameters.Parameters._isOpenLive = false;
//IntPtr Win = FindWindow(null, "face");
//if (Win != null && Win != IntPtr.Zero)
//{
// SendMessage(Win, WM_CLOSE, 0, 0);
//}
}
catch (Exception ex)
{
Log.MyLog.WriteLogFile($"结束人脸功能出错:{ex}", "EdgeError");
}
}
public void WriteLog(string text)
{
Log.MyLog.WriteLogFile(text, "Kiosk");
}
}
}