基于Cef内核的多店铺登录器(含源码)

简介: 公司是做电商的,在速卖通平台上开了若干店铺,每天都需要登录店铺打理,如:发货提交、获取运单号等。多个店铺的情况下,同时使用浏览器就会非常繁琐,如:要记住帐户名和密码,还要在不同店铺间切换。

        公司是做电商的,在速卖通平台上开了若干店铺,每天都需要登录店铺打理,如:发货提交、获取运单号等。多个店铺的情况下,同时使用浏览器就会非常繁琐,如:要记住帐户名和密码,还要在不同店铺间切换。如果能够制作一个多店铺登录器,就可以解决上述问题。好了,背景描述完毕,下面开干

        首先想到的是微信原生的WebBrowser组件,第一轮开发结束测试,发现帐户间会互相干扰,就是店铺A登录成功后,再登录店铺B的话,店铺A的数据会被冲掉。此控件直接pass,继续新尝试

        后来又找到一个将WebBrowser二次封装的控件,好像不能解决弹出页面,第二轮也宣告失败,继续尝试

        第三轮,尝试使用Cef控件,这是基于Google浏览器的内核,开发完成测试,发现基本能满足所要求的功能

        先来看看界面是啥样子?

clip_image002

代码本身并不多,关键的技术点有以下

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

  

核心代码就是这些,程序本身已经封装成一个产品,使用方法参考下面的地址,而且永久免费!!!

登录器下载地址

 

相关文章
|
安全 Java 关系型数据库
VOS30007.03安装及源码命令
一、系统需求环境:     1.系统  :linux 64位系统     2.内核要求:内核2.6 以上     3.内存   :2G以上内存     4.系统要求:centos6.X 或者 redhat5.X (笔者用的centos5.6_64, 最好用centos6.6)     5.java环境:java version "1.5.0_08"     6.web环境 :apache-tomcat-5.5.15     7.数据库 :mysql
1259 0
|
2月前
|
Linux
百度搜索:蓝易云【深入解析Linux进程内存:VSS、RSS、PSS、USS及查看方式】
通过以上方法,你可以深入了解Linux进程的内存使用情况,包括VSS、RSS、PSS、USS等指标,帮助你进行性能优化和资源管理。
41 12
|
4月前
|
Linux
百度搜索:蓝易云【Linux route命令实战:route 命令实战教程,配置静态路由,删除路由表项】
通过按照上述步骤配置静态路由和删除路由表项,您可以有效地管理Linux系统的网络路由。请根据实际需求和网络配置进行操作,并确保在执行任何更改之前仔细验证和确认。
46 0
|
4月前
|
C语言 Windows
9.3 Windows驱动开发:内核解析PE结构节表
在笔者上一篇文章`《内核解析PE结构导出表》`介绍了如何解析内存导出表结构,本章将继续延申实现解析PE结构的PE头,PE节表等数据,总体而言内核中解析PE结构与应用层没什么不同,在上一篇文章中`LyShark`封装实现了`KernelMapFile()`内存映射函数,在之后的章节中这个函数会被多次用到,为了减少代码冗余,后期文章只列出重要部分,读者可以自行去前面的文章中寻找特定的片段。
26 0
9.3 Windows驱动开发:内核解析PE结构节表
|
6月前
|
人工智能 并行计算 Linux
Cloud Kernel SIG 月度动态:发布多个 ANCK 版本,引入多个第三方硬件驱动
Cloud Kernel SIG 月度动态送达,一键了解 9 月各项目进展。
|
7月前
|
运维 网络协议 测试技术
iOS 自己搭建的IPv6环境测试正常,任然被拒
iOS 自己搭建的IPv6环境测试正常,任然被拒
49 0
|
8月前
|
算法 JavaScript Apache
全网显示 IP 归属地,用上这个开源库,实现也太简单了
细心的小伙伴可能会发现,最近蘑菇新上线了 IP 属地的功能,小伙伴在发表动态、发表评论以及聊天的时候,都会显示自己的 IP 属地信息
206 0
|
存储 块存储
AD2428W手册解读之模块ID和模块配置内存
AD2428W手册解读之模块ID和模块配置内存
AD2428W手册解读之模块ID和模块配置内存
|
消息中间件 存储 缓存
【PCIe页请求服务】到底到底到底是啥?半年搜遍全网找不到一篇介绍文章,没人写那我来写吧
【PCIe页请求服务】到底到底到底是啥?半年搜遍全网找不到一篇介绍文章,没人写那我来写吧
833 0
【PCIe页请求服务】到底到底到底是啥?半年搜遍全网找不到一篇介绍文章,没人写那我来写吧
|
机器学习/深度学习 Linux 网络架构
linux中route命令超详细用法(十五万字)
本篇内容记录了linux中route命令的详细用法。
703 0