QQ
抓图功能的提取
一直以来,我都觉得
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;
}