文件夾變形 各位觀眾,歡迎來到全金屬的編程講座。今天我們講的是文件夾的變形大法。
怎么樣?文件夾變成回收站了!不信?雙擊進(jìn)入試試,里面真的是回收站哦。神奇吧!看過本文,你不但能變文件夾為回收站,還可以將它變成各種稀奇古怪的東東! 系統(tǒng)環(huán)境:Windows Server 2003 Enterprice Eidtion
那么來看看Main_Proc吧,它是對話框的消息處理函數(shù): 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); //發(fā)給控件們的消息 HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose); //關(guān)閉對話框的消息 //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 語句在標(biāo)準(zhǔn)的WndProc中實在令人煩惱,再者它使你擺脫必須傳送消息處理函數(shù)返回值的責(zé)任。所以,這里Main_OnInitDialog是WM_INITDIALOG對應(yīng)的消息處理函數(shù),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,這個函數(shù)可以取得特定ID的控件的句柄 SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)"回收站");//第一項 SendMessage(hCombo,CB_ADDSTRING,1,(LPARAM)"控制面板");//第二項 SendMessage(hCombo,CB_ADDSTRING,2,(LPARAM)"計劃任務(wù)");//第三項 SendMessage(hCombo,CB_SETCURSEL,0,0);//把第一項 回收站 作為默認(rèn)項放進(jìn)Combobox的文本框. return TRUE; } 初始化的作用是為下拉列表框加入列表項,我這里加了5項,指可以偽裝成5種不同的外形。這三種外形的代碼我放到一個全局?jǐn)?shù)組中: char DefaultType[5][125]=",//回收站 "",//密閉文件夾 "",//Word文檔 "",//計劃任務(wù) "" //控制面板 }; {645FF040-5081-101B-9F08-00AA002F954E} //回收站 {00000306-0000-0000-C000-000000000046} //密閉文件夾 {00020906-0000-0000-C000-000000000046} //Word文檔 {D6277990-4C6A-11CF-8D87-00AA0060F5BF} //計劃任務(wù) {21EC2020-3AEA-1069-A2DD-08002B30309D} //控制面板 那么我從哪里找到這些代碼呢?這些東東都在注冊表的HKEY_CLASSES_ROOT\CLSID\CLSID下,你可以自己去找找已經(jīng)在系統(tǒng)中注冊的組件ID加到代碼里,為了方便大家,我這里用到了幾個比較通用的。 Main_OnCommand函數(shù)是處理對話框控件消息的函數(shù),代碼如下: 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=;//開啟瀏覽框用得結(jié)構(gòu)體,初始化為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]); //就使用這一項對應(yīng)的代碼 if (GetWindowTextLength(hEidt)!=0) //如果路徑不為空 else //用來偽裝的函數(shù),把參數(shù)傳遞進(jìn)去 SetWindowText(GetDlgItem(hwnd,IDC_PATH),NULL); //清空編輯框 break; case IDC_BROW: //點擊"瀏覽"按鈕 binfo.lpszTitle= "請選擇文件夾路徑"; //文件夾選取框的標(biāo)題 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); //關(guān)掉模態(tài)對話框 break; default: break; } } 能看懂吧?Hide和Recover分別是偽裝和復(fù)原的函數(shù): 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函數(shù)改名 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'; //加個結(jié)束符 MoveFile(path,output);//用MoveFile函數(shù)改回原名 MessageBox(hwndMain,"還原成功!","",MB_OK); return true; } 好了,程序做好了,騙騙普通菜鳥還是很好的,我們自己怎么識別這樣的程序?其實只要用命令行就可以進(jìn)入回收站了,如圖3所示。之下藏東西方便了! ![]() |
|