基於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

  

核心代碼就是這些,程序本身已經封裝成一個產品,使用方法參考下面的地址,而且永久免費!!!

登錄器下載地址

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM