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

posted @ 2009-06-30 12:46  dzqabc  阅读(5609)  评论(0编辑  收藏  举报