- PR -

Windows API呼び出しにおける NULL指定について

投稿者投稿内容
Leo
会議室デビュー日: 2008/11/11
投稿数: 13
投稿日時: 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);

よろしくお願いします。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2008-12-18 21:14
引用:

以下のようにクリア用の宣言を二重に追加するしか方法はないのでしょうか?



です。
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2008-12-18 21:20
RECT を class にするってのも考えられますがまぁオーバーロードしたほうがいいかと

Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2008-12-18 21:27
今回に限って言えばそもそも Cursor.Clip プロパティで十分な気が
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2008-12-18 21:30
コード:
// StructLayoutの指定が重要
[StructLayout(LayoutKind.Sequential)]
private class Rect
{
    public int left; 
    public int top;
    public int right;
    public int bottom;
}

// APIの宣言はrefをはずす
[DllImport("user32.dll")] 
private extern static int ClipCursor(Rect lpRect); 


// 矩形に制限
ClipCursor(ref rect);
// 制限解除
ClipCursor(null);



で一応いけます。overloadの方がわかりやすいのでいいと思いますが。
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2008-12-19 09:32
…ああ。朝起きて読み返してなんで迷っているか気づきました。

パラメータの型が違う場合同じ名前のメソッドが定義できます(オーバーロード)。つまり、

コード:

[DllImport("user32.dll")]
private extern static int ClipCursor(ref Rect lpRect); 
[DllImport("user32.dll")]
private extern static int ClipCursor(IntPtr lpRect);




のようにして、

コード:

Rect rect; (rectの設定は省略) 
ClipCursor(ref rect);
ClipCursor(IntPtr.Zero);




は実現できます。
Leo
会議室デビュー日: 2008/11/11
投稿数: 13
投稿日時: 2008-12-19 11:57
みなさん、回答ありがとうございます。大変勉強になります。

まず、NULLを渡すということは、「struct(値型)では無理」ということですね。
それで、解決策としては、Rectをclass(参照型)で宣言することにより、
引数にNULL指定ができると。なるほど。

そして他の解決方法として、
Rectはstruct(値型)のままとし、NULLも対応可能な2種の関数をオーバーロードしても対応可能であると。こちらの方がスマートな感じですね。

--
.NET Frameworkは結構便利なクラスが用意されていますね。 > Cursor.Clip
これからは、Windows APIをすぐに利用するのではなく、.NET のクラスも事前に調査したいと思います。

ありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-12-19 12:00
引用:

Leoさんの書き込み (2008-12-19 11:57) より:
--
.NET Frameworkは結構便利なクラスが用意されていますね。 > Cursor.Clip
これからは、Windows APIをすぐに利用するのではなく、.NET のクラスも事前に調査したいと思います。


オンラインの方の API 説明を見ると、対応する .NET Framework のクラス、メソッドが書いてあったりするものがあります。

スキルアップ/キャリアアップ(JOB@IT)