3流プログラマのメモ書き

元開発職→現社内SEの三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(VB.Net)マウスカーソルで任意の画像を使う

.Netで任意の画像をマウスカーソルとして扱いたい場合です。
簡単にできるかと思ったら、結構はまりました。

まず、カーソルファイルを作ります。
そのカーソルファイルをプロジェクトに追加して、ビルド時に出力するようします。
ソースは下記のようにすることで、カーソルファイルを読み込み、マウスカーソルを設定できます。

Me.Cursor = New Cursor("Original.cur")


ところが、これで実行するとカーソルが白黒になってしまいます。
(ちなみに、正しいカーソルファイルフォーマットでないと「イメージの形式が有効ではありません。イメージ ファイルが壊れている可能性があります。 パラメータ名: stream」という例外が発生してしまいます。)

MSDNは「メモ Cursor クラスでは、アニメーション カーソル (.ani ファイル) はサポートされません。」とありますが、どうやらカラーカーソルもサポートされてないようです。

そのことがスレッド: VB.NETでのマウスカーソルの色について色付きのカーソルを作成するにも取り上げられています。

で、対応策は上記のサイトにもあるように、アイコンファイルをいったん取り込んで、そのハンドルをCursorを作ります。

Dim ico As New Icon("アイコンファイル.ico")
'アイコンファイルのハンドルからCursor作成
Dim cur As New Cursor(ico.Handle)
Me.Cursor = cur


ちなみにアイコンをリソースとして取り込んでいるとこんな感じでできます。(アイコンリソース名を"Cursor_Mouse"とします)

Me.Cursor = New Cursor(My.Resources.Cursor_Mouse.Handle)


で、ここでも問題が。
IconオブジェクトからCursorを作るとホットスポット(Windows がカーソルの位置を追跡するときに参照するポイント)がイメージの中心点になってしまいます。

ホットスポットの変更はどうやらできないみたいなので、仕方なく最初32x32で作ってたイメージを64x64にし、画像を右下に移動させ、あとはすべて透過にするという荒技で対処しました。

まったく、MSにはやられますな。