Показывать диалоговое окно регистрации приложения при первом запуске и по истечении пробного периода

Я создаю приложение WPF, реализующее пробный период, используя эту библиотеку Application Trial Maker эта библиотека записывает регистрационные данные на SystemFile, но когда я внедряю ее в свой проект, она показывает диалоговое окно регистрации при каждом запуске приложения.
Я хочу, чтобы диалоговое окно регистрации отображалось только в двух сценариях:
1- сначала Выполнить: после того, как пользователь установит мое приложение. Я нашел эти 2 вопроса: проверьте первый запуск и покажите сообщение и показать диалог при первом запуске приложения, в обоих ответах используется Application.Setting и добавьте туда переменную bool, но в моем случае я хочу использовать свою Trial Maker библиотеку, также я не могу использовать Setting.Default[] внутри своей основной, потому что это non-static и я не вызываю конкретную модель представления. Я просто звоню App.Run, как вы увидите ниже.
2- по истечении пробного периода или пробежек.

Вот мой App.xaml.cs класс:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using SoftwareLocker;
using System.Globalization;
using System.Threading;

namespace PharmacyManagementSystem
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
    /// <summary>
    /// Application Entry Point.
    /// </summary>
    [System.STAThreadAttribute()]
    [System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
    public static void Main()
    {

        CultureInfo ci = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name);
        ci.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd";
        ci.DateTimeFormat.LongTimePattern = "HH:mm:ss";
        Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = ci;

        TrialMaker t = new TrialMaker("Pharmacy Management System",
        System.AppDomain.CurrentDomain.BaseDirectory + "\\RegFile.reg",
        Environment.GetFolderPath(Environment.SpecialFolder.System) +
        "\\TMSetp.dbf",
        "Mobile: +249 914 837664",
        15, 1000, "745");

        byte[] MyOwnKey = { 97, 250,  1,  5,  84, 21,   7, 63,
                     4,  54, 87, 56, 123, 10,   3, 62,
                     7,   9, 20, 36,  37, 21, 101, 57};
        t.TripleDESKey = MyOwnKey;


        bool is_trial;
        TrialMaker.RunTypes RT = t.ShowDialog();
        if (RT != TrialMaker.RunTypes.Expired)
        {
            if (RT == TrialMaker.RunTypes.Full)
                is_trial = false;
            else
                is_trial = true;

            PharmacyManagementSystem.App app = new PharmacyManagementSystem.App();
            app.InitializeComponent();
            /// as i said am just calling App.Run 
            app.Run();
        }
    }
}
}

а вот TrialMaker.cs:

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Win32;
using System.IO;
using Microsoft.VisualBasic;
using System.Windows.Forms;

namespace SoftwareLocker
{
// Activate Property
public class TrialMaker
{
    #region -> Private Variables 

    private string _BaseString;
    private string _Password;
    private string _SoftName;
    private string _RegFilePath;
    private string _HideFilePath;
    private int _DefDays;
    private int _Runed;
    private string _Text;
    private string _Identifier;

    #endregion

    #region -> Constructor 

    /// <summary>
    /// Make new TrialMaker class to make software trial
    /// </summary>
    /// <param name="SoftwareName">Name of software to make trial</param>
    /// <param name="RegFilePath">File path to save password(enrypted)</param>
    /// <param name="HideFilePath">file path for saving hidden information</param>
    /// <param name="Text">A text for contacting to you</param>
    /// <param name="TrialDays">Default period days</param>
    /// <param name="TrialRunTimes">How many times user can run as trial</param>
    /// <param name="Identifier">3 Digit string as your identifier to make password</param>
    public TrialMaker(string SoftwareName,
        string RegFilePath, string HideFilePath,
        string Text, int TrialDays, int TrialRunTimes,
        string Identifier)
    {
        _SoftName = SoftwareName;
        _Identifier = Identifier;

        SetDefaults();

        _DefDays = TrialDays;
        _Runed = TrialRunTimes;

        _RegFilePath = RegFilePath;
        _HideFilePath = HideFilePath;
        _Text = Text;
    }

    private void SetDefaults()
    {
        SystemInfo.UseBaseBoardManufacturer = false;
        SystemInfo.UseBaseBoardProduct = true;
        SystemInfo.UseBiosManufacturer = false;
        SystemInfo.UseBiosVersion = true;
        SystemInfo.UseDiskDriveSignature = true;
        SystemInfo.UsePhysicalMediaSerialNumber = false;
        SystemInfo.UseProcessorID = true;
        SystemInfo.UseVideoControllerCaption = false;
        SystemInfo.UseWindowsSerialNumber = false;

        MakeBaseString();
        MakePassword();
    }

    #endregion

    // Make base string (Computer ID)
    private void MakeBaseString()
    {
        _BaseString = Encryption.Boring(Encryption.InverseByBase(SystemInfo.GetSystemInfo(_SoftName), 10));
    }

    private void MakePassword()
    {
        _Password = Encryption.MakePassword(_BaseString, _Identifier);
    }

    /// <summary>
    /// Show registering dialog to user
    /// </summary>
    /// <returns>Type of running</returns>
    public RunTypes ShowDialog()
    {
        // check if registered before
        if (CheckRegister() == true)
            return RunTypes.Full;

        frmDialog PassDialog = new frmDialog(_BaseString, _Password, DaysToEnd(), _Runed, _Text);

        MakeHideFile();

        DialogResult DR = PassDialog.ShowDialog();

        if (DR == System.Windows.Forms.DialogResult.OK)
        {
            MakeRegFile();
            return RunTypes.Full;
        }
        else if (DR == DialogResult.Retry)
            return RunTypes.Trial;
        else
            return RunTypes.Expired;
    }

    // save password to Registration file for next time usage
    private void MakeRegFile()
    {
        FileReadWrite.WriteFile(_RegFilePath, _Password);
    }

    // Control Registeration file for password
    // if password saved correctly return true else false
    private bool CheckRegister()
    {
        string Password = FileReadWrite.ReadFile(_RegFilePath);

        if (_Password == Password)
            return true;
        else
            return false;
    }

    // from hidden file
    // indicate how many days can user use program
    // if the file does not exists, make it
    private int DaysToEnd()
    {
        FileInfo hf = new FileInfo(_HideFilePath);
        if (hf.Exists == false)
        {
            MakeHideFile();
            return _DefDays;
        }
        return CheckHideFile();
    }

    // store hidden information to hidden file
    // Date,DaysToEnd,HowManyTimesRuned,BaseString(ComputerID)
    private void MakeHideFile()
    {
        string HideInfo;
        HideInfo = DateTime.Now.Ticks + ";";
        HideInfo += _DefDays + ";" + _Runed + ";" + _BaseString;
        FileReadWrite.WriteFile(_HideFilePath, HideInfo);
    }

    // Get Data from hidden file if exists
    private int CheckHideFile()
    {
        string[] HideInfo;
        HideInfo = FileReadWrite.ReadFile(_HideFilePath).Split(';');
        long DiffDays;
        int DaysToEnd;

        if (_BaseString == HideInfo[3])
        {
            DaysToEnd = Convert.ToInt32(HideInfo[1]);
            if (DaysToEnd <= 0)
            {
                _Runed = 0;
                _DefDays = 0;
                return 0;
            }
            DateTime dt = new DateTime(Convert.ToInt64(HideInfo[0]));
            DiffDays = DateAndTime.DateDiff(DateInterval.Day,
                dt.Date, DateTime.Now.Date,
                FirstDayOfWeek.Saturday,
                FirstWeekOfYear.FirstFullWeek);

            DaysToEnd = Convert.ToInt32(HideInfo[1]);
            _Runed = Convert.ToInt32(HideInfo[2]);
            _Runed -= 1;

            DiffDays = Math.Abs(DiffDays);

            _DefDays = DaysToEnd - Convert.ToInt32(DiffDays);
        }
        return _DefDays;
    }

    public enum RunTypes
    {
        Trial = 0,
        Full,
        Expired,
        UnKnown
    }

    #region -> Properties 

    /// <summary>
    /// Indicate File path for storing password
    /// </summary>
    public string RegFilePath
    {
        get
        {
            return _RegFilePath;
        }
        set
        {
            _RegFilePath = value;
        }
    }

    /// <summary>
    /// Indicate file path for storing hidden information
    /// </summary>
    public string HideFilePath
    {
        get
        {
            return _HideFilePath;
        }
        set
        {
            _HideFilePath = value;
        }
    }

    /// <summary>
    /// Get default number of days for trial period
    /// </summary>
    public int TrialPeriodDays
    {
        get
        {
            return _DefDays;
        }
    }

    /// <summary>
    /// Get default number of runs for trial period
    /// i modified here by adding this getter
    /// </summary>
    public int TrialPeriodRuns
    {
        get
        {
            return _Runed;
        }
    }

    /// <summary>
    /// Get or Set TripleDES key for encrypting files to save
    /// </summary>
    public byte[] TripleDESKey
    {
        get
        {
            return FileReadWrite.key;
        }
        set
        {
            FileReadWrite.key = value;
        }
    }

    #endregion

    #region -> Usage Properties 

    public bool UseProcessorID
    {
        get
        {
            return SystemInfo.UseProcessorID;
        }
        set
        {
            SystemInfo.UseProcessorID = value;
        }
    }

    public bool UseBaseBoardProduct
    {
        get
        {
            return SystemInfo.UseBaseBoardProduct;
        }
        set
        {
            SystemInfo.UseBaseBoardProduct = value;
        }
    }

    public bool UseBaseBoardManufacturer
    {
        get
        {
            return SystemInfo.UseBiosManufacturer;
        }
        set
        {
            SystemInfo.UseBiosManufacturer = value;
        }
    }

    public bool UseDiskDriveSignature
    {
        get
        {
            return SystemInfo.UseDiskDriveSignature;
        }
        set
        {
            SystemInfo.UseDiskDriveSignature = value;
        }
    }

    public bool UseVideoControllerCaption
    {
        get
        {
            return SystemInfo.UseVideoControllerCaption;
        }
        set
        {
            SystemInfo.UseVideoControllerCaption = value;
        }
    }

    public bool UsePhysicalMediaSerialNumber
    {
        get
        {
            return SystemInfo.UsePhysicalMediaSerialNumber;
        }
        set
        {
            SystemInfo.UsePhysicalMediaSerialNumber = value;
        }
    }

    public bool UseBiosVersion
    {
        get
        {
            return SystemInfo.UseBiosVersion;
        }
        set
        {
            SystemInfo.UseBiosVersion = value;
        }
    }

    public bool UseBiosManufacturer
    {
        get
        {
            return SystemInfo.UseBiosManufacturer;
        }
        set
        {
            SystemInfo.UseBiosManufacturer = value;
        }
    }

    public bool UseWindowsSerialNumber
    {
        get
        {
            return SystemInfo.UseWindowsSerialNumber;
        }
        set
        {
            SystemInfo.UseWindowsSerialNumber = value;
        }
    }

    #endregion
}
}  

Я добавил getter для TrialPeriodRuns, чтобы использовать его.
В других сценариях я хочу, чтобы мое приложение запускалось напрямую без диалогового окна для регистрации. Другие сценарии - это полная версия или пробная версия с истекшим сроком, которая не запускается в первый раз.
Есть идеи, как я могу этого добиться ??


person JihadiOS    schedule 03.06.2016    source источник


Ответы (2)


Рекомендую записать необходимые данные в Реестр Windows.


Вы можете использовать эту ссылку: https://msdn.microsoft.com/en-us/library/h5e7chcf.aspx

person Akram Mashni    schedule 03.06.2016
comment
эта библиотека, которую я использую, уже записывает данные в SystemFile, вызывая MakeHideFile() и CheckHideFile() - person JihadiOS; 03.06.2016
comment
Итак, если у вас уже есть информация о DateTime первого запуска, вы можете создать форму, в которой вы можете показать, сколько времени у пользователя есть до истечения срока действия, и, если истек срок, ему нужно добавить лицензию, или он закроет приложение при закрытии формы. - person Akram Mashni; 03.06.2016
comment
у меня тоже есть это окно. Он показывает каждый раз, когда я запускаю приложение, я хочу показывать его только в вышеупомянутых сценариях, которые я упомянул в своем вопросе. @ Акрам Машни - person JihadiOS; 03.06.2016

Благодаря вышеупомянутому обсуждению с @Akram Mashni. Я придумал это Решение, которое отлично работает для моих сценариев.
Я изменил метод DaysToEnd() на public, чтобы я мог вызывать его с экземпляром класса TrialMaker из любого другого места (например, My Main()):

public int DaysToEnd()
{
    FileInfo hf = new FileInfo(_HideFilePath);
    if (hf.Exists == false)
    {
        MakeHideFile();
        return _DefDays;
    }
    return CheckHideFile();
}  

Затем я использую его в моем Main() методе, чтобы проверить свои сценарии. Когда я звоню DaysToEnd(), он обновляет информацию, хранящуюся в SystemFile, вызывая CheckHideFile() внутри него.
Я сначала позвонил DaysToEnd(), чтобы я мог обновить информацию в SystemFile
DaysToEnd() вернет значение int, представляющее количество дней, оставшихся в испытательном периоде. Также я позвонил get для TrialPeriodRuns, который я добавил ранее в библиотеку, и он представляет собой оставшиеся запуски в течение пробного периода.

Также я реализовал вложенные операторы if-else для проверки моих сценариев:

        int daystoend = t.DaysToEnd();
        int trialperiodruns = t.TrialPeriodRuns;
        /// Check if it is first run here 
        if (dte == 15 && tpr == 1000)
        {
            bool is_trial;
            /// then show the Registration dialog
            TrialMaker.RunTypes RT = t.ShowDialog();
            if (RT != TrialMaker.RunTypes.Expired)
            {
                if (RT == TrialMaker.RunTypes.Full)
                    is_trial = false;
                else
                    is_trial = true;

                PharmacyManagementSystem.App app = new PharmacyManagementSystem.App();
                app.InitializeComponent();
                app.Run();
            }
        }
        /// Check if it is trial but not first run
        /// no Registration Dialog will show in this case
        else if (dte > 0 && tpr > 0)
        {
            PharmacyManagementSystem.App app = new PharmacyManagementSystem.App();
            app.InitializeComponent();
            app.Run();
        }
        /// Check if it is expired trial
        else if (dte == 0 || tpr == 0)
        {
            bool is_trial;
            /// then show the Registration Dialog here
            TrialMaker.RunTypes RT = t.ShowDialog();
            if (RT != TrialMaker.RunTypes.Expired)
            {
                if (RT == TrialMaker.RunTypes.Full)
                    is_trial = false;
                else
                    is_trial = true;

                PharmacyManagementSystem.App app = new PharmacyManagementSystem.App();
                app.InitializeComponent();
                app.Run();
            }
        }
        /// the full version scenario remain and it comes here 
        /// no need to show Registration Dialog
        else
        {
            bool is_trial;
            TrialMaker.RunTypes RT = t.ShowDialog();
            if (RT != TrialMaker.RunTypes.Expired)
            {
                if (RT == TrialMaker.RunTypes.Full)
                    is_trial = false;
                else
                    is_trial = true;

                PharmacyManagementSystem.App app = new PharmacyManagementSystem.App();
                app.InitializeComponent();
                app.Run();
            }
        }  

И, наконец, это работает как шарм для меня
еще раз спасибо @Akram Mashni за то, что вдохновил меня

person JihadiOS    schedule 04.06.2016