VB.netでカーソルを変更する。

ずっと前にVisual Basic .netで作ったソフトで、カーソルを変えようと思ったら、なぜかカラーのカーソルが白黒2色でしか表示されなかった。

きっとこれは.net Frameworkのバグだと思って、バージョンアップを待ったのだが、Visual Basic 2005 Express Edition(無償で商用利用可。すばらしい。)に添付のヘルプで「Cursorクラスについて」を見たところ・・・

Cursor クラスでは、アニメーション カーソル (.ani ファイル)、またはカラーのカーソルはサポートされていません。

おいっ!仕様にするなよっ!

・・・ということで、Microsoftには期待できそうもないので、色々と調べてみたら、Win32API使えばできそう、というのがわかり、ためしてみたら行けました。以下、カーソルのファイル名を指定して、Cursorクラスのインスタンスを返す関数(適当に例外処理とか追加してください)。

Declare Function LoadImage Lib "user32" _
    Alias "LoadImageA" (ByVal hInst As Integer, _
    ByVal lpsz As String, ByVal un1 As Integer, _
    ByVal n1 As Integer, ByVal n2 As Integer, _
    ByVal un2 As Integer) As Integer

Function LoadCursor(ByVal CursorFilePath As String)
    Dim ip As New System.IntPtr( _
        LoadImage(vbNullString, CursorFilePath, _
        2, 0, 0, &H10))
    Return New Cursor(ip)
End Sub

これをコピペして、Me.Cursor = LoadCursor("C:\test.cur")のように使って下さい(なんて投げやりな解説)。

しかし、Win32APIでできることは、.net Frameworkでもなんらかのかたちで実現できて欲しいです・・・。

なお、今回LoadImageの使い方について、WinAPI Database for VB ProgrammerLoadImageの項を参照しました。VB.NETでの宣言まで載ってて、えらい便利です。