using MiniBlinkPinvoke; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Windows.Forms; using Lskj.Control.Model; using Lskj.Model; using Lskj.Business.Impl; using Lskj.Util; using System.Web; using Lskj.Business; using Lskj.Control; using Lskj.Web.Core.Util; using System.Collections; using System.Linq; namespace Lskj.MiniBlink { public partial class FormMain : Form { public DynamicPubNewBrowerModel PubBrowerModel; BlinkBrowser blinkBrowser1 = null; static BlinkBrowser mb = null; public string url = string.Empty; /// /// 下载验证 /// public bool IsDownVerify = false; public FormMain() { InitializeComponent(); } //System.Windows.Forms.Timer queryTimer = new System.Windows.Forms.Timer(); private IntPtr taskPtr; XL.DownTaskInfo taskInfo = new XL.DownTaskInfo(); [JSFunctin] public void Console_WriteLine(string msg) { MessageBox.Show("Console_WriteLine :" + msg); } /// /// 浏览器初始化 /// /// /// private void Form1_Load(object sender, EventArgs e) { WaitForm.ShowForm(); try { if (PubBrowerModel.isCalSize) { this.Height = Convert.ToInt32(Lskj.Main.Model.Manager.frmHeight * PubBrowerModel.PerHeight); this.Width = Convert.ToInt32(Screen.PrimaryScreen.WorkingArea.Width * PubBrowerModel.PerWidth); this.Location = new Point((Screen.PrimaryScreen.WorkingArea.Width - this.Width) / 2, (Lskj.Main.Model.Manager.frmHeight - this.Height) / 2); } this.PubBrowerModel.Privilege = PubBrowerModel.ModuleId > 0 ? BaseImpl.GetUserPurviewsByMenuId(PubBrowerModel.ModuleId + "") + "" : BaseImpl.GetUserPurviewsByMenuCode(PubBrowerModel.ModuleCode) + ""; string urlEnd = string.IsNullOrEmpty(PubBrowerModel.UrlParame) ? ReplaceHelper.ReplaceUserInfo(PubBrowerModel.ModuleCode) : PubBrowerModel.UrlParame.StartsWith("http") ? ReplaceHelper.ReplaceUserInfo(PubBrowerModel.UrlParame) : HttpUtility.UrlEncode(PubBrowerModel.UrlParame); url = PubBrowerModel.BetweenDLLCoid != null && PubBrowerModel.BetweenDLLCoid.StartsWith("http") ? PubBrowerModel.BetweenDLLCoid + urlEnd : urlEnd.StartsWith("http") ? PubBrowerModel.BetweenDLLCoid + urlEnd : SystemInfo.Instance.OAUrl + PubBrowerModel.BetweenDLLCoid + urlEnd; bool downLoadFlag = this.PubBrowerModel.downLoadFlag == 1; int RightKeyFlag = this.PubBrowerModel.RightKeyFlag; if (downLoadFlag) { this.Close(); url = url.Replace("%2f", "/"); WebBrowser browserNew = new WebBrowser();//点击下载的页面 browserNew.Navigate(url); } else { this.Opacity = 100D; blinkBrowser1 = new BlinkBrowser(); blinkBrowser1.GlobalObjectJs = this; mb = blinkBrowser1; blinkBrowser1.Dock = DockStyle.Fill; Neghte(url); this.Controls.Add(blinkBrowser1); } } catch (Exception ex) { LogHelper.Instance.WriteError(ex, "浏览器dll"); //MessageUtil.Show(ex.Message + "\r\n" + ex.StackTrace); string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); } finally { Lskj.Control.Model.AutoSizeChange.ControllInitializeSize(this); } WaitForm.HideForm(); } public void Neghte(string url) { //BlinkBrowserPInvoke.wkeSetHandle(blinkBrowser1.handle, this.Handle); //BlinkBrowserPInvoke.wkeSetHandleOffset(blinkBrowser1.handle, blinkBrowser1.Location.X-2,0); blinkBrowser1.OnUrlChange2Call += BlinkBrowser1_OnUrlChange2Call; blinkBrowser1.OnTitleChangeCall += BlinkBrowser1_OnTitleChangeCall; blinkBrowser1.DocumentReadyCallback += BlinkBrowser1_DocumentReadyCallback; blinkBrowser1.OnDownloadFile += BlinkBrowser1_OnDownloadFile; this.url = url; blinkBrowser1.Url = ToEnUrl(url); // blinkBrowser1.Focus(); } public static string ToEnUrl(string url) { string[] urlParams = url.Split('?'); string enKey = "encrypt", enVal = ""; bool hasEn = false; if (urlParams.Length > 1) { string[] queryParams = urlParams[1].Split('&'); List qpLS = new List(); Hashtable pms = new Hashtable(); hasEn = queryParams.Any(str => str.Trim().StartsWith(enKey, StringComparison.OrdinalIgnoreCase)); foreach (string q in queryParams) { string[] eqParams = q.Split('='); if (eqParams.Length > 1) { if (hasEn && eqParams[0].ToLower() == enKey) { enVal = eqParams[1]; continue; } if (hasEn || eqParams[0].ToLower() == "username" || eqParams[0].ToLower() == "password") { pms.Add(eqParams[0], eqParams[1]); } else { qpLS.Add(string.Format("{0}={1}", eqParams[0], HttpUtility.UrlEncode(eqParams[1]))); } } else { } } if (pms.Count > 0) { DateTime dateTime = DateTime.Now.AddDays(1); DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); long timestamp = (dateTime.Ticks - epoch.Ticks) / TimeSpan.TicksPerSecond; pms.Add("exp", timestamp); } return $"{urlParams[0]}?pms={HttpUtility.UrlEncode(hasEn ? Lskj.Web.Core.Util.safety.AESUtil.Encrypt(JSON.Encode(pms), enVal) : Lskj.Web.Core.Util.safety.AESUtil.MobileEncrypt(JSON.Encode(pms)))}&{qpLS.SJoin("&")}"; } return url; } /// /// winform键盘事件 /// /// /// private void Form1_KeyDown(object sender, KeyEventArgs e) { try { //截屏 if (e.Control && e.Shift && e.KeyCode == Keys.C) { IntPtr mainFrameId = BlinkBrowserPInvoke.wkeWebFrameGetMainFrame(blinkBrowser1.handle); int width = BlinkBrowserPInvoke.wkeGetContentWidth(blinkBrowser1.handle); int height = BlinkBrowserPInvoke.wkeGetContentHeight(blinkBrowser1.handle); wkeScreenshotSettings settings = new wkeScreenshotSettings { height = height, width = width }; settings.structSize = System.Runtime.InteropServices.Marshal.SizeOf(settings); var bf = BlinkBrowserPInvoke.wkePrintToBitmap(blinkBrowser1.handle, mainFrameId, settings); if (bf != IntPtr.Zero) { var data = (wkeMemBuf)Marshal.PtrToStructure(bf, typeof(wkeMemBuf)); if (data.data != IntPtr.Zero && data.length != 0) { byte[] ys = new byte[data.length]; Marshal.Copy(data.data, ys, 0, ys.Length); string fileName = Guid.NewGuid().ToString("n") + ".bmp"; System.IO.File.WriteAllBytes(fileName, ys); MessageBox.Show("截图保存成功,图片地址为:" + Application.StartupPath + "\\" + fileName); } else { MessageBox.Show("截图失败,数据解析失败。"); } } else { MessageBox.Show("截图失败,返回空。"); } } // 打开调试工具 if (e.KeyCode == Keys.F12) { blinkBrowser1.ShowDevtools(Application.StartupPath + @"\front_end\inspector.html"); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); } } /// /// 下载文件 /// /// private void BlinkBrowser1_OnDownloadFile(string url) { //只是简单实现下载,可以模仿其他下载界面,先弹出一个窗体,让用户选择保存路径文件名什么的。 //使用前先拷贝 libs/XL 目录中文件到软件运行目录。 if (File.Exists("xldl.dll")) { var initSuccess = XL.XL_Init(); if (initSuccess) { XL.DownTaskParam p = new XL.DownTaskParam() { IsResume = 0, szTaskUrl = url, szFilename = url.Substring(url.LastIndexOf('/') + 1),//简单处理文件名,实际中还需要单独处理,这里有BUG szSavePath = AppDomain.CurrentDomain.BaseDirectory }; string SzFileName = HttpUtility.UrlDecode(p.szFilename); string[] szName = SzFileName.Split('/'); taskPtr = XL.XL_CreateTask(p); var startSuccess = XL.XL_StartTask(taskPtr); if (startSuccess) { string fileTitle = szName[szName.Length - 1]; DataRow rowItem = AttachImpl.GetTempletFile(fileTitle); if (IsDownVerify) { if (rowItem != null) { Download(p.szTaskUrl, fileTitle); } else { MessageBox.Show("未找到下载项"); } } else { Download(p.szTaskUrl, fileTitle); } } } else { MessageBox.Show("XL_Init初始化失败"); } } else { MessageBox.Show("请先将 libs/XL 目录中文件到软件运行目录。"); } } /// /// 说明:定义服务器文件地址,含文件名。客户端接收地址及文件名由客户端自行定义 /// 创建人:王一帆 /// 创建日期: /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The URL. /// Name of the file. public static void Download(string URL, string FileName) { FrmSelectDownload frmSelectDownload = new FrmSelectDownload(); frmSelectDownload.URL = URL; frmSelectDownload.FileName = FileName; frmSelectDownload.Show(); //SaveFileDialog saveFileDialog = new SaveFileDialog(); //saveFileDialog.FileName = FileName; //saveFileDialog.Title = "下载模板文件到"; //saveFileDialog.RestoreDirectory = true; ////点了保存按钮进入 //if (saveFileDialog.ShowDialog() == DialogResult.OK) //{ // string localFilePath = System.IO.Path.GetFullPath(saveFileDialog.FileName);//获得文件路径,含文件名 // string fileNameExt = localFilePath.Substring(localFilePath.LastIndexOf("\\") + 1);//获取文件名,不带路径 // string FilePath = localFilePath.Substring(0, localFilePath.LastIndexOf("\\"));//获取文件路径,不带文件名 // FrmDownload frm = new FrmDownload(URL, FileName, localFilePath); // frm.Show(); //} } //[JSFunctin] //public static async void DOTaskWithAsync(string str) //{ // await Task.Run(() => // { // Dotaskfunction(str); // }); //} public static void Dotaskfunction(string s) { Thread.Sleep(1000 * 5); if (mb != null) { mb.Invoke(new Action( (sx) => { string _str = "ceshi" + sx; _str = System.Web.HttpUtility.UrlEncode(_str); string invokeJSStr = "asyncTest('" + _str + "')"; mb.InvokeJS(invokeJSStr); } ), s); } } private void BlinkBrowser1_DocumentReadyCallback() { } private void BlinkBrowser1_OnTitleChangeCall(string title) { Text = title; } private void BlinkBrowser1_OnUrlChange2Call(string url) { this.url = url; } private void button2_Click(object sender, EventArgs e) { try { blinkBrowser1.ShowDevtools(Application.StartupPath + @"\front_end\inspector.html"); //MiniBlinkPinvoke.BlinkBrowserPInvoke.wkeSetDebugConfig(blinkBrowser1.handle, "showDevTools", Application.StartupPath + @"\front_end\inspector.html"); } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); } } private void button3_Click(object sender, EventArgs e) { try { IntPtr mainFrameId = BlinkBrowserPInvoke.wkeWebFrameGetMainFrame(blinkBrowser1.handle); int width = BlinkBrowserPInvoke.wkeGetContentWidth(blinkBrowser1.handle); int height = BlinkBrowserPInvoke.wkeGetContentHeight(blinkBrowser1.handle); wkeScreenshotSettings settings = new wkeScreenshotSettings { height = height, width = width }; settings.structSize = System.Runtime.InteropServices.Marshal.SizeOf(settings); var bf = BlinkBrowserPInvoke.wkePrintToBitmap(blinkBrowser1.handle, mainFrameId, settings); if (bf != IntPtr.Zero) { var data = (wkeMemBuf)Marshal.PtrToStructure(bf, typeof(wkeMemBuf)); if (data.dat