比特屏蔽IntPtr

时间:2013-04-16 12:13:50

标签: c# bitmask intptr

如何使用Binary-AND检查是否为IntPtr对象设置了特定位?

我正在调用GetWindowLongPtr32() API来获取窗口的窗口样式。此函数恰好返回IntPtr。我在程序中定义了所有标志常量。现在假设我想检查是否设置了一个特定的标志(比如WS_VISIBLE),我需要使用我的常量二进制和它,但我的常量是int类型,所以我不能这样做直。尝试调用ToInt32()ToInt64()都会导致(ArgumentOutOfRangeException)异常。我的出路是什么?

2 个答案:

答案 0 :(得分:2)

只需将IntPtr转换为int(它有转换运算符)并使用逻辑位运算符来测试位。

const int WS_VISIBLE = 0x10000000;
int n = (int)myIntPtr;
if((n & WS_VISIBLE) == WS_VISIBLE) 
    DoSomethingWhenVisible()`

答案 1 :(得分:-1)

How do I pinvoke to GetWindowLongPtr and SetWindowLongPtr on 32-bit platforms?

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) return weird numbers in c#

您可以隐式转换IntPtrint以获得结果。

var result = (int)GetWindowLong(theprocess.MainWindowHandle, GWL_STYLE);
bool isVisible = ((result & WS_VISIBLE) != 0);