長文すみません!残念ながら、いくつか説明する必要があります... WinForms を使用しないアプリケーション (Unity3d では Windows 用) があるため、System.Windows.Forms 名前空間の一部である Cursor クラスを使用できません。 . それでも、カーソルの現在の形状を設定できるようにしたいと思います。
多くの調査とグーグル検索の結果、user32.dll 内の特定のメソッドに対する P/Invoke 呼び出しを使用すると、これが可能であることがわかりました。私はそれを(一種の)動作させました:
以下を使用して、ウィンドウへのハンドルを見つけます。
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
また、classname に null を指定し、windowname にウィンドウのタイトルを指定します。次に、返された IntPtr を使用してこれを呼び出します。
[DllImport("user32.dll")]
public static extern IntPtr SetClassLong(IntPtr hwnd, int index, IntPtr dwNewLong);
すべての低レベル ウィンドウ メッセージを処理する WindowProc へのポインターをターゲットにするために、インデックスに "-4" を指定し、次を使用します。
System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate()
マネージ コードに実装する新しい WndProc デリゲートへのネイティブ ポインターを生成します。その署名は次のようになります。
public long WndProc(IntPtr hwnd, uint msg, uint wparam, int lparam);
要約すると、私は基本的にネイティブ ウィンドウ プロシージャをマネージ コールバックでオーバーライドしているので、すべてのウィンドウ メッセージを処理するのは私の責任になります。しかし、標準ウィンドウ プロシージャの実装全体を書き直すことには興味がありません。カーソルがウィンドウ上にあるときにマウス カーソルの形状を描画する方法を制御できるようにしたいだけです。そのために、次の関数でデフォルトのウィンドウ プロシージャを呼び出すことができます。
[DllImport("user32.dll")]
public static extern long DefWindowProc(IntPtr hwnd, uint msg, uint wparam, int lparam);
そしてその直後に、次を使用してカーソルを別のものに設定します。
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern IntPtr SetCursor(IntPtr hCursor);
この種の作品。:) 「ちょっと」と言います。これは、デフォルトのウィンドウ プロシージャが最初にカーソルをクラス カーソルに設定し、その直後に、実装によって使用したいカスタム カーソルに設定されるために発生するちらつきが少しあるためです。カーソルを設定します。この状況は、クラス カーソルを null に設定することで解決できます。そうすることで、システムはカーソルを描画せず、代わりにアプリケーションがすべてのウィンドウメッセージに対してカーソルを設定することを期待します。これはまさに私が行っていることなので、誰がカーソルを設定するかをめぐる争いを止め、ちらつき。これは、次の MSDN で文書化されています。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms648393%28v=vs.85%29.aspx
クラスカーソルをnullに設定する必要があると説明している場所。しかし、それは私の知識が不足しているところです。:( 上記の記事で説明したように、クラス カーソルは SetClassLong で設定されます。
ただし、カーソルの新しい値のデータ型は IntPtr です。このデータ型は null 可能ではありません。null を渡すとコンパイラがエラーを出し、IntPtr.zero を渡しても機能しません。では、この記事のアドバイスをどのように達成すればよいでしょうか? P/Invoke を使用してクラス カーソルを null に設定するにはどうすればよいですか?