win10设置自定义缩放级别后,截屏被放大的问题。 请大家研讨,看有解决办法没?回复就有分

only_delusion 2016-05-25 05:23:17


win10 将自定义缩放级别调整为 150% ,然后启用截屏代码 进行截屏 发现截图界面被放大了,无法获取全屏 只能获取屏幕的一部分。 应该是原图又被放大了150%的感觉。

请问有知道 如何解决这个问题么? QQ截屏就没有这个问题。
我知道一种方法可以解决,但是要再单起一个进程。调用SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE);这个函数后 可以解决,但是会导致当前进程界面 变成未放大的状态,所以不可取。

请问有办法不进行其他设置而能得到全屏的办法么?

代码如下

HBITMAP CxScreenShot::CopyScreenToBitmap2()
{
ssScreenDC.clear();
HWND desktop = GetDesktopWindow();
HDC desktopdc = ::GetDC(desktop);
CxRect rcSceen = CxGetAllScreenInfo();
ssScreenDC.hCmpDc = CreateCompatibleDC(desktopdc);
ssScreenDC.hCmpBmp = CreateCompatibleBitmap(desktopdc, rcSceen.Width(), rcSceen.Height());
HBITMAP oldbmp = (HBITMAP)SelectObject(ssScreenDC.hCmpDc, ssScreenDC.hCmpBmp);
BitBlt(ssScreenDC.hCmpDc,0,0,rcSceen.Width(),rcSceen.Height(),desktopdc,rcSceen.left,rcSceen.top, SRCCOPY|CAPTUREBLT);
::ReleaseDC(desktop,desktopdc);
return ssScreenDC.hCmpBmp;
}
...全文
5106 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dvlinker 2016-11-12
  • 打赏
  • 举报
回复
也可参考:http://blog.csdn.net/chenlycly/article/details/53142098
dvlinker 2016-11-12
  • 打赏
  • 举报
回复
我们也遇到这样的问题,已经找到解决办法了,参见:http://blog.csdn.net/chenlycly/article/details/53139564
cutmelon 2016-05-26
  • 打赏
  • 举报
回复
GDI截屏不会出现这种情况的吧,我做了个测试,能全部截下来,代码贴出来,楼主在自己的机器上试试看。 我建了个名叫TestCapture的工程,基于对话框的,截图用的GDI,用GDI+保存到文件,点确定按钮就截屏然后退出,我就只把Dlg.cpp贴出来了

// TestCaptureDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "TestCapture.h"
#include "TestCaptureDlg.h"
#include "afxdialogex.h"
#include <gdiplus.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


using namespace Gdiplus;

CLSID clsidPng;

int GetCodecClsid(const WCHAR* format,CLSID* pClsid)
{
	UINT  num=0;
	UINT  size=0;

	ImageCodecInfo* pImageCodecInfo=NULL;
	GetImageEncodersSize(&num,&size);
	if (size==0) return -1;

	pImageCodecInfo=new ImageCodecInfo[size];
	if (pImageCodecInfo==NULL)
	{
		delete[] pImageCodecInfo;
		return -1;
	}
	GetImageEncoders(num,size,pImageCodecInfo);
	for (UINT j=0;j<num;j++)
	{
		if (wcscmp(pImageCodecInfo[j].MimeType,format)==0)
		{
			*pClsid=pImageCodecInfo[j].Clsid;
			delete[] pImageCodecInfo;
			return j;
		}
	}
	delete[] pImageCodecInfo;
	return -1;
}

// CTestCaptureDlg 对话框



CTestCaptureDlg::CTestCaptureDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(IDD_TESTCAPTURE_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTestCaptureDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CTestCaptureDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED (IDOK,&CTestCaptureDlg::OnBnClickedOk)
END_MESSAGE_MAP()


// CTestCaptureDlg 消息处理程序

BOOL CTestCaptureDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	GdiplusStartupInput gdiplusStartupInput;
	ULONG_PTR           gdiplusToken;
	GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,NULL);
	GetCodecClsid(L"image/png",&clsidPng);

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CTestCaptureDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CTestCaptureDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

void CTestCaptureDlg::Capture()
{
	//桌面DC
	CDC* pDeskDC=GetDesktopWindow()->GetDC();
	//屏幕区域
	CRect rc;
	GetDesktopWindow()->GetClientRect(rc);

	//内存DC
	CDC  memDC;
	memDC.CreateCompatibleDC(pDeskDC);
	//兼容位图
	CBitmap bmp;
	bmp.CreateCompatibleBitmap(pDeskDC,rc.Width(),rc.Height());
	//选择位图对象
	memDC.SelectObject(&bmp);
	BITMAP bitmap;
	bmp.GetBitmap(&bitmap);

	//调色板
	int nPanelsize=0;
	//判断是否真彩色位图
	if (bitmap.bmBitsPixel<16)
		nPanelsize=(int)pow((double)2,(int)(bitmap.bmBitsPixel*sizeof(RGBQUAD)));

	//截屏
	BITMAPINFO *pBInfo=(BITMAPINFO*)LocalAlloc(LPTR,sizeof(BITMAPINFO)+nPanelsize);
	pBInfo->bmiHeader.biBitCount=bitmap.bmBitsPixel;
	pBInfo->bmiHeader.biClrImportant=0;
	pBInfo->bmiHeader.biCompression=0;
	pBInfo->bmiHeader.biHeight=bitmap.bmHeight;
	pBInfo->bmiHeader.biPlanes=bitmap.bmPlanes;
	pBInfo->bmiHeader.biSize=sizeof(BITMAPINFO);
	pBInfo->bmiHeader.biSizeImage=bitmap.bmWidthBytes*bitmap.bmHeight;
	pBInfo->bmiHeader.biWidth=bitmap.bmWidth;
	pBInfo->bmiHeader.biXPelsPerMeter=0;
	pBInfo->bmiHeader.biYPelsPerMeter=0;
	memDC.BitBlt(0,0,bitmap.bmWidth,bitmap.bmHeight,pDeskDC,0,0,SRCCOPY);

	//保存
	char* pData=new char[bitmap.bmWidthBytes*bitmap.bmHeight];
	::GetDIBits(memDC.m_hDC,bmp,0,bitmap.bmHeight,pData,pBInfo,DIB_RGB_COLORS);
	int nBufSize=nPanelsize+sizeof(BITMAPINFO)+bitmap.bmWidthBytes*bitmap.bmHeight;
	Bitmap* pImage=Bitmap::FromBITMAPINFO(pBInfo,pData);
	pImage->Save(_T("d:\\capture.png"),&clsidPng,NULL);

	//释放资源
	memDC.DeleteDC();
	pDeskDC->DeleteDC();
	if (pImage!=NULL) delete pImage;
	delete[] pData;
	::LocalFree((HLOCAL)pBInfo);
	bmp.DeleteObject();
}

void CTestCaptureDlg::OnBnClickedOk ()
{
	// TODO: 在此添加控件通知处理程序代码
	this->Capture();
	OnOK();
}
PS:虽然截屏用的MFC改成API也很简单,VS自动生成的代码自己略过吧。另外我用的VS2015,WIN10上跑正常
only_delusion 2016-05-25
  • 打赏
  • 举报
回复
哦,qq本来就支持啊. 那是没有解决办法了么?
dustpg 2016-05-25
  • 打赏
  • 举报
回复
引用 3 楼 lin98666lin 的回复:
[quote=引用 1 楼 dustpg 的回复:] 右键-兼容性-高DPI禁用缩放
有从代码层面解决这个问题的么,我看qq截图就没这问题。 相信你也是遇到过这问题,要不也不会回复这么快。[/quote] 我只是高DPI程序开发有点经验加上恰好看到而已。 代码用的就是SetProcessDpiAwareness,用户用的就是设置兼容性,还有就是使用manifest。 但是实质都一样,QQ那是本身支持高DPI(虽然支持得跟屎一样,但总比没有强)。 选一个支持高DPI的GUI架构才是真正的解决方案.先麻烦的话现在有HTML+CSS的桌面程序框架
only_delusion 2016-05-25
  • 打赏
  • 举报
回复
引用 1 楼 dustpg 的回复:
右键-兼容性-高DPI禁用缩放
有从代码层面解决这个问题的么,我看qq截图就没这问题。 相信你也是遇到过这问题,要不也不会回复这么快。
only_delusion 2016-05-25
  • 打赏
  • 举报
回复
这个和SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE);一样,会出现自己界面的窗口大小和字体大小变小,和其他程序界面相比看着特别不和谐、
dustpg 2016-05-25
  • 打赏
  • 举报
回复
右键-兼容性-高DPI禁用缩放

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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