牛牛截圖現已完美支持多顯示器及DPI放大的場景,歡迎試用。
牛牛截圖控件已經提供Web控件及標準的Javascript接口,測試程序及調用示例請訪問:http://www.ggniu.cn/
在上一個版本發佈後,收到非常多朋友的反饋,近期有了些時間,對控件進行了升級;同時對比測試了幾大主流的截圖功能,除了騰訊QQ最新版,其他如360、旺旺、人生日曆截圖等,均對DPI放大的支持不是很好,多顯示器支持我僅測試了騰訊,其他的實現不清楚。
上一個版本的鏈接請見:
http://blog.csdn.net/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