フォーム外のマウスカーソルの変更

フォーム外でもマウスカーソルをデフォルトの物から変更したかったんですが、これがなかなかに苦労しました……。以下のコードはC#です。
↑フォーム外というか、創ってるのが常駐プログラムなんで、フォームが表示されてないw


自身のプログラムのフォーム内ならば、カーソルをリソースに追加して

this.Cursor = new Cursor("Original.cur");

としておけばいいわけで、そこまではすぐにたどり着いたんですが……。
(あ、この場合でも追加したカーソルのプロパティの「出力ディレクトリにコピー」の欄を「新しい場合はコピーする」とかにしておかないと、エラー出ます)


いろいろネットの海を彷徨ってみた結果、WinAPIに頼らなくてはならないことが判りましたorz
もーWinAPIはC#のサンプル少ないし(VBのサンプルが多いので、それをアレンジすればいいだけですが)、定数調べるの大変なので泣けます。
まだ完璧には理解出来てませんが、とりあえず次ので行けました。

//WinAPI
[DllImport("user32.dll")]
public static extern IntPtr LoadCursorFromFile(String lpFileName);
[DllImport("user32.dll")]
public static extern int LoadCursor(int hInstance, int lpCursorName);
[DllImport("user32.dll")]
public static extern int SetSystemCursor(int hcur, int id);
[DllImport("user32.dll")]
public static extern int CopyIcon(int pcur); //カーソルもアイコン扱いで処理する。

public const int OCR_NORMAL = 32512; //通常カーソル


int defaultMouseCursor = CopyIcon(LoadCursor(0, OCR_NORMAL)); //元のカーソルを保存
SetSystemCursor((int)LoadCursorFromFile("Original.cur"), OCR_NORMAL); //カーソル変更

//
//処理
//

//マウスカーソル戻す
SetSystemCursor(defaultMouseCursor, OCR_NORMAL);

一応は出来ましたが、これだと異常終了した際にカーソルが戻らない不具合が……。
C#のデストラクタって、いつ呼ばれるかも判らないし、異常終了時には呼ばれないんですねorz
まあ、そこは最悪再起動すれば直るので割り切っちゃうしかないかもー……。


すぐに終わると思っていたら、とんでもない時間かかりました;;