QQ抓图功能的提取(dll使用示例)
QQ抓圖功能的提取
sjdev
一直以來,我都覺得QQ的抓圖功能做的非常好。特別是在我寫文檔時,一次又一次的“Print Screen”,一次又一次的“mspaint”讓我不勝其煩,“Ctrl+Alt+A”(騰訊QQ抓圖快捷鍵)給了我不小的幫助。有時我想,能不能把QQ的抓圖功能提取出來?這樣的話,不用登陸QQ也可以使用其抓圖功能,這樣會大大方便那些不能上網的人。網上一搜,果然“有法可依”。
QQ2006的安裝目錄下,有一個名叫CameraDll.dll的動態庫,它有一個導出函數CameraSubArea,QQ的抓圖功能就是由這個函數實現的。我們可以這么使用這個函數:
打開一個文本文件,輸入:rundll32.exe CameraDll.dll CameraSubArea, 將它保存為一個.bat文件,然后把它和CameraDll.dll放到同一個目錄,運行這個批處理就可以使用抓圖功能了。
然而我們發現,這樣來使用其抓圖功能有點麻煩,因為每次都要點擊那個批處理文件,那有沒有簡單的辦法呢?辦法是有的,那就是給這個批處理文件創建一個快捷方式,然后給這個快捷方式指定一個快捷鍵,這樣一來,每次點擊相應的快捷鍵時,就可以進行抓圖操作了。
我們可以看到,上面的方案,需要用到三個文件才能解決問題,這樣容易出問題,萬一哪個人不小心把其中一個文件給刪除了,就用不了了。那有沒有辦法只用一個文件搞定所有問題?當然可以,下面要講的就是。
使用VC創建一個程序,把CameraDll.dll當做資源導進去,在需要的時候把它釋放出來,然后調用其中的函數就可以了。代碼本就簡單,此處就不再多費口舌。還有其它一些方便的特性,譬如最小化時拖盤顯示譬如開機自動運行譬如自定義快捷鍵等等,程序中并沒有加入,有興趣的朋友可以自行增加。全部代碼提供下載QQ抓圖功能提取源代碼
注1:下面的代碼已經使用ATL進行完全的重寫,因為已經找不到以前的代碼。另外,程序中使用的抓圖的動態庫,也不是上面所說的QQ2006中的CameraDll.dll而是騰訊TT瀏覽器目錄下的抓圖動態庫CameraDll.dll(也是同樣的名字,而且功能一樣,只是顯示的圖片不一樣)。抓圖動態庫中,同樣還有一個很有用的功能:CameraWindowLikeSpy,感興趣的朋友可以將上面所說的批處理程序中的函數名進行修改,然后運行即可看到效果。
注2:所有版權歸QQ所在公司所有,凡涉及商業利益的,請不要使用。
全部代碼如下:
#include <atlbase.h>
CComModule _Module;
#include <atlwin.h>
#include "resource.h"
#include <stdio.h>
class CPowerSnapDlg:public CDialogImpl<CPowerSnapDlg>
{
public:
enum{IDD=IDD_DLG_POWERSNAP};
BEGIN_MSG_MAP(CPowerSnapDlg)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
MESSAGE_HANDLER(WM_HOTKEY, OnHotKey)
COMMAND_ID_HANDLER(IDOK, OnOK)
COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
END_MSG_MAP()
private:
LRESULT OnInitDialog(UINT, WPARAM, LPARAM, BOOL&)
{
// 將主窗口居中顯示
CenterWindow();
TCHAR szTempPath[MAX_PATH];
GetTempPath(MAX_PATH, szTempPath);
TCHAR szTempFile[MAX_PATH] = _T("CameraDll.dll");
strcat(szTempPath, szTempFile);
// 我們將QQ抓圖動態庫Camera.dll作為資源插入了
// 應用程序,此時需要查找到資源,然后才能使用。
HRSRC hRsrc
= ::FindResource(NULL,
MAKEINTRESOURCE(IDR_CAMERADLL),
"Dll");
if (hRsrc == NULL) {
// 查找資源出錯,需要退出程序...
}
// 簡單起見,也可以直接從文件屬性中讀取文件大小
//DWORD len = 90112;
DWORD len = SizeofResource(NULL, hRsrc);
BYTE* lpRsrc = (BYTE*)LoadResource(NULL, hRsrc);
if (lpRsrc == NULL) {
// 加載資源出錯,需要退出程序...
}
// 將資源中的QQ抓圖動態庫釋放到臨時文件
// 此處文件打開模式必須是b(二進制方式),否則會有意想不到的錯誤
FILE* file;
if ((file = fopen(szTempPath, "w+b")) == NULL) {
// 打開文件失敗,需要退出程序...
}
if (fwrite(lpRsrc, sizeof(BYTE), len, file) < len) {
// 寫入文件失敗,需要退出程序...
}
fclose(file);
// 注冊程序啟動快捷鍵
RegisterHotKey(m_hWnd,0,MOD_ALT | MOD_CONTROL,0x41);
strcpy(m_szCommand, szTempPath);
strcat(m_szCommand, _T(" CameraSubArea"));
return 0;
}
LRESULT OnOK(UINT,WPARAM,HWND,BOOL&)
{
ShowWindow(SW_HIDE);
return 0;
}
LRESULT OnCancel(UINT, WPARAM, HWND, BOOL&)
{
EndDialog(IDCANCEL);
return 0;
}
LRESULT OnHotKey(UINT, WPARAM, LPARAM, BOOL&)
{
ShellExecute(NULL, "open", "rundll32.exe", m_szCommand,NULL, NULL);
return 0;
}
private:
TCHAR m_szCommand[MAX_PATH];
};
int __stdcall WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
_Module.Init(NULL, hInst);
CPowerSnapDlg psDlg;
psDlg.DoModal();
_Module.Term();
return 0;
}
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/sjdev/archive/2007/07/08/1682668.aspx
總結
以上是生活随笔為你收集整理的QQ抓图功能的提取(dll使用示例)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常用文件格式十六进制文件头
- 下一篇: form组件