加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 获取startmenu的屏幕截图

发布时间:2020-12-15 03:02:52 所属栏目:Java 来源:网络整理
导读:我正在使用bitblt捕获一个窗口.如果启用了航空主题,则捕获图像的背景为黑色.如果我禁用DWM并捕获窗口,则捕获的图像非常好. 这是我的代码的一部分. HDC hdcMemDC = GDI32.INSTANCE.CreateCompatibleDC(desktopDC);HDC windowDC = User32.INSTANCE.GetDC(windo
我正在使用bitblt捕获一个窗口.如果启用了航空主题,则捕获图像的背景为黑色.如果我禁用DWM并捕获窗口,则捕获的图像非常好.

这是我的代码的一部分.

HDC hdcMemDC = GDI32.INSTANCE.CreateCompatibleDC(desktopDC);
HDC windowDC = User32.INSTANCE.GetDC(window);

HWND window= User32Extra.INSTANCE.FindWindow(null,"Start menu");

GDI32Extra.INSTANCE.BitBlt(hdcMemDC,width,height,desktopDC,WinGDIExtra.SRCCOPY );
GDI32Extra.INSTANCE.BitBlt(hdcMemDC,windowBounds.left,windowBounds.top,windowWidth,windowHeight,windowDC,windowBounds.left+windowBounds1.right-windowBounds.right+(windowExtraGap/2),windowBounds.top+windowBounds1.bottom-windowBounds.bottom+(windowExtraGap/2),WinGDIExtra.SRCCOPY);

如何捕获具有适当背景的开始菜单?

有没有其他方法可以获得适当的航空窗口图像?

解决方法

使用桌面DC和切割到窗口
RECT rc,rc2;
GetClientRect(hWnd,&rc);
GetWindowRect(hWnd,&rc2);
int width = rc2.right - rc2.left;
int height = rc2.bottom - rc2.top;
HDC hdcScreen = GetDC(NULL); //!!!! Get desktop DC

HDC     hBmpFileDC = CreateCompatibleDC(hdcScreen);
HBITMAP hBmpFileBitmap = CreateCompatibleBitmap(hdcScreen,height);
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hBmpFileDC,hBmpFileBitmap);
BitBlt(hBmpFileDC,hdcScreen,rc2.left,rc2.top,SRCCOPY | CAPTUREBLT);
HGDIOBJ prev = SelectObject(hBmpFileDC,hOldBitmap);

SaveBitmap(szLogFilename,hBmpFileBitmap);

DeleteDC(hBmpFileDC);
DeleteObject(hBmpFileBitmap);

另一种变体

RECT rc;
GetClientRect(hWnd,&rc);

int width = rc.right - rc.left;
int height = rc.bottom - rc.top;

HDC hdcScreen = GetDC(hWnd);
////////////////////////////
PrintWindow(hWnd,0);
PrintWindow(hWnd,PW_CLIENTONLY);
////////////////////////////    
HDC     hBmpFileDC = CreateCompatibleDC(hdcScreen);
HBITMAP hBmpFileBitmap = CreateCompatibleBitmap(hdcScreen,hBmpFileBitmap);

DeleteDC(hBmpFileDC);
DeleteObject(hBmpFileBitmap);

在调用任何捕获方法之前我调用PrintWindow.它用于重绘自身的窗口.因此,屏幕截图将具有正确的图片.我通过PrintWindow的双重调用获得了最稳定的结果.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读