牛牛截图现已完美支持多显示器及DPI放大的场景,欢迎试用。
牛牛截图控件已经提供Web控件及标准的Javascript接口,测试程序及调用示例请访问:http://www.ggniu.cn/
在上一个版本发布后,收到非常多朋友的反馈,近期有了些时间,对控件进行了升级;同时对比测试了几大主流的截图功能,除了腾讯QQ最新版,其他如360、旺旺、人生日历截图等,均对DPI放大的支持不是很好,多显示器支持我仅测试了腾讯,其他的实现不清楚。
上一个版本的链接请见:
http://blog.youkuaiyun.com/tragicguy/article/details/20741077
以下是牛牛截图控件2.0的相关介绍:
1. 本控件实现的基本功能及特点如下
1).支持窗口区域的自动识别
2).支持矩形、圆形、箭头、文字、画刷、荧光笔的绘制以及撤销
3).可另存为png、jpg、bmp等格式
4).支持鼠标所在区域的图像放大功能,以便精准定位
5).窗口大小、鼠标坐标显示以及光标处的颜色拾取
6).采用C++语言开发的Win32动态库,大小为152KB
7).支持XP、WIN7、WIN8及WIN2003、WIN2008等操作系统;
8).此控件提供标准的接口,方便集成进其他软件中;
例如可以与浏览器控件整合,实现Web页面截图的功能,也可以与其他如即时通讯等其他任何系统中
2. 本次控件升级的更新项
1). 修复了原有文字功能bug,防止文字丢失的情况
2). 修复了对设置了透明属性的窗口不能截取的bug
3). 增加了荧光笔功能
4). 优化了箭头功能
5). 扩展了放大镜的显示效果,一种是跟随鼠标,一种是跟随选中区域
6). 其他一此细节体验优化
7). 增加对保存时的默认文件名进行设置的功能
8). 增加对多显示器的支持
9). 增加对DPI放大的支持 [ 需要在调用程序中设置 ]
效果图如下:
3. 控件接口的使用方法
最新控件有三个接口:InitCaptureParam,StartScreenCapture以及InitScreenCapture,
InitScreenCapture是为了兼容旧版本的控件,在此不做过多说明。
具体可以参考调用Capturedemo_source.rar【下载地址见文章末尾】,接口的具体描述如下:
1).参数初始化接口
int InitCaptureParam(int flag,unsignedlong flagvalue);
此接口函数用于初始化截图各个状态下的界面的显示效果,如果不调用,则以默认值处理。
参数说明:
参数名 | 参数类型 | 参数说明 | 备注 |
flag | int | 要设置的参数项 | 此处对应的枚举ExtendFlagTypeEnum的整形值 |
flagvalue | unsigned long | 设置的参数值 | 根据不同的枚举来设置不同的值 |
枚举定义如下:
typedef enum ExtendFlagTypeEnum
{
emPensize = 1, //
emDrawType, //
emTrackColor, //
emEditBorderColor, //
emTransparent, //
emWindowAware,
emDetectSubWindowRect,
emSetSaveName,
};
枚举项的说明如下:
枚举参数名 | 枚举对应数值 | 参数值说明 | 备注 |
emPensize | 1 | 设置画笔大小 | 如不设置,默认为2 |
emDrawType | 2 | 设置是腾讯风格还是360风格 | 0表示腾讯风格,1表示360风格 |
emTrackColor | 3 | Track及自动识别的边框的颜色 | 如:RGB(255, 0, 0) |
emEditBorderColor | 4 | 文本输入的边框颜色 | 如:RGB(0, 174, 255) |
emTransparent | 5 | 工具栏的透明度 | 默认为220 |
emWindowAware | 6 | 设置是否禁用随着DPI放大,flagvalue传递任意值均可 | 此项设置非常重要,相当于调用SetProcessDPIAware,如果不设置,在高DPI的环境下,截图将会错乱 |
emDetectSubWindowRect | 7 | 是否自动检测子窗口,暂时无用 | 未使用 |
emSetSaveName | 8 | 设置保存时的文件名称 | 如: const char* szName = "测试名"; InitCaptureParam(emSetSaveName, (unsigned long) szName); |
2).启动截图接口:
int StartScreenCapture(constchar* szAuth,constchar* szDefaultSavePath,void* pCallBack,unsignedlong hWndNotice,unsignedint noticeMsg);
参数说明:
参数名 | 参数类型 | 参数说明 | 备注 |
szAuth | 字符串 | 用于调用控件时的授权 | 目前固定传入”niuniu”即可 |
szDefaultSavePath | 字符串 | 用于指定在截图完成时自动保存的文件路径 | 如:c:\\test.jpg,如果此字符串为空,则完成时将只写入剪贴板 |
pCallBack | Void* | 用于指定在截图完成时自动回调的函数 | 用于通知调用程序截图完成 |
hWndNotice | UINT | 用于指定截图完成时发送通知的窗口句柄及发送的消息 | 用于通知调用程序截图完成,截图完成时,控件将会发送消息: ::PostMessage(hWndNotice, noticeMsg, 1, 1); |
noticeMsg | UINT |
可以在程序中使用LoadLibrary的方式加载此控件,进行初始化后,直接调用启动截图的函数即可:
typedef int (*FnStartScreenCapture)(constchar* szAuth, const char* szDefaultSavePath, void*pCallBack, unsignedlong hWndNotice,unsigned int noticeMsg);
FnStartScreenCapture m_StartScreenCapture = NULL;
typedef int (*FnInitCaptureParam)(int flag, unsigned long flagvalue);
FnInitCaptureParam gl_InitCaptureParam = NULL;
m_hModule = LoadLibrary("NiuniuCapture.dll");
m_StartScreenCapture = (FnStartScreenCapture)GetProcAddress(m_hModule,"StartScreenCapture");
gl_InitCaptureParam = (FnInitCaptureParam)GetProcAddress(m_hModule, " InitCaptureParam ");
gl_InitCaptureParam(ExtendFlagTypeEnum::emPensize,2); //画笔线宽
gl_InitCaptureParam(ExtendFlagTypeEnum::emDrawType,0); //设置放大镜风格:0:腾讯风格 1:360风格
gl_InitCaptureParam(ExtendFlagTypeEnum::emTrackColor,RGB(255, 0, 0)); //自动识别的边框颜色
gl_InitCaptureParam(ExtendFlagTypeEnum::emEditBorderColor,RGB(0, 174, 255)); //文字编辑框边框颜色
gl_InitCaptureParam(ExtendFlagTypeEnum::emTransparent,240); //设置工具栏窗口透明度
const char* szSavePath = "测试截图名";
gl_InitCaptureParam(ExtendFlagTypeEnum::emSetSaveName,(unsigned long)szSavePath); //设置保存时的开始文字
gl_InitCaptureParam(ExtendFlagTypeEnum::emWindowAware,1); //此函数必需窗口创建前调用,其等同于如下代码
其中 gl_InitCaptureParam(ExtendFlagTypeEnum::emWindowAware,1); 等同于调用如下代码,通过这段代码调用后,应用程序将不随DPI进行放大,在设置了DPI放大的机器上,需要调用此API;一定要在窗口创建前进行调用,建议放在应用程序最开始初始化的地方:
HINSTANCE hUser32 = LoadLibrary( "user32.dll" );
if( hUser32 )
{
typedef BOOL ( WINAPI* LPSetProcessDPIAware )( void );
LPSetProcessDPIAware pSetProcessDPIAware = (LPSetProcessDPIAware )GetProcAddress(hUser32, "SetProcessDPIAware" );
if( pSetProcessDPIAware )
{
pSetProcessDPIAware();
}
FreeLibrary( hUser32 );
}
通过如下代码启动截图:
m_StartScreenCapture("niuniu","", NULL, (unsigned long)m_hWnd, WM_USER + 1111);
4. 关于在设置了DPI放大的环境下使用的进一步说明
在设置了DPI放大的系统下[WIN7以上],桌面窗口会被Windows进行虚拟放大,这会导致截取的图片是放大后的,本控件采取的方式是调用SetProcessDPIAware来禁止程序的界面随API放大,所以强烈建议您在使用本控件时,在程序初始化的地方,调用一下控件提供的此设置的接口,或者自行调用SetProcessDPIAware。
如果您的程序是需要让Windows来进行放大处理,不能调用SetProcessDPIAware,您可以针对截图单独启动一个进程,在这个进程中来调用截图控件进行截图。
5. 对于多显示器以及DPI放大支持实现的简要技术说明
1).在多显示器共用的情况下,获取桌面截图不能只考虑一个监视器,截取桌面时,获取DC应该通过:
HDC hdc = ::GetDC(::GetDesktopWindow());
2).同时桌面的原点不一定是(0,0),有可能是负值[取决于哪个是主显示器],获取桌面尺寸及原点应该通过如下方式获取:
gl_nScreenWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
gl_nScreenHeight= GetSystemMetrics(SM_CYVIRTUALSCREEN);
gl_nScreenXStart = GetSystemMetrics(SM_XVIRTUALSCREEN ); //可能为负值
gl_nScreenYStart= GetSystemMetrics(SM_YVIRTUALSCREEN ); //可能为负值
3).在取得桌面截图,进行二次编辑的时候,是以(0,0)作为原点来绘制的,故在获取到窗口区域以及通过GetCursorPos得到鼠标位置后,需要针对系统原点gl_nScreenXStart及 gl_nScreenYStart进行偏移处理,否则在绘制自动识别边框及涂鸦时会不准确。
4).在DPI放大的环境中,设置了SetProcessDPIAware的情况下,通过GetWindowRect得到的窗口区域对于部分窗口会不准确,需要利用DwmGetWindowAttribute,通过参数DWMWA_EXTENDED_FRAME_BOUNDS来获取。
最新升级更新[2015-03-14]:
1).优化了WIN8下的窗口识别
2). 优化了文字字号选择下拉框的显示效果
3). 调整了放大镜的显示,支持在放大镜上显示LOGO文字,并且提供设置的接口
4). 缩减体积至145KB
5). 工具栏拆分成两个窗口显示,调整工具栏效果与QQ、360等主流截图工具一致
牛牛截图控件已经提供Web控件及标准的Javascript接口,测试程序及调用示例请访问:http://www.ggniu.cn/
如果有任何意见建议,请联系QQ:182534287