打造屬于自己的任務(wù)管理器 |
想想自己在看雪也混了有一些日子了,再看看自己的ID還是個(gè)臨時(shí)會(huì )員,所以想寫(xiě)一些技術(shù)性的文章來(lái)申請個(gè)邀請碼.本人無(wú)才,破解剛接觸難以寫(xiě)出一篇能收買(mǎi)版主的文章.破文就寫(xiě)不來(lái)了,不過(guò)自己也學(xué)過(guò)編程一段時(shí)間了,那就寫(xiě)一些關(guān)于編程的吧,希望以下這段亂碼能博君一笑.
任務(wù)管理器是在windows系統用得最頻繁的一個(gè)軟件之一吧.你是否會(huì )覺(jué)得任務(wù)管理器的功能過(guò)于簡(jiǎn)單,不能滿(mǎn)足你的需要呢?那好,就讓我們一起來(lái)動(dòng)手打造一個(gè)更強大的任務(wù)管理器.
我就覺(jué)得任務(wù)管理器的網(wǎng)絡(luò )項的功能不夠,如果能顯示實(shí)時(shí)的上傳,下載速度就好了.這樣我們就可以隨時(shí)關(guān)注自己的網(wǎng)絡(luò )狀態(tài).雖然顯示實(shí)時(shí)速度的軟件很多,但是每次查看的時(shí)候都要找出來(lái)打開(kāi),不夠方便,加在任務(wù)管理器就方便調出來(lái)查看了,并且它本身已經(jīng)有了曲線(xiàn)顯示了.好,開(kāi)始吧!
HANDLE CreateRomoteThread( HANDLE hProcess //目標進(jìn)程句柄 PSECURITY_ATTRIBUTES psa, //指向SECURITY_ATTRIBUTES型態(tài)的結構的指針。在Windows 98中忽略該參數。在Windows NT中,它被設為NULL,表示使用缺省值。 DWORD dwStackSize, //線(xiàn)程堆棧大小,一般=0,在任何情況下,Windows根據需要動(dòng)態(tài)延長(cháng)堆棧的大小。 PTHREAD_START_ROUTINE pfnstartAddr, //指向線(xiàn)程函數的指針,形式:@函數名,函數名稱(chēng)沒(méi)有限制,但是必須以下列形式聲明:DWORD WINAPI ThreadProc (LPVOID pParam) ,格式不正確將無(wú)法調用成功。 PVOID pvParam, //向線(xiàn)程函數傳遞的參數,是一個(gè)指向結構的指針,不需傳遞參數時(shí),為NULL。 DWORD fdwCreate, //線(xiàn)程標志 PDWORD pdwThreadId //保存新線(xiàn)程的id。 );
HANDLE LoadLibrary(PCTSTR pszLibFile)
HANDLE hThreadd = CreateRemoteThread(hProcessRemote,NULL,0,LoadLibrary,"E:\\MyLib.dll",0,NULL);
PTHREAD_START_ROUTINE pfnThreadRtn =(PTHREAD_START_ROUTINE )GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"LoadLibrary");HANDLE hThread = CreateRemoteThread(hProcessRemote,NULL,0,pfnThreadRtn ,"E:\\MyLib.dll",0,NULL);LPVOID VirtualAllocEx( HANDLE hProcess, //申請內存所在的進(jìn)程句柄?! PVOID lpAddress, //保留頁(yè)面的內存地址;一般用NULL自動(dòng)分配 ?! IZE_T dwSize, //欲分配的內存大小,字節單位;注意實(shí)際分 配的內存大小是頁(yè)內存大小的整數倍 DWORD flAllocationType, //可取下列值MEM_PHYSICAL ,MEM_RESERVE,MEM_RESET ,MEM_TOP_DOWN,MEM_WRITE_WATCH DWORD flProtect //可取下列值PAGE_READONLY,PAGE_EXECUTE,PAGE_EXECUTE_READ ,PAGE_EXECUTE_READWRITE,PAGE_GUARD,PAGE_NOACCESS,PAGE_NOCACHE );
BOOL VirtualFreeEx( HANDLE hProcess, // 要釋放內存所在進(jìn)程的句柄 LPVOID lpAddress, // 區域地址 DWORD dwSize, // 區域大小,字節 DWORD dwFreeType //類(lèi)型 );
BOOL ReadProcessMemory( HANDLE hProcess,// 遠程進(jìn)程句柄 LPCVOID lpBaseAddress, //遠程進(jìn)程中內存地址 LPVOID lpBuffer, //本地進(jìn)程中內存地址. 函數將讀取的內容寫(xiě)入此處 DWORD nSize,// 要傳送的字節數 LPDWORD lpNumberOfBytesRead //實(shí)際傳送的字節數. 函數返回時(shí)報告實(shí)際寫(xiě)入多少 ); BOOL WriteProcessMemory( HANDLE hProcess, LPVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesWritten );
BOOL Inject(DWORD dwProcessId/*進(jìn)程ID*/, PCWSTR pszLibFile/*DLL路徑和名稱(chēng)*/){ BOOL bOk = FALSE; HANDLE hProcess = NULL, hThread = NULL; PWSTR pszLibFileRemote = NULL; __try { // 獲取目標進(jìn)程的句柄 hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | // Required by Alpha PROCESS_CREATE_THREAD | // For CreateRemoteThread PROCESS_VM_OPERATION | // For VirtualAllocEx/VirtualFreeEx PROCESS_VM_WRITE, // For WriteProcessMemory FALSE, dwProcessId); if (hProcess == NULL) __leave; // 計算DLL路徑的長(cháng)度 int cch = 1 + lstrlenW(pszLibFile); int cb = cch * sizeof(wchar_t); //在遠程進(jìn)程為DLL的名字和路徑分配內存 pszLibFileRemote = (PWSTR) VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE); if (pszLibFileRemote == NULL) __leave; //把路徑復制的遠程進(jìn)程的內存中 if (!WriteProcessMemory(hProcess, pszLibFileRemote, (PVOID) pszLibFile, cb, NULL)) __leave; //獲取LoadLibraryW 在Kernel32.dll中的實(shí)際內存地址 PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW"); if (pfnThreadRtn == NULL) __leave; //創(chuàng )建遠程線(xiàn)程 hThread = CreateRemoteThread(hProcess, NULL, 0, pfnThreadRtn, pszLibFileRemote, 0, NULL); if (hThread == NULL) __leave; // 等待線(xiàn)程結束 WaitForSingleObject(hThread, INFINITE); bOk = TRUE; } __finally { // 釋放內存 if (pszLibFileRemote != NULL) VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE); if (hThread != NULL) CloseHandle(hThread); if (hProcess != NULL) CloseHandle(hProcess); } return(bOk);}BOOL EnumChildWindows(HWND hWndParent,WNDENUMPROC lpEnumFunc, LPARAM lParam); HWND hWndParent, //父窗口句柄 WNDENUMPROC lpEnumFunc, // 回調函數的地址 LPARAM lParam//你自已定義的參數
HANDLE hwndTaskManager = FindWindow( (LPCTSTR)32770, L"Windows 任務(wù)管理器");

struct StructFindTaskManagerDlgItem{ DWORD itemID;//控件ID HWND hwnd;//該控件的句柄};BOOL CALLBACK _EnumChildProc( HWND hwnd, LPARAM lParam ){ StructFindTaskManagerDlgItem* pParam = (StructFindTaskManagerDlgItem*)lParam; if ( (DWORD)GetDlgCtrlID( hwnd ) == pParam->itemID )//判斷是否為需要的控件 { pParam->hwnd = hwnd; return FALSE; } return TRUE;}HWND FindTaskManagerDlgItem( DWORD itemID ){ StructFindTaskManagerDlgItem param; param.itemID = (DWORD)itemID; param.hwnd = NULL; EnumChildWindows( hwndTaskManager, _EnumChildProc, (LPARAM)¶m ); return param.hwnd;}//獲取listview的數量int GetListColmnCount(HWND hList){ int count=0; WCHAR caption[MAX_PATH]; LVCOLUMN lvc; lvc.mask=LVCF_TEXT; lvc.cchTextMax=MAX_PATH; lvc.pszText=caption; for (int i=0;i<50;i++) { ZeroMemory(caption,sizeof(caption)); SendMessage(hList,LVM_GETCOLUMN,i,(long)&lvc); if (caption[0]==0&&caption[1]==0) { count=i; break; } } return count; }//向listview插入兩列void InsertColToNetworkList(HWND hNetworkList)//hNetworkList即為該控件的句柄{ int n=GetListColmnCount(hNetworkList);//獲取列數,加載所有列的后面 // 添加列 LV_COLUMN colmn; // 列 ZeroMemory(&colmn, sizeof(LV_COLUMN)); colmn.mask = LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; // 風(fēng)格 colmn.fmt=LVCFMT_RIGHT; colmn.cx = 0x60;//寬度 colmn.pszText = L"下載";//列名 SendMessage(hNetworkList, LVM_INSERTCOLUMN, n, (LPARAM)&colmn); colmn.pszText = L"上傳";//列名 SendMessage(hNetworkList, LVM_INSERTCOLUMN, n+1, (LPARAM)&colmn);}DWORD GetIfTable( __out PMIB_IFTABLE pIfTable,//指向PMIB_IFTABLE 的指針 __inout PULONG pdwSize,//pIfTable的大小 __in BOOL bOrder//是否排序);typedef struct _MIB_IFTABLE { DWORD dwNumEntries; MIB_IFROW table[ANY_SIZE];}MIB_IFTABLE, *PMIB_IFTABLE;typedef struct _MIB_IFROW { WCHAR wszName[MAX_INTERFACE_NAME_LEN]; DWORD dwIndex;//端口索引號 DWORD dwType;//端口類(lèi)型 DWORD dwMtu;//最大傳輸包字節數 DWORD dwSpeed;//端口速度 DWORD dwPhysAddrLen;//物理地址長(cháng)度 BYTE bPhysAddr[MAXLEN_PHYSADDR];//物理地址 DWORD dwAdminStatus;//管理狀態(tài) DWORD dwOperStatus;//操作狀態(tài) DWORD dwLastChange;//上次狀態(tài)更新時(shí)間 DWORD dwInOctets;//輸入字節數 DWORD dwInUcastPkts;//輸入非廣播包數 DWORD dwInNUcastPkts;//輸入廣播包數 DWORD dwInDiscards;//輸入包丟棄數 DWORD dwInErrors;//輸入包錯誤數 DWORD dwInUnknownProtos;//輸入未知協(xié)議包數 DWORD dwOutOctets;//輸出字節數 DWORD dwOutUcastPkts;//輸出非廣播包數 DWORD dwOutNUcastPkts;//輸出廣播包數 DWORD dwOutDiscards;//輸出包丟棄數 DWORD dwOutErrors;//輸出包錯誤數 DWORD dwOutQLen;//輸出隊長(cháng) DWORD dwDescrLen;//端口描述長(cháng)度 BYTE bDescr[MAXLEN_IFDESCR]; //端口描述}MIB_IFROW, *PMIB_IFROW;int NetInformation() { MIB_IFTABLE *pIfTable = NULL; MIB_IFROW *pIfRow=NULL; ULONG dwSize = 0; DWORD dwRet; dwRet = GetIfTable( pIfTable, &dwSize, TRUE ); //第一次調用獲取結構大小 if ( dwRet == ERROR_INSUFFICIENT_BUFFER ) { pIfTable = ( MIB_IFTABLE * ) new char[dwSize]; if ( pIfTable != NULL ) { dwRet = GetIfTable( pIfTable, &dwSize, TRUE ); //獲得相關(guān)信息 if ( dwRet == NO_ERROR ) { pIfRow = (MIB_IFROW *) & pIfTable->table[1]; CurrentInBytes=pIfRow->dwInOctets; //保存當次的輸入字節數 CurrentOutBytes=pIfRow->dwOutOctets; //保存當次的輸出字節數 } else { printf( "Some error occured!\n" ); return FALSE; } } else { printf( "Memory allocate failue\n" ); return FALSE; } } else { printf( "Some error occured!\n" ); return FALSE; } return TRUE; } CreateThread(NULL,NULL,ThreadTimerProc,NULL,NULL,NULL);DWORD WINAPI ThreadTimerProc(PVOID param){ NetInformation(); lastInBytes=CurrentInBytes; lastOutBytes=CurrentOutBytes; while(TRUE) { if(NetInformation()) { float InBps=(float(CurrentInBytes-lastInBytes))/1024; float OutBps=(float(CurrentOutBytes-lastOutBytes))/1024; lastInBytes=CurrentInBytes; lastOutBytes=CurrentOutBytes; item.mask = LVIF_TEXT; item.cchTextMax = MAX_PATH; int iSubItem=GetListItemIndex(hwndNetworkList,L"下載"); if (iSubItem>0) { ZeroMemory(szBPS,sizeof(szBPS)); swprintf(szBPS,L"%0.2f KB/s",InBps); //swprintf(szBPS,L"%ld KB/s",CurrentInBytes); item.pszText=szBPS; item.iSubItem =iSubItem; ListView_SetItem(hwndNetworkList,(LPARAM)&item); ZeroMemory(szBPS,sizeof(szBPS)); swprintf(szBPS,L"%0.2f KB/s",OutBps); //swprintf(szBPS,L"%ld KB/s",CurrentOutBytes); item.pszText=szBPS; item.iSubItem =iSubItem+1; ListView_SetItem(hwndNetworkList,(LPARAM)&item); } } Sleep(1000); }}聯(lián)系客服