如何使用Binary-AND检查是否为IntPtr
对象设置了特定位?
我正在调用GetWindowLongPtr32()
API来获取窗口的窗口样式。此函数恰好返回IntPtr。我在程序中定义了所有标志常量。现在假设我想检查是否设置了一个特定的标志(比如WS_VISIBLE
),我需要使用我的常量二进制和它,但我的常量是int
类型,所以我不能这样做直。尝试调用ToInt32()
和ToInt64()
都会导致(ArgumentOutOfRangeException)异常。我的出路是什么?
答案 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#
您可以隐式转换IntPtr
到int
以获得结果。
var result = (int)GetWindowLong(theprocess.MainWindowHandle, GWL_STYLE);
bool isVisible = ((result & WS_VISIBLE) != 0);