1

Binary-AND を使用して、特定のビットがIntPtrオブジェクトに設定されているかどうかを確認するにはどうすればよいですか?

GetWindowLongPtr32()ウィンドウのウィンドウ スタイルを取得するために API を呼び出しています。この関数はたまたま IntPtr を返します。プログラムですべてのフラグ定数を定義しました。ここで、特定のフラグ (たとえばWS_VISIBLE) が設定されているかどうかを確認したい場合、それを定数と Binary-AND する必要がありますが、定数はint型であるため、直接行うことはできません。呼び出してみるとToInt32()ToInt64()両方とも (ArgumentOutOfRangeException) 例外が発生します。私の抜け道は何ですか?

4

2 に答える 2

2

(変換演算子がある)に変換IntPtrし、int論理ビット演算子を使用してビットをテストします。

const int WS_VISIBLE = 0x10000000;
int n = (int)myIntPtr;
if((n & WS_VISIBLE) == WS_VISIBLE) 
    DoSomethingWhenVisible()`
于 2013-04-16T12:27:41.713 に答える
-1

32 ビット プラットフォームで GetWindowLongPtr と SetWindowLongPtr をピンボークするにはどうすればよいですか?

public static IntPtr GetWindowLong(HandleRef hWnd, int nIndex)
{
    if (IntPtr.Size == 4)
    {
        return GetWindowLong32(hWnd, nIndex);
    }
    return GetWindowLongPtr64(hWnd, nIndex);
}


[DllImport("user32.dll", EntryPoint="GetWindowLong", CharSet=CharSet.Auto)]
private static extern IntPtr GetWindowLong32(HandleRef hWnd, int nIndex);

[DllImport("user32.dll", EntryPoint="GetWindowLongPtr", CharSet=CharSet.Auto)]
private static extern IntPtr GetWindowLongPtr64(HandleRef hWnd, int nIndex);

GetWindowLong(int hWnd, GWL_STYLE) c# で奇妙な数値を返す

結果を取得するためにIntPtr暗黙的にキャストできます。int

var result = (int)GetWindowLong(theprocess.MainWindowHandle, GWL_STYLE);
bool isVisible = ((result & WS_VISIBLE) != 0);
于 2013-04-16T12:39:12.403 に答える