基于Cef内核的多店铺登录器(含源码)
时间:2022-04-26
本文章向大家介绍基于Cef内核的多店铺登录器(含源码),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
公司是做电商的,在速卖通平台上开了若干店铺,每天都需要登录店铺打理,如:发货提交、获取运单号等。多个店铺的情况下,同时使用浏览器就会非常繁琐,如:要记住帐户名和密码,还要在不同店铺间切换。如果能够制作一个多店铺登录器,就可以解决上述问题。好了,背景描述完毕,下面开干
首先想到的是微信原生的WebBrowser组件,第一轮开发结束测试,发现帐户间会互相干扰,就是店铺A登录成功后,再登录店铺B的话,店铺A的数据会被冲掉。此控件直接pass,继续新尝试
后来又找到一个将WebBrowser二次封装的控件,好像不能解决弹出页面,第二轮也宣告失败,继续尝试
第三轮,尝试使用Cef控件,这是基于Google浏览器的内核,开发完成测试,发现基本能满足所要求的功能
先来看看界面是啥样子?
代码本身并不多,关键的技术点有以下
1, Winform应用启动时,args参数使用
2, 双击树控件结点时,判断此结点的地址是否已打开,若未打开,则再启动一个exe程序
3, 登录帐号和页面大小和位置能够随时记录,保证下次登录时,和上次一样
下面逐个技术点说明
1, args参数
解析代码如下
//3,打开应用程序.注:根据外部传入参数.默认登录器
//登录器格式:功能类型 内外网 登录用户 选中店铺
if (args != null && args.Length > 0)
{
//FormUIHelper.ShowMessage("args参数:" + JsonHelper.GetJsonByObject(args));
if (args.Length >= 1)
{
//默认登录器
string actionTypeTemp = args[0];
int logonType = StringHelper.ObjectToInt(actionTypeTemp, 1);
BaseHelper.ActionType = logonType;
}
if (args.Length >= 2)
{
List<string> listP = new List<string>() { "In", "Out" };
string logonType = args[1];
if (!listP.Contains(logonType))
{
logonType = "Out";
}
BaseHelper.LogonType = EnumHelper.ToEnumObject<MetaCodeEnum.LogonType>(logonType);
}
if (args.Length >= 3)
{
CurrentUserInfo.UserCode = args[2];
CurrentUserInfo.UserName = args[2];
CurrentUserInfo.UserInfo = new UserInfo()
{
UserCode = CurrentUserInfo.UserCode,
UserName = CurrentUserInfo.UserName
};
}
if (args.Length >= 4)
{
CurrentAppInfo.ShopCode = args[3];
}
if (args.Length >= 5)
{
CurrentAppInfo.ItemSnapUrl = args[4];
}
}
else
{
//默认登录器
BaseHelper.ActionType = 1;
}
调用代码如下
//若没有找到,则直接打开exe文件
string message = string.Empty;
string fileName = CurrentAppInfo.AppPath + @"" + CurrentAppInfo.AppName;
string args = BaseHelper.ActionType + " " + BaseHelper.LogonType.ToString() + " " + CurrentUserInfo.UserCode + " " + shopCode;
SystemHelper.OpenFile(fileName, args);
2, 启动exe程序
foreach (TreeNode node in treeShop.Nodes)
{
foreach (TreeNode cilNode in node.Nodes)
{
if (cilNode.Text != shopName)
{
string title = shopName + " " + cilNode.Text;
IntPtr handleID1 = SystemHelper.FindWindow(null, title);
if (handleID1.ToInt64() > 0)
{
//窗体最小化
SystemHelper.ShowWindow(handleID1, 2);
}
}
}
}
//再判断页面标题是此标题的页面是否已经打开
IntPtr handleID = SystemHelper.FindWindow(null, formTitle);
if (handleID.ToInt64() > 0)
{
//说明已经打开
SystemHelper.SwitchToThisWindow(handleID, true);
}
else
{
//若没有找到,则直接打开exe文件
string message = string.Empty;
string fileName = CurrentAppInfo.AppPath + @"" + CurrentAppInfo.AppName;
string args = BaseHelper.ActionType + " " + BaseHelper.LogonType.ToString() + " " + CurrentUserInfo.UserCode + " " + shopCode;
SystemHelper.OpenFile(fileName, args);
}
3, 记录用户配置项
#region (OK)窗体Resize,位置保存相关代码
private void FormLogonerMain_ResizeBegin(object sender, EventArgs e)
{
//窗体Resize开始,拖动调整窗体大小时触发
resizing = true;
}
private void FormLogonerMain_ResizeEnd(object sender, EventArgs e)
{
//窗体Resize结束,保存最新的窗体大小和位置
this.lonService.SetUserSettingsValue("x", this.Location.X.ToString());
this.lonService.SetUserSettingsValue("y", this.Location.Y.ToString());
this.lonService.SetUserSettingsValue("Width", this.Size.Width.ToString());
this.lonService.SetUserSettingsValue("Height", this.Size.Height.ToString());
resizing = false;
}
private void FormLogonerMain_SizeChanged(object sender, EventArgs e)
{
//窗体状态变化处理
if (WindowState == FormWindowState.Maximized)
{
this.lonService.SetUserSettingsValue("Maximize", "true");
}
else if (WindowState == FormWindowState.Normal)
{
this.lonService.SetUserSettingsValue("Maximize", "false");
if (resizing == false)
{
if (this.lonService.CheckUserConfigValue())
{
int width = int.Parse(this.lonService.GetUserSettingsValue("Width"));
int height = int.Parse(this.lonService.GetUserSettingsValue("Height"));
int x = int.Parse(this.lonService.GetUserSettingsValue("x"));
int y = int.Parse(this.lonService.GetUserSettingsValue("y"));
this.Location = new Point(x, y);
this.Size = new Size(width, height);
}
else
{
resizing = true;
string swidthRateTemp = ConfigHelper.GetAppSettingsValue("WidthRate");
string sheightRateTemp = ConfigHelper.GetAppSettingsValue("HeightRate");
double douWidthRate = StringHelper.ObjectToDouble(swidthRateTemp, 0.95);
double douHeightRate = StringHelper.ObjectToDouble(sheightRateTemp, 0.95);
FormUIHelper.SetFormSizeAndLocationCenter(this, douWidthRate, douHeightRate);
this.lonService.SetUserSettingsValue("x", this.Location.X.ToString());
this.lonService.SetUserSettingsValue("y", this.Location.Y.ToString());
this.lonService.SetUserSettingsValue("Width", this.Size.Width.ToString());
this.lonService.SetUserSettingsValue("Height", this.Size.Height.ToString());
resizing = false;
}
}
}
}
private void FormLogonerMain_Activated(object sender, EventArgs e)
{
//在窗体激活时,将蓝色的当前店铺置为选中店铺
foreach (TreeNode node in treeShop.Nodes)
{
foreach (TreeNode cilNode in node.Nodes)
{
if (cilNode.ForeColor == Color.Blue)
{
treeShop.SelectedNode = cilNode;
}
}
}
}
#endregion
核心代码就是这些,程序本身已经封装成一个产品,使用方法参考下面的地址,而且永久免费!!!
- 【Go 语言社区】Go 语言Map(集合)
- 【Go 语言社区】JavaScript Date(日期)对象
- UWP基础教程 - XAML类型转换器
- Oracle 12c Data Guard搭建(一) (r10笔记第57天)
- 【Go 语言社区】Go语言 Cookie的使用
- 【Go 语言社区】HTML5 Geolocation(地理定位)-转
- Oracle 12c PDB迁移(一)(r10笔记第56天)
- 【Go 语言社区】Go worker线程池
- Oracle 12C打补丁的简单尝试(r10笔记第55天)
- 【Go 语言社区】奇妙的go语言(网页下载)-转
- 【Go 语言社区】golang的bufio用于内容解析
- [Go语言]从Docker源码学习Go——指针和Structs - lemon_bar
- Git 项目推荐 | Go 语言读写 INI 文件工具包
- 初识Python (r10笔记第52天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android | Tangram动态页面之路(四)vlayout原理
- 基于QuestaSIM的SystemVerilog DPI使用流程(step by step)
- Android | Tangram动态页面之路(五)Tangram原理
- Android | Tangram动态页面之路(六)数据分离
- 在 mono 下使用微软的 OWIN 认证中间件
- 重温四大基础数据结构:数组、链表、队列和栈
- C# 程序在 Docker 中响应 Unix 信号
- Android | Tangram动态页面之路(七)硬核的Virtualview
- Spark SQL如何选择join策略
- 江湖事儿 | 技术人如何做好晋升准备
- Dockerfile 的 ENTRYPOINT 与 CMD
- Docker Entry Script 详解
- 使用 docker-compose 替代 docker run
- 分享给您一个快速离职的 SHELL 脚本
- ASP.NET WebAPI 中的参数绑定