运行32位时,此代码可以正常工作。但是,当我切换到64位GetObject
方法不起作用,BITMAP
结构是空的。运行64位时gdi32.GetObject不起作用
IntPtr hBmp = ObtainValidBitmapHandleFromSystem();
BITMAP bmpData = new BITMAP();
/* BITMAP consists of four 32bit ints,
* two 16 bit uints and one IntPtr */
* 4 + sizeof(UInt16) * 2 + IntPtr.Size;
int cbBuffer = sizeof(Int32) * 4 + sizeof(UInt16) * 2 + IntPtr.Size;
NativeMethods.GetObject(hBmp, cbBuffer, out bmpData);
Bitmap bmp = new Bitmap(bmpData.Width, bmpData.Height, PixelFormat.Format32bppPArgb);
本地方法实现:
private static class NativeMethods
{
[DllImport("gdi32", CharSet = CharSet.Auto)]
internal extern static int GetObject(
IntPtr hgdiobj, // handle to graphics object
int cbBuffer, // size of buffer for object information
out BITMAP lpvObject // Should be IntPtr, but we know we will use it only for BITMAP.
);
}
位图结构的实现(除去文档,以保持代码紧凑):
[StructLayoutAttribute(LayoutKind.Sequential)]
private struct BITMAP
{
public Int32 Type;
public Int32 Width;
public Int32 Height;
public Int32 WidthBytes;
public UInt16 Planes;
public UInt16 BitsPixel;
public IntPtr Bits;
}
此代码背后的想法是完全在本question描述。
起初我以为,这个问题是由不同大小的IntPtr
产生不同大小的cbBuffer
造成的,但似乎这是并非如此,因为改变cbBuffer
大小没有帮助。
什么是在64位系统上使用GDI的GetObject
方法的正确方法?
NativeMethods的外观如何? – Tigran 2013-04-11 13:38:09
@Tigran我编辑了我的问题以包含'NativeMethods'类的一部分。 – SiliconMind 2013-04-11 13:49:48
“不起作用”是什么意思?没有例外吗? – 2013-04-11 13:52:03