文件夹变形 各位观众,欢迎来到全金属的编程讲座。今天我们讲的是文件夹的变形大法。
怎么样?文件夹变成回收站了!不信?双击进入试试,里面真的是回收站哦。神奇吧!看过本文,你不但能变文件夹为回收站,还可以将它变成各种稀奇古怪的东东! 系统环境:Windows Server 2003 Enterprice Eidtion
那么来看看Main_Proc吧,它是对话框的消息处理函数: BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { //BEGIN MESSAGE CRACK HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog); //初始化的消息 HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand); //发给控件们的消息 HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose); //关闭对话框的消息 //END MESSAGE CRACK } return FALSE; } 这里要重点介绍HANDLE_MSG宏,它可以简化你的程序,它在<windowsx.h> 中。说明如下: #define HANDLE_MSG(hwnd, message, fn) \ case (message): return HANDLE_##message((hwnd), (wParam), (lParam), (fn)) 这个宏的作用是双重的:首先它消除了冗长的Case 语句,这种 Case 语句在标准的WndProc中实在令人烦恼,再者它使你摆脱必须传送消息处理函数返回值的责任。所以,这里Main_OnInitDialog是WM_INITDIALOG对应的消息处理函数,Main_OnCommand和Main_OnClose也是如此。Main_OnClose很简单,就是EndDialog。Main_OnInitDialog代码如下: BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) { HWND hCombo=GetDlgItem(hwnd,IDC_TYPE) ;//IDC_TYPE是一个ComboBox的ID,这个函数可以取得特定ID的控件的句柄 SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)"回收站");//第一项 SendMessage(hCombo,CB_ADDSTRING,1,(LPARAM)"控制面板");//第二项 SendMessage(hCombo,CB_ADDSTRING,2,(LPARAM)"计划任务");//第三项 SendMessage(hCombo,CB_SETCURSEL,0,0);//把第一项 回收站 作为默认项放进Combobox的文本框. return TRUE; } 初始化的作用是为下拉列表框加入列表项,我这里加了5项,指可以伪装成5种不同的外形。这三种外形的代码我放到一个全局数组中: char DefaultType[5][125]=",//回收站 "",//密闭文件夹 "",//Word文档 "",//计划任务 "" //控制面板 }; {645FF040-5081-101B-9F08-00AA002F954E} //回收站 {00000306-0000-0000-C000-000000000046} //密闭文件夹 {00020906-0000-0000-C000-000000000046} //Word文档 {D6277990-4C6A-11CF-8D87-00AA0060F5BF} //计划任务 {21EC2020-3AEA-1069-A2DD-08002B30309D} //控制面板 那么我从哪里找到这些代码呢?这些东东都在注册表的HKEY_CLASSES_ROOT\CLSID\CLSID下,你可以自己去找找已经在系统中注册的组件ID加到代码里,为了方便大家,我这里用到了几个比较通用的。 Main_OnCommand函数是处理对话框控件消息的函数,代码如下: void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) { HWND hCombo,hEidt; char path[1024]=,temppath[MAX_PATH]=,type[125]; int nIndex=0; LPITEMIDLIST pId; //ITEMIDLIST的指针,以后要用 BROWSEINFO binfo=;//开启浏览框用得结构体,初始化为0 switch(id) { case IDC_HIDE: //如果是"伪装"按钮的消息,即按下"伪装" 按钮 hEidt=GetDlgItem(hwnd,IDC_PATH) ; //得到编辑框的句柄 hCombo=GetDlgItem(hwnd,IDC_TYPE) ; //得到组合框的句柄 GetWindowText(hEidt,path,GetWindowTextLength(hEidt)+1); //得到编辑框中的路径 nIndex =SendMessage(hCombo,CB_GETCURSEL,0,0L); //得到组合框中被选项序号 strcpy(type,DefaultType[nIndex]); //就使用这一项对应的代码 if (GetWindowTextLength(hEidt)!=0) //如果路径不为空 else //用来伪装的函数,把参数传递进去 SetWindowText(GetDlgItem(hwnd,IDC_PATH),NULL); //清空编辑框 break; case IDC_BROW: //点击"浏览"按钮 binfo.lpszTitle= "请选择文件夹路径"; //文件夹选取框的标题 pId = SHBrowseForFolder(&binfo); //开启文件夹选取框 if (pId!=0) break; case IDC_REC: //来自”还原”按钮的消息,点击了"还原"按钮 hEidt=GetDlgItem(hwnd,IDC_PATH) ; hCombo=GetDlgItem(hwnd,IDC_TYPE) ; GetWindowText(hEidt,path,GetWindowTextLength(hEidt)+1); if (GetWindowTextLength(hEidt)!=0) //如果路径不为空 else SetWindowText(GetDlgItem(hwnd,IDC_PATH),NULL); //清空编辑框 break; case IDC_EXIT: //点击"离开按钮" EndDialog(hwnd, id); //关掉模态对话框 break; default: break; } } 能看懂吧?Hide和Recover分别是伪装和复原的函数: bool Hide(HWND hwndMain,char *path,char *type) { char output[MAX_PATH+1]; sprintf(output,"%s.%s",path,type);//把路径和伪装代码按照原理篇中提到的格式放到output中. if (output==NULL) //如果为空则退出 { MessageBox(hwndMain,"路径意外地为空","错了",MB_OK); return false; } MoveFile(path,output);//用MoveFile函数改名 MessageBox(hwndMain,"伪装成功!","OK",MB_OK); return true; } bool Recover(HWND hwndMain,char *path) { int i=0; int pathlen=strlen(path),typelen=strlen(DefaultType[1])+1; //之所以+1是因为还有一个句号 char output[MAX_PATH+1] ; while (i<=pathlen-typelen) //这里是为了去掉后面的伪装代码.得到原文件名 if (output==NULL) //如果为空则退出 { MessageBox(hwndMain,"路径意外地为空","错了",MB_OK); return false; } output[i]='\0'; //加个结束符 MoveFile(path,output);//用MoveFile函数改回原名 MessageBox(hwndMain,"还原成功!","",MB_OK); return true; } 好了,程序做好了,骗骗普通菜鸟还是很好的,我们自己怎么识别这样的程序?其实只要用命令行就可以进入回收站了,如图3所示。之下藏东西方便了! ![]() |
|