为何截图截不到开始菜单栏

undead4444 2009-11-03 03:50:42
用的网上常见的PlatFormInvokeGDI32.cs和PlatformInvokeUSER32.cs类。
截图后,图片分辨率是320*240的没错,但是截不到开始菜单,底栏下面空出一条黑色,不知为何。

public static Bitmap GetDesktopImage()
{
SIZE size;
IntPtr hBitmap;
IntPtr hDC = PlatformInvokeUSER32.GetDC(PlatformInvokeUSER32.GetDesktopWindow());
IntPtr hMemDC = PlatformInvokeGDI32.CreateCompatibleDC(hDC);

size.cx = PlatformInvokeUSER32.GetSystemMetrics(PlatformInvokeUSER32.SM_CXSCREEN);
size.cy = PlatformInvokeUSER32.GetSystemMetrics(PlatformInvokeUSER32.SM_CYSCREEN);

hBitmap = PlatformInvokeGDI32.CreateCompatibleBitmap(hDC, size.cx, size.cy);
if (hBitmap != IntPtr.Zero)
{
IntPtr hOld = (IntPtr)PlatformInvokeGDI32.SelectObject(hMemDC, hBitmap);
PlatformInvokeGDI32.BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, 0, 0, PlatformInvokeGDI32.SRCCOPY);
PlatformInvokeGDI32.SelectObject(hMemDC, hOld);
PlatformInvokeGDI32.DeleteDC(hMemDC);
PlatformInvokeUSER32.ReleaseDC(PlatformInvokeUSER32.GetDesktopWindow(), hDC);
Bitmap bmp = System.Drawing.Image.FromHbitmap(hBitmap);
PlatformInvokeGDI32.DeleteObject(hBitmap);
GC.Collect();
return bmp;
}
return null;
}
...全文
191 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
undead4444 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 erwintao 的回复:]
你试试看这个方法,我用在mobile上面获取屏幕的。跟你的略有不同。

C# code
[DllImport("coredll.dll")]externpublicstatic Int32 BitBlt(IntPtr hdcDest, Int32 xDest, Int32 yDest, Int32 wDest, Int32 hDest, IntPtr hdcSrc, Int32 xSrc, Int32 ySrc, Int64 dwRop);publicconst Int64 SRCCOPY=0x00CC0020;/* dest = source*/publicconst Int64 SRCPAINT=0x00EE0086;/* dest = source OR dest*/publicconst Int64 SRCAND=0x008800C6;/* dest = source AND dest*/publicconst Int64 SRCINVERT=0x00660046;/* dest = source XOR dest*/publicconst Int64 SRCERASE=0x00440328;/* dest = source AND (NOT dest )*/publicconst Int64 NOTSRCCOPY=0x00330008;/* dest = (NOT source)*/publicconst Int64 NOTSRCERASE=0x001100A6;/* dest = (NOT src) AND (NOT dest)*/publicconst Int64 MERGECOPY=0x00C000CA;/* dest = (source AND pattern)*/publicconst Int64 MERGEPAINT=0x00BB0226;/* dest = (NOT source) OR dest*/publicconst Int64 PATCOPY=0x00F00021;/* dest = pattern*/publicconst Int64 PATPAINT=0x00FB0A09;/* dest = DPSnoo*/publicconst Int64 PATINVERT=0x005A0049;/* dest = pattern XOR dest*/publicconst Int64 DSTINVERT=0x00550009;/* dest = (NOT dest)*/publicconst Int64 BLACKNESS=0x00000042;/* dest = BLACK*/publicconst Int64 WHITENESS=0x00FF0062;/* dest = WHITE*/


[System.Runtime.InteropServices.DllImportAttribute("coredll.dll")]publicstaticextern IntPtr CreateDC(string lpszDriver,// 驱动名称string lpszDevice,// 设备名称string lpszOutput,// 无用,可以设定位"NULL" IntPtr lpInitData// 任意的打印机数据 );private Bitmap g_Image_LastScreen;// this.g_Image_LastScreen = new Bitmap(240, 320);privatevoid GetDisplay2Buffer()
{
IntPtr mainDC= CreateDC("DISPLAY",null,null, (IntPtr)null);//创建显示器的DC Graphics gxSrc= Graphics.FromHdc(mainDC);//由一个指定设备的句柄创建一个新的Graphics对象//通过下面代码就可以实现此功能:
Graphics gxDes= Graphics.FromImage(g_Image_LastScreen);//(3).获得当前屏幕和位图的句柄://获得此二个对象的句柄是为了下一步实现对当前屏幕图象的捕获,程序中实现的具体捕获的方法是把当前屏幕捕获到已经创建的位图对象中。具体实现代码如下://获得屏幕的句柄 IntPtr hDC_Src= gxSrc.GetHdc();//获得位图的句柄 IntPtr hDC_Des= gxDes.GetHdc();//把当前屏幕捕获到位图对象中 BitBlt(hDC_Des,0,0,240,320, hDC_Src,0,0, SRCCOPY);
gxSrc.ReleaseHdc(hDC_Src);//释放屏幕句柄 gxDes.ReleaseHdc(hDC_Des);//释放位图句柄 }
[/Quote]
感谢分享,楼上的方法非常好使。。各种版本的wm机测试通过。。
erwintao 2009-11-03
  • 打赏
  • 举报
回复
你试试看这个方法,我用在mobile上面获取屏幕的。跟你的略有不同。


[DllImport("coredll.dll")]
extern public static Int32 BitBlt(IntPtr hdcDest, Int32 xDest, Int32 yDest, Int32 wDest, Int32 hDest, IntPtr hdcSrc, Int32 xSrc, Int32 ySrc, Int64 dwRop);
public const Int64 SRCCOPY = 0x00CC0020; /* dest = source */
public const Int64 SRCPAINT = 0x00EE0086; /* dest = source OR dest */
public const Int64 SRCAND = 0x008800C6; /* dest = source AND dest */
public const Int64 SRCINVERT = 0x00660046; /* dest = source XOR dest */
public const Int64 SRCERASE = 0x00440328; /* dest = source AND (NOT dest ) */
public const Int64 NOTSRCCOPY = 0x00330008; /* dest = (NOT source) */
public const Int64 NOTSRCERASE = 0x001100A6; /* dest = (NOT src) AND (NOT dest) */
public const Int64 MERGECOPY = 0x00C000CA; /* dest = (source AND pattern) */
public const Int64 MERGEPAINT = 0x00BB0226; /* dest = (NOT source) OR dest */
public const Int64 PATCOPY = 0x00F00021; /* dest = pattern */
public const Int64 PATPAINT = 0x00FB0A09; /* dest = DPSnoo */
public const Int64 PATINVERT = 0x005A0049; /* dest = pattern XOR dest */
public const Int64 DSTINVERT = 0x00550009; /* dest = (NOT dest) */
public const Int64 BLACKNESS = 0x00000042; /* dest = BLACK */
public const Int64 WHITENESS = 0x00FF0062; /* dest = WHITE */


[System.Runtime.InteropServices.DllImportAttribute("coredll.dll")]
public static extern IntPtr CreateDC(
string lpszDriver, // 驱动名称
string lpszDevice, // 设备名称
string lpszOutput, // 无用,可以设定位"NULL"
IntPtr lpInitData // 任意的打印机数据
);


private Bitmap g_Image_LastScreen;
// this.g_Image_LastScreen = new Bitmap(240, 320);

private void GetDisplay2Buffer()
{
IntPtr mainDC = CreateDC("DISPLAY", null, null, (IntPtr)null);
//创建显示器的DC
Graphics gxSrc = Graphics.FromHdc(mainDC);
//由一个指定设备的句柄创建一个新的Graphics对象

//通过下面代码就可以实现此功能:

Graphics gxDes = Graphics.FromImage(g_Image_LastScreen);

//(3).获得当前屏幕和位图的句柄:

//获得此二个对象的句柄是为了下一步实现对当前屏幕图象的捕获,程序中实现的具体捕获的方法是把当前屏幕捕获到已经创建的位图对象中。具体实现代码如下:

//获得屏幕的句柄
IntPtr hDC_Src = gxSrc.GetHdc();
//获得位图的句柄
IntPtr hDC_Des = gxDes.GetHdc();
//把当前屏幕捕获到位图对象中
BitBlt(hDC_Des, 0, 0, 240, 320, hDC_Src, 0, 0, SRCCOPY);
gxSrc.ReleaseHdc(hDC_Src);
//释放屏幕句柄
gxDes.ReleaseHdc(hDC_Des);
//释放位图句柄
}

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧