- Take the steps described in Integrate DevMateKit if you haven't done it yet.
- Add the following properties to
DMFrameworkSettings
:
DMFrameworkSettings.PublickRSAKey = @"-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzRWGeVD5D1FDuRhpSKzU P19hTLUNE0AHZHjdU05AZOUa8gxlCfMSHjsuM95dtk2Z+Pgd9Vq1OTGrYhav9jZP xUMdtHcinyAnXjAz2hgSSb3/1qrXPxaSoG05x8LPTEN5RYxal6PorRDGOAvG8sgN /nHIBmylZMpQOegWo8JppIpKHEfii23JcGuXkoo/oen33TQq5y/HhWWRKfxVbnGx RnD25WAOcWpvg+H2gWVrfLwRAu9GK0yGBhOhbgKsfO056NAwfM02HhRAtwfC7Xhc ID6kPWp/qThVLSfGhwXkUNwAxfCHh/5dH2rF/xfCAhvfBhxLYx7Njg3Ana/Ybo1L 5wIDAQAB -----END PUBLIC KEY-----";
//!!!
DMFrameworkSettings.IsFirstRun = false;
NOTE
On first clean run of the application, the
IsFirstRun
property must be set to “true”.
Also note that you must specifyPublickRSAKey
to enable the Activation functionality. A unique key is provided by DevMate's Add Application wizard on the Configure Activation step.
- You can specify additional
DMFrameworkSettings
properties if needed. DevMate Activation provides the following configuration options:
Property | Type | Description |
---|---|---|
IsFirstRun | bool | Property (bool) must be set to “true” on first clean run of the application. In this case, DevMate will receive a report from the application that contains data on the first actual launch of the app. |
IsBeta | bool | Specifies whether a current version of the application is Beta. |
URLActivationSchema | string | Used for running the application by the URL Scheme. For more details, read Configure Activation via URL Scheme. |
StoreAdditionalParameters | Dictionary<string,string> | Configures additional GET parameters for your Store Link. |
ApplicationIcon | string | Sets a “TitleBar” icon for DevMate Framework windows. Must contain at least one 16x16pt icon. Example: pack://application:,,,/TestApp;component/icon.ico. |
- Configure a trial mode of an application.
Use the following code snippet to disable the trial mode in the Activation window:
DMActivationWindow window = new DMActivationWindow();
window.BigIconSource = new BitmapImage(new Uri(“pack://application:,,,/Images/icon.png"));
window.ShowDialog();
Use the following code snippet to enable the trial mode in the Activation window (make sure you've specified DMFrameworkSettings.TrialType
before:
DMActivationWindow window = new DMActivationWindow(true); window.BigIconSource = new BitmapImage(new Uri(“pack://application:,,,/Images/icon.png"));
window.ShowDialog();
Note that you must use 128x128pt icon for the BigIconSource
property.
If you want to open “DMActivationWindow” on the Enter Activation Key screen, set the following property to “true” before calling ShowDialog()
:
window.ShowEnterActivationNumberScreenAtStart = true
Configuring Activation via URL Scheme (optional)
- Register the URL scheme on the client PC by creating the following registry keys and values:
HKEY_CLASSES_ROOT\[URL_Schema_Name]:
Set the default value to “URL [Application_Name] Activation Protocol”.
Create an empty string value in HKEY_CLASSES_ROOT\[URL_Schema_Name] with the name "URL Protocol”.
HKEY_CLASSES_ROOT\[URL_Schema_Name]\shell
HKEY_CLASSES_ROOT\[URL_Schema_Name]\shell\open
HKEY_CLASSES_ROOT\[URL_Schema_Name]\shell\open\command:
Set the default value to "[PATH_TO_MAIN_APPLICATION_EXE]" “%1”
NOTE
You need the administrator’s permissions to complete this action. You can get these permissions during installation process.
- Add the following code snippet to your application (it processes command line arguments):
DMFrameworkSettings.URLActivationSchema = [URL_Schema_Name];
bool fromURL = ActivationFramework.Current.IsRunUsingURLSchema();
if (fromURL)
{
DMActivationWindow window = new DMActivationWindow( ActivationFramework.Current.GetKeyFromURLSchema());
window.BigIconSource = new BitmapImage(new Uri(“pack://application:,,,/Images/icon.png”));
window.ShowDialog();
}
NOTE
Read Registering an Application to a URI Scheme (MSDN) to find out more.
Configuring Activation API
Activation API contains the following properties that must be obtained through FindDelegate
method:
public class DelegateType
{
public const int IsActivated;
public const int LicenseInformation;
public const int Activate;
public const int StartTrial;
public const int GetTrial;
public const int GetRawTrialValue;
public const int GetStoreLink;
}
IsActivated
If you use the IsActivated
property, the method verifies whether the application is activated.
var func = ActivationFramework.Current.FindDelegate((int) DelegateType.IsActivated) as Func<int>;
int isActivated = func.Invoke();
Possible results are the following:
- 0 - not activated
- 1 - activated
- 2 - expired
LicenseInformation
If you use the LicenseInformation
property, the method verifies the license information by comparing it to the user information from DevMate.
var func = ActivationFramework.Current.FindDelegate((int) DelegateType.LicenseInformation) as Func<int, object>;
string ActivationIdKey = func.Invoke(LicenseInformationKeys.ActivationIdKey).ToString();
string UserName = func.Invoke(LicenseInformationKeys.UserNameKey).ToString();
string UserEmail = func.Invoke(LicenseInformationKeys.UserEmailKey).ToString();
long ActivationDate = Convert.ToInt64(func.Invoke(LicenseInformationKeys.ActivationDateKey));
long ExpirationDate = Convert.ToInt64(func.Invoke(LicenseInformationKeys.ExpirationDateKey));
string ExpirationVersion = func.Invoke(LicenseInformationKeys.ExpirationVersionKey).ToString();
string ActivationTag = func.Invoke(LicenseInformationKeys.ActivationTagKey).ToString();
bool IsBetaOnly = Convert.ToBoolean(func.Invoke(LicenseInformationKeys.BetaOnlyKey));
UserName
and UserEmail
values are not null/empty only if a user specified them during license activation. It becomes possible when an activation number has the pattern idu. Entering this kind of an activation number opens an extended activation dialog with mandatory user name and email fields.
ExpirationVersion
value specifies the ultimate application version covered by the current license. An owner of this license is not eligible for upgrade to versions higher than the specified one.
Activate
If you use the Activate
property, the method sends user data to DevMate to register (activate) a license.
var func = ActivationFramework.Current.FindDelegate((int) DelegateType.Activate) as Func<string, string, string, bool?, long>; Task.Factory.StartNew(() =>
{
return func.Invoke(ActivationCode, UserName, UserEmail, KeepUpToDate); }).ContinueWith((result) =>
{
var activationResult = (ActivationResult)Marshal.PtrToStructure(new IntPtr(result.Result), typeof(ActivationResult));
if (activationResult.Success)
{ //Show Success Screen
}
else
{
ErrorText = activationResult.Error;
}
});
StartTrial
If you use the StartTrial
property, the method sends a report about the beginning of a trial period when a user clicks the Start Trial button.
var func = ActivationFramework.Current.FindDelegate((int) DelegateType.StartTrial) as Func<long, bool>;
TrialType trialType = new TrialType() { DMTrialWeek = true };
IntPtr trialIntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(trialType));
Marshal.StructureToPtr(trialType, trialIntPtr, true);
long timeTrialRef = (long)trialIntPtr;
bool res = func.Invoke(timeTrialRef);
TrialType
class includes the following properties:
public bool DMTrialDay { get; set; }
public bool DMTrialWeek { get; set; }
public bool DMTrialTwoWeeks { get; set; }
public bool DMTrialMonth { get; set; }
public bool DMTrialYear { get; set; }
public bool DMCustom { get; set; }
public long DMTrialPeriond { get; set; }
Please note that only one of the “TrialType” properties can be set to “true” at a time. If more than one property is set to “true”, DevMate will use only the last one applied.
If DMCustom
is set to “true", DMTrialPeriond
is used. If DMCustom
is set to “true” and DMTrialPeriond
is not set, the default value is used (86400 seconds).
GetTrial
If you use the GetTrial
property, the method returns total duration of a trial period (in hours) and the number of hours that is already spent in the trial mode.
var func = ActivationFramework.Current.FindDelegate((int) DelegateType.GetTrial) as Func<Tuple<int,int>>;
var trialInfo = func.Invoke();
if (trialInfo.Item1 == -1 || trialInfo.Item2 == -1)
{
//Trial not started
}
else
{
TrialPeriod = trialInfo.Item2; //In hours
PassedTrial = trialInfo.Item1; //In hours
}
GetRawTrialValue
If you use the GetRawTrialValue
property, the method returns total duration of a trial period (in seconds) and its expiration date (UNIX timestamp).
var func = ActivationFramework.Current.FindDelegate((int) DelegateType.GetRawTrialValue) as Func<Tuple<long,long>>;
var trialInfo = func.Invoke();
if (trialInfo.Item1 == -1 || trialInfo.Item2 == -1)
{
//Trial not started
}
else
{
TrialPeriod = trialInfo.Item2; //In seconds
TrialExpireDate = trialInfo.Item1; //In UNIX timestamp
}
GetTrialTimeRemained
If you use the GetTrialTimeRemained
property, the method returns a total number of seconds left till the end of a trial period.
var func = ActivationFramework.Current.FindDelegate((int) DelegateType.GetTrialTimeRemained) as Func<long>;
var trialInfo = func.Invoke();
if (trialInfo==-1)
{
//Trial not started
}
else
{
TrialPeriodRemained = trialInfo ; //In seconds
}
GetStoreLink
If you use the GetStoreLink
property, the method returns a link to the store where a user can buy a license.
var func = ActivationFramework.Current.FindDelegate((int) DelegateType.GetStoreLink) as Func<string>;
string storeLink = func.Invoke();
Process.Start(storeLink); //Open link in default browser
Note that you can add GET parameters to the link by using this method:
DMFrameworkSettings.StoreAdditionalParameters.Add("key", “value");