• 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

  • 相关阅读:
    Eclipse SVN 安装注意事项
    Linux添加环境变量与GCC编译器添加INCLUDE与LIB环境变量
    Linux下各种常见环境变量的配置
    Linux下用dump实现备份和还原 ux下用dump实现备份和还原
    Linux dd——备份命令
    linux cpio 备份命令
    Linux服务器的常用备份方法
    tar备份系统
    tar备份系统的方法
    LINUX系统备份
  • 原文地址:https://www.cnblogs.com/dongzhiquan/p/1994822.html
Copyright © 2020-2023  润新知