ContextMenuStripをタスクバー上に表示する

投稿者: shuichi, タグ: ,,,, 投稿日時: 2006/10/28 04:38

.NET Framework 2.0では.NET Framework 1.xのContextMenuの代わりにContextMenuStripというコントロールが追加されました。このContextMenuStripは多機能で便利ですが、タスクバー上に表示させようとするとうまく表示できません(タスクバーに重ならないように表示される)。SHAppBarMessageでデスクトップツールバーを作成したときなどは困るんじゃないかと。ということでContextMenuStripをタスクバー上に表示させるためにいろいろと調べてみました。

最初に注目したのはNotifyIcon。NotifyIconにContextMenuStripを設定すると正常にタスクバー上に表示されます。MSIL逆アセンブラでNotifyIconを覗いてみると、ContextMenuStripのShowInTaskbarというプライベートメソッドを呼び出していることが分かります。とりあえず、

contextMenuStrip.GetType().InvokeMember(
    "ShowInTaskbar",
    System.Reflection.BindingFlags.NonPublic |
    System.Reflection.BindingFlags.InvokeMethod |
    System.Reflection.BindingFlags.Instance,
    null,
    contextMenuStrip,
    new Object[] { Cursor.Position.X, Cursor.Position.Y } );

とすることでcontextMenuStripをタスクバー上に表示させることができました。

ただし、この方法では何故かメニューが常にマウスポインタの右上に表示されるようです。いまいちスッキリしないのでShowInTaskbarメソッドの中をさらに覗いてみると、ToolStripDropDownにWorkingAreaConstrainedプロパティが存在するらしい。強制的に作業領域に表示させるという意味なので、

contextMenuStrip.GetType().InvokeMember(
    "WorkingAreaConstrained",
    System.Reflection.BindingFlags.NonPublic |
    System.Reflection.BindingFlags.SetProperty |
    System.Reflection.BindingFlags.Instance,
    null,
    contextMenuStrip,
    new Object[] { false } );
contextMenuStrip.Show( Cursor.Position );

としてみるとうまく表示させることができました。ただし、メニューが表示されるとWorkingAreaConstrainedがtrueに設定されるようなので、表示させる前に毎回WorkingAreaConstrainedをfalseに設定しないと駄目なようです。

これらの方法は本来アクセスできないメソッドやプロパティに強引にアクセスしているわけで、実際はこのような方法は好ましくありません。とりあえずこのような方法もあるというだけです。

iTunes COM SDK

投稿者: shuichi, タグ: ,,, 投稿日時: 2006/06/06 03:02

半年くらい前にiTunes COM for Windows SDKというものがあることを知りました。COMを扱えるプログラミング言語からiTunesをコントロールすることができます。ということでC#からも簡単にiTunesをコントロールすることができるみたいです。ただ、これを使って何を作ればいいのか…ネタが思いつかない。ちなみにBlogPeople loves Music – AutoPlayというイントロ再生するためのソフトがあるんですけど、これもiTunesをCOMインターフェース経由でコントロールしているんだと思います。

プログラミングに最適なフォントConsolasが提供開始

投稿者: shuichi, タグ: ,,,,, 投稿日時: 2006/05/22 11:52

ConsolasがMicrosoftのサイトからConsolas Font Pack for Microsoft Visual Studio 2005としてダウンロードできるようになりました。ConsolasとはWindows Vista用の新フォントです。他にも日本語表示用のMeiryoなどが有名ですが、Consolasは英数字用の等幅フォントです。ということでプログラミング用に最適だと思いますよ。

ちなみに、このフォントはVisual Studio 2005の正規ライセンスユーザーに対して提供されているみたいです。私は一応Visual Studio 2005を持っているんですけど、持っていない人は無料のVisual Studio 2005 Express EditionをインストールすればO.K.なんでしょうか?ちなみにダウンロードされるインストーラを実行するとフォントがインストールされるのと同時にVisual Studio 2005のテキストエディタのフォントがConsolasに自動的に設定されました。下の図はVisual C# Express Editionで表示してみたところ。

Consolas

.NETのWildcard(ワイルドカード)クラス

投稿者: shuichi, タグ: ,,, 投稿日時: 2005/09/16 17:00

ファイル名を指定するときなどに用いるワイルドカードを.NETで扱う方法がCode ProjectのConverting Wildcards to Regexesにあります。タイトルのとおりワイルドカードを正規表現に変換しているだけですけど、このようにWildcardクラスを定義するとワイルドカードを直感的に扱えますね。

そういえばファイル検索やウェブ検索で正規表現を扱えたらなぁってたまに思うんですけど、デスクトップ検索アプリケーションなどで対応しているものありますかね。

C#用のBigIntegerクラス

投稿者: shuichi, タグ: ,,, 投稿日時: 2005/09/10 22:46

Javaには任意精度の整数演算を行うことができるBigIntegerクラスがありますが、これのC#版をThe Code Project – C# BigInteger Classで見つけました(かなり今更感がありますが…)。実はJ#を使えばBigIntegerを使えるらしいのですが、やはりC#でも使えたほうがいいですよね。さらっとドキュメントを見て試してみたところなかなか使いやすい感じです。