C#|二重起動を禁止して、コマンドライン引数を取得

 ”C# 二重起動 禁止”等で検索するとMutexを使った方法を紹介したページがヒットしますが、これでは後から起動されようとしたインスタンスのコマンドライン引数を取得出来ません。

 自分で、既に起動済みのインスタンスにコマンドラインを渡して、受け側で処理する様に実装しなければいけません。これでは面倒です。VB.NET 2005では簡単に二重起動を禁止して、引数も取得出来ました。

 同じクラスライブラリなのだから、VBに出来てC#に出来ない筈は無いと考え、調べてみました。下準備をすればVBと同じ方法で二重起動を禁止し、引数も取得出来ることがわかりました。以下にその方法を紹介します。

まず、”Microsoft.VisualBasic”をプロジェクトの参照に追加します。

そして、次の様にクラスを書きます。

using System.IO;
using Microsoft.VisualBasic.ApplicationServices;
class myApplication:WindowsFormsApplicationBase{
  public myApplication()
    : base() {
    this.EnableVisualStyles = true;
    this.IsSingleInstance = true;
    this.MainForm = new Form1();//スタートアップフォームを設定
    this.StartupNextInstance += new StartupNextInstanceEventHandler(myApplication_StartupNextInstance);
  }
   void myApplication_StartupNextInstance(object sender, StartupNextInstanceEventArgs e) {
    //ここに二重起動されたときの処理を書く
    //e.CommandLineでコマンドライン引数を取得出来る
  }
}

myApplication_StartupNextInstanceメソッドの中には、VB.NETの方法の時と同じ様にコーディング出来ます。詳しくは検索すればわかりやすいページがあるでしょう。

次に、プログラムのエントリポイントを書き換えます。

using System;
static class Program {
  [STAThread]
  static void Main(string[] args) {
    //Application.EnableVisualStyles();
    //Application.SetCompatibleTextRenderingDefault(false);
    //Application.Run(new Form1());
    myApplication winAppBase = new myApplication();
    winAppBase.Run(args);
  }
}

 こんなに簡単な方法があるのに、検索しても紹介されているのを見たことがありません。この方法に何か問題があるのかも知れませんね。

 知っている方がいましたらコメント下さい。

C#|axWindowsMediaPlayer

 axWindowsMediaPlayerの使い方をググっても情報が少なかったのでメモします。

【準備】

参照設定する。

ツールボックスで右クリック、アイテムの選択

COMコンポーネントタブをクリック

Windows Media Playerをチェック

これでツールボックスにWindows Media Playerが追加されるのでフォームに貼り付ける。

【フォームデザイナでプロパティ設定】

Ctlenabled falseにするとボタン操作が無効になる

stretchToFit 動画、画像がウィンドウのサイズに合わせて変わる。

uiMode none ボタンが表示されない。UIをお好みで実装するならこれ。

    full ボタンが表示される。WMPそのまんま。お手軽。

    invisible 表示されないって意味らしい。設定したら表示が大変なことになった。オーディオ専用ならこれか、Visible = falseでいい気がするけど。

    他に何かあったら教えて下さい。

URL 再生するファイルのパスを渡すとロードして再生の準備をする。settings.autoStart = true なら再生を開始する(既定ではfalseみたい)。

windowlessVideo trueにすると動画が表示されない。用途がわからない。

【メソッドとかプロパティとか】

Ctlcontrols.play() 再生。

Ctlcontrols.stop() 停止。

Ctlcontrols.pause() 一時停止。

Ctlcontrols.fastReverse() 早戻し、出来ないファイル形式があるみたい。

Ctlcontrols.fastForward() 早送り、上に同じ。

Ctlcontrols.currentPosition 再生位置、秒数。

Ctlcontrols.currentPositionString 再生位置、mm:ssの形式。

settings.volume = 0~100 ボリューム

settings.balance = -50~50 左右のバランス

settings.mute 消音。えってぃ動画とか見るなら必須。

status 準備完了とか一時停止とか表示されるあれ。StatusChangeイベントで更新してやるといいみたい。

currentMedia.duration 再生中のファイルの総時間。

他はよくわからなかった。

【シークバーを実装してみる】

 再生位置を更新するイベントがいくら探しても見付かりません。どうやら無い様です。Windows.Forms.Timerを使って定期的に更新することにします。スライドにはTrackBarを使います。

 再生開始したらTimerをStart()する。Intervalは既定の100でいいと思います。Windous Madia PlayerのPlayStateChengeイベントが使えるかも。currentMedia.durationでファイルの長さが得られるのでintにキャストしてTrackBarのMaxValueにセット。

 TimerのTickイベントでCtlcontrols.currentPositionをintにキャストしてTrackBarのValueにセット

 これで再生時間が刻々と更新されます。

 後はTrackBarの操作で再生位置を操作しましょう。

 TrackBarのScrollイベントでTrackBarのValueをdoubleにキャストしてCtlcontrols.currentPositionにセット。

 これだけじゃエレガントに動かないので、操作中は更新を止めましょう。

 TrackBarのMouseDownイベントでTimerをStop()。MouseUpイベントでStart()するとエレガントに動くようになりました。

 以上、WindowsMediaPlayer弄りメモでした。他にも情報がありましたら教えて下さい。

C#|VC#2008

 昨晩、Visual C# 2008 Expess Editionをインストールしました。少し弄ってみたのですが、IDEの使い勝手は変わりません。

 と、思ったのですが、ヘルプの起動が速くなっています。2005だと待てど暮らせどヘルプが出なかったのに、2008になってサクッと出るようになりました。

 エディタはどんなもんよ?と思いFizzBuzzしたら物凄い新機能を発見しました。インテリセンス表示中にCtrlを押すと、インテリセンスの選択メニューが透けるんです!その下のコードが見えるんです!これだけでも乗り換える価値があります。

 一番の目玉らしい、LINQとか匿名なんたらとかのC#3.0構文についてもグーグルで調べてみました。なんというか、キモいです。キモぅいです。コードの見た目からして変態臭を漂わせてます。こんなの僕に使いこなせる訳がありません。

 VBとVC++も2008にしようかしら。

C|1月25日のコーディング

 今日は2時間位Cを弄りました。以前C#で書いた迷路生成プログラムの移植なのですが、やっと一通り書けました。コンパイルも通りました。でも、実行時にエラーが出ます。アクセス違反だそうです。

 VC++のIDEでブレークポイント設定してステップ実行してポインターとかウォッチしようかなと思ってmain関数の1行目にブレークポイント設定してもやっぱりアクセス違反で落ちます。逆アセンブルしたコードとか見せられてもちっとも有難くないです。読めません。日本語でおk。

 やっぱり挫けそうです…orz

 ふてくされてC#でこんなコード書いて遊んでました。どう書く?で何回か素数を使うことがあったんで、また使う機会があるかもとクラスにしてみるテスト。

using System;
using System.Collections.Generic;
public class Prime {
  static public IEnumerable<int> GetPrimes() {
    yield return 2;
    for(int i = 3; i <= int.MaxValue; i += 2) {
      if(IsPrime(i)) yield return i;
    }
  }
  static public bool IsPrime(int value) {
    for(int i = 2; i < value; i++) {
      if(value % i == 0) {
        return false;
      }
    }
    return true;
  }
}

 へっへっへー、Cじゃこんなこと出来ないだろー。C#可愛いよC#。

 明日もちょっとCを弄ろうと思います。

C#|どう書く?org必ず解ける迷路2

 グッと高速化。初めてStack<T>なるものを使ってみました。再帰で書くときの履歴に便利ねぇと思いながら書いたら、あっさりとスタックオーバーフローorz起こしたんでループで書き直しました。

 一度再帰で書いたのを最小限の変更でループに直してるので多少エレガントじゃない部分があると思います。

http://ja.doukaku.org/comment/5374/

 C#って何も考えずに楽して書いたら遅いけど、パフォーマンスを意識して書けばC++と遜色ないんですね。