Files
2026-07-02 10:11:39 +00:00

411 lines
17 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
/// <summary>
/// 下载验证
/// </summary>
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);
}
/// <summary>
/// 浏览器初始化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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<string> qpLS = new List<string>();
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;
}
/// <summary>
/// winform键盘事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
}
/// <summary>
/// 下载文件
/// </summary>
/// <param name="url"></param>
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 目录中文件到软件运行目录。");
}
}
/// <summary>
/// <para>说明:定义服务器文件地址,含文件名。客户端接收地址及文件名由客户端自行定义</para>
/// <para>创建人:王一帆</para>
/// <para>创建日期: </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="URL">The URL.</param>
/// <param name="FileName">Name of the file.</param>
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<string>(
(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.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("截图失败,返回空。");
}
}
catch (Exception ex)
{
string Message = ErrorMessage.PromptErrorMessage(ex);
MessageUtil.Show(Message, ex.Message);
}
}
}
}