プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

VC#でソフトウェア使用許諾のようなものを作る

自身が作ったプログラムを公開した時に、使った人が何らかのトラブルが起きてしまったら…。

そのプログラムが動かないだけならたいした問題ではないですが、ローカルのファイルにアクセスしたり、ネット上のデータにアクセスするときは取り返しのつかない状況を起こしてしまうことが起きえます。

たとえば、誤ったプログラムで、ローカルのユーザーのファイルを削除してしまったり…。

そのようなときに、一般にはソフトウェアの製作者は正しい方法であろうとなかろうと提供したソフトウェアの対価を超える補償はしません。

f:id:s51517765:20170415173411j:plain

このような画面は必ずと言っていいほどインストール時に出てくるか、Readmeなどの添付ファイルがあります。

簡易的に、補償しないことを受諾しないと使えない仕組みを作ってみました。
別の、本来の目的のためにプルダウンの中身を”ListKeyword.txt”に書き込む仕組みを作るので、ここに使用許諾の仕組みを追加します。

正しい方法でライセンスキーを入手しない限り、”OKCancel”がでてきて"OK"を押下しないと使えないようにします。

アプリケーションを起動したときに実行されるForm Loadに”ListKeyword.txt”をStreamReaderで読み込みComboBoxのItemに追加する本来の機能に、ライセンスを読み込ませます。

ここではライセンスキーは"123456789012"です。

 if (listKeyword != "123456789012")

”!=” は一致しないときを示す演算子です。
"123456789012"以外はComboBoxのItemに追加する本来の機能を動作させ、"123456789012"のときはelseでライセンスキーをSetします。

  UserSet == true

ここで、UserSetは"Boolean型"の変数です。
Boolean型はtrue or falseの2値をとる変数です。
有効・無効、あり・なし、ON・OFF などを入れるのに使います。
intで0 or 1とする方法を使う人も良く見かけますが、ただしくはBoolean型で定義するべきです。


ライセンスキーがないときは
OKCancelボタンをだします。

  if( MessageBox.Show("このソフトウェアを使用してのいかなる場合も製作者は補償いたしません。", "License confirmation", MessageBoxButtons.OKCancel) != DialogResult.OK)

これは、MessageBoxと選択ボタンを組み合わせたものにさらに、ifで判断を加えたものです。
ここでも"!="を使います。
ここで、”OK”を選択したときにソフトウェアのメイン画面に進み、”キャンセル”を選択したときに許可しない、と考えがちですがこれだとたとえば、右上の×をクリックしてどちらも選択しないと、メイン画面に進めるようになってしまいます。
f:id:s51517765:20170415180229j:plain

これはOK、Cancelと見せかけて実は、その他の選択ができてしまうということです。

あとは、OKが選択されなかったらアプリケーションを終了させるようにします。

close()

あとは、なぜ起動できないのかのメッセージをだしてあげれば親切でしょうか。

    private void Form1_Load(object sender, EventArgs e)
        {
            Boolean UserSet = false;
            var listKeyword = "";
            StreamReader srKeyword = new StreamReader("ListKeyword.txt");
            while ((listKeyword = srKeyword.ReadLine()) != null)      // ストリームの末尾まで繰り返す
            {
                if (listKeyword != "123456789012") //ライセンスキーでないときは本来の動き
                {
                    comboBoxKeyword.Items.Add(listKeyword);
                }
                else
                {
                    UserSet = true; //ライセンスキーがあったら
                }
            }
            
            if (UserSet == false)
            {
               if( MessageBox.Show("このソフトウェアを使用してのいかなる場合も製作者は補償いたしません。", "License confirmation", MessageBoxButtons.OKCancel) != DialogResult.OK)
                {
                    MessageBox.Show("使用許諾に合意しないと使用することはできません。");
                    Close();
                }
            } 
        }