1

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

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

4

2 回答 2

2

只需转换IntPtrint(它有一个转换运算符)并使用逻辑位运算符来测试位。

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 回答