- - PR -
Windows API呼び出しにおける NULL指定について
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-12-18 20:12
ClipCursor API(※)をC#から呼び出そうとしています。
※ ClipCursorは、マウスカーソルの矩形の範囲内に制限する関数。 解除するときは、NULLを指定する。 ClipCursor引数にRect型の変数を指定する分には問題ないのですが、 ClipCursorの制限を解除する際、Rect型ではないNULL相当を引数を渡す必要があります。 この場合、どのようにすればよろしいでしょうか? -- [DllImport("user32.dll")] private extern static int ClipCursor(ref Rect lpRect); のようにして、 Rect rect; (rectの設定は省略) ClipCursor(ref rect); … OK ClipCursor(IntPtr.Zero); … NG -- 以下のようにクリア用の宣言を二重に追加するしか方法はないのでしょうか? [DllImport("user32.dll", EntryPoint="ClipCursor")] private extern static int ClipCursorClear(IntPtr lpRect); よろしくお願いします。 | ||||||||
|
投稿日時: 2008-12-18 21:14
です。 | ||||||||
|
投稿日時: 2008-12-18 21:20
RECT を class にするってのも考えられますがまぁオーバーロードしたほうがいいかと
| ||||||||
|
投稿日時: 2008-12-18 21:27
今回に限って言えばそもそも Cursor.Clip プロパティで十分な気が
| ||||||||
|
投稿日時: 2008-12-18 21:30
で一応いけます。overloadの方がわかりやすいのでいいと思いますが。 | ||||||||
|
投稿日時: 2008-12-19 09:32
…ああ。朝起きて読み返してなんで迷っているか気づきました。
パラメータの型が違う場合同じ名前のメソッドが定義できます(オーバーロード)。つまり、
のようにして、
は実現できます。 | ||||||||
|
投稿日時: 2008-12-19 11:57
みなさん、回答ありがとうございます。大変勉強になります。
まず、NULLを渡すということは、「struct(値型)では無理」ということですね。 それで、解決策としては、Rectをclass(参照型)で宣言することにより、 引数にNULL指定ができると。なるほど。 そして他の解決方法として、 Rectはstruct(値型)のままとし、NULLも対応可能な2種の関数をオーバーロードしても対応可能であると。こちらの方がスマートな感じですね。 -- .NET Frameworkは結構便利なクラスが用意されていますね。 > Cursor.Clip これからは、Windows APIをすぐに利用するのではなく、.NET のクラスも事前に調査したいと思います。 ありがとうございました。 | ||||||||
|
投稿日時: 2008-12-19 12:00
オンラインの方の API 説明を見ると、対応する .NET Framework のクラス、メソッドが書いてあったりするものがあります。 |