A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Tutoriais e Programação

Linguagem C - Projeto Espião IV

Dom

30

Nov

2008


22:15

(3 votos, média 5.00 de 5) 


C

Neste tutorial você encontra o código fonte completo do Projeto Espião. Este inclui o código gerado automaticamente pelo Wedit e o código apresentado e explicado nos tutoriais anteriores. É importante para se ter uma visão geral do projeto.

/*<---------------------------------------------------------------------->*/ #include #include #include #include #include #include "espiaores.h" #define IDJANELATREE 10545 /*<---------------------------------------------------------------------->*/ HINSTANCE hInst; // manipulador da instância HWND hwndMain; // manipulador da janela principal LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); static HWND _stdcall janelaTree(HWND hWnd,int ID); int criaTree(HWND parent); void Scan(HWND hTree,HTREEITEM hNoPai,HWND Inicio); LRESULT TrataWmNotify(HWND hwnd, WPARAM wParam, LPARAM lParam); static HWND PegaItemInfo(HWND hwndTree,HTREEITEM hti); void PoeTextoStatus(HWND hParent,HWND hwnd); static char * NomeIDProcesso( DWORD processoID ); // Variáveis globais para o controle da barra de status. HWND hWndStatusbar; /*------------------------------------------------------------------------ Procedure: UpdateStatusBar ID:1 Purpose: Updates the statusbar control with the appropiate text Input: lpszStatusString: Charactar string that will be shown partNumber: index of the status bar part number. displayFlags: Decoration flags Output: none Errors: none ------------------------------------------------------------------------*/ void UpdateStatusBar( LPSTR lpszStatusString, WORD partNumber, WORD displayFlags) { SendMessage(hWndStatusbar, SB_SETTEXT, partNumber | displayFlags, (LPARAM)lpszStatusString); } /*------------------------------------------------------------------------ Procedure: MsgMenuSelect ID:1 Purpose: Shows in the status bar a descriptive explanation of the purpose of each menu item.The message WM_MENUSELECT is sent when the user starts browsing the menu for each menu item where the mouse passes. Input: Standard windows. Output: The string from the resources string table is shown Errors: If the string is not found nothing will be shown. ------------------------------------------------------------------------*/ LRESULT MsgMenuSelect(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam) { static char szBuffer[256]; UINT nStringID = 0; UINT fuFlags = GET_WM_MENUSELECT_FLAGS(wparam, lparam) & 0xffff; UINT uCmd = GET_WM_MENUSELECT_CMD(wparam, lparam); HMENU hMenu = GET_WM_MENUSELECT_HMENU(wparam, lparam); szBuffer[0] = 0; // First reset the buffer if (fuFlags == 0xffff && hMenu == NULL) // Menu has been closed nStringID = 0; else if (fuFlags & MFT_SEPARATOR) // Ignore separators nStringID = 0; else if (fuFlags & MF_POPUP) // Popup menu { if (fuFlags & MF_SYSMENU) // System menu nStringID = IDS_SYSMENU; else // Get string ID for popup menu from idPopup array. nStringID = 0; } // for MF_POPUP else // Must be a command item nStringID = uCmd; // String ID == Command ID // Load the string if we have an ID if (0 != nStringID) LoadString(hInst, nStringID, szBuffer, sizeof(szBuffer)); // Finally... send the string to the status bar UpdateStatusBar(szBuffer, 0, 0); return 0; } /*------------------------------------------------------------------------ Procedure: InitializeStatusBar ID:1 Purpose: Initialize the status bar Input: hwndParent: the parent window nrOfParts: The status bar can contain more than one part. What is difficult, is to figure out how this should be drawn. So, for the time being only one is being used... Output: The status bar is created Errors: ------------------------------------------------------------------------*/ void InitializeStatusBar(HWND hwndParent,int nrOfParts) { const int cSpaceInBetween = 8; int ptArray[40]; // Array defining the number of parts/sections RECT rect; HDC hDC; /* * Fill in the ptArray... */ hDC = GetDC(hwndParent); GetClientRect(hwndParent, &rect); ptArray[nrOfParts-1] = rect.right; //---TODO--- Add code to calculate the size of each part of the status // bar here. ReleaseDC(hwndParent, hDC); SendMessage(hWndStatusbar, SB_SETPARTS, nrOfParts, (LPARAM)(LPINT)ptArray); UpdateStatusBar("Ready", 0, 0); //---TODO--- Add code to update all fields of the status bar here. // As an example, look at the calls commented out below. // UpdateStatusBar("Cursor Pos:", 1, SBT_POPOUT); // UpdateStatusBar("Time:", 3, SBT_POPOUT); } /*------------------------------------------------------------------------ Procedure: CreateSBar ID:1 Purpose: Calls CreateStatusWindow to create the status bar Input: hwndParent: the parent window initial text: the initial contents of the status bar Output: Errors: ------------------------------------------------------------------------*/ static BOOL CreateSBar(HWND hwndParent,char *initialText,int nrOfParts) { hWndStatusbar = CreateStatusWindow(WS_CHILD | WS_VISIBLE | WS_BORDER|SBARS_SIZEGRIP, initialText, hwndParent, IDM_STATUSBAR); if(hWndStatusbar) { InitializeStatusBar(hwndParent,nrOfParts); return TRUE; } return FALSE; } /*<---------------------------------------------------------------------->*/ /* 0-> */ static BOOL InitApplication(void) { WNDCLASS wc; memset(&wc,0,sizeof(WNDCLASS)); wc.style = CS_HREDRAW|CS_VREDRAW |CS_DBLCLKS ; wc.lpfnWndProc = (WNDPROC)MainWndProc; wc.hInstance = hInst; wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszClassName = "espiaoWndClass"; wc.lpszMenuName = MAKEINTRESOURCE(IDMAINMENU); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); if (!RegisterClass(&wc)) return 0; /* 0<- */ // ---TODO--- Call module specific initialization routines here return 1; } /*<---------------------------------------------------------------------->*/ /* 1-> */ HWND CreateespiaoWndClassWnd(void) { return CreateWindow("espiaoWndClass","espiao", WS_MINIMIZEBOX|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN| WS_MAXIMIZEBOX|WS_CAPTION|WS_BORDER|WS_SYSMENU|WS_THICKFRAME, CW_USEDEFAULT,0,CW_USEDEFAULT,0, NULL, NULL, hInst, NULL); } /* 1<- */ /*<---------------------------------------------------------------------->*/ void MainWndProc_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) { switch(id) { case IDM_NEW: criaTree(hwnd); break; case IDM_EXIT: PostMessage(hwnd,WM_CLOSE,0,0); break; } } /*<---------------------------------------------------------------------->*/ /* 2-> */ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) { static HWND hwndTree; RECT rc, rcStatus; switch (msg) { /* 3-> */ case WM_CREATE: hwndTree = janelaTree(hwnd,IDJANELATREE); break; case WM_NOTIFY: return TrataWmNotify(hwnd,wParam,lParam); case WM_SIZE: SendMessage(hWndStatusbar,msg,wParam,lParam); InitializeStatusBar(hWndStatusbar,1); GetClientRect(hwnd,&rc); GetWindowRect(hwndTree,&rcStatus); rc.bottom -= rcStatus.bottom - rcStatus.top; MoveWindow(hwndTree,0,0,rc.right,rc.bottom,1); break; case WM_MENUSELECT: return MsgMenuSelect(hwnd,msg,wParam,lParam); case WM_COMMAND: HANDLE_WM_COMMAND(hwnd,wParam,lParam,MainWndProc_OnCommand); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,msg,wParam,lParam); } /* 3<- */ return 0; } /* 2<- */ /*<---------------------------------------------------------------------->*/ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow) { MSG msg; HANDLE hAccelTable; hInst = hInstance; if (!InitApplication()) return 0; hAccelTable = LoadAccelerators(hInst,MAKEINTRESOURCE(IDACCEL)); if ((hwndMain = CreateespiaoWndClassWnd()) == (HWND)0) return 0; CreateSBar(hwndMain,"Ready",1); ShowWindow(hwndMain,SW_SHOW); while (GetMessage(&msg,NULL,0,0)) { if (!TranslateAccelerator(msg.hwnd,hAccelTable,&msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return msg.wParam; } /*<---------------------------------------------------------------------- NOSSAS FUNÇÕES --------------------------------------------------------------------------->*/ static HWND _stdcall janelaTree(HWND hWnd,int ID) { return CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"", WS_VISIBLE|WS_CHILD|WS_BORDER|TVS_HASLINES| TVS_HASBUTTONS|TVS_DISABLEDRAGDROP, 0,0,0,0, hWnd,(HMENU)ID,hInst,NULL); } /*<---------------------------------------------------------------------->*/ int criaTree(HWND mae) { HWND Inicio = GetDesktopWindow(); HWND hTree = GetDlgItem(mae,IDJANELATREE); TV_INSERTSTRUCT itemTree; HTREEITEM hNovoNo; SendMessage(hTree,WM_SETREDRAW,0,0); TreeView_DeleteAllItems(hTree); memset(&itemTree,0,sizeof(itemTree)); itemTree.hParent = TVI_ROOT; itemTree.hInsertAfter = TVI_LAST; itemTree.item.mask = TVIF_TEXT | TVIF_PARAM; itemTree.item.pszText = "Desktop"; hNovoNo = TreeView_InsertItem(hTree,&itemTree); Inicio = GetWindow(Inicio,GW_CHILD); Scan(hTree,hNovoNo,Inicio); TreeView_Expand(hTree,hNovoNo,TVE_EXPAND); SendMessage(hTree,WM_SETREDRAW,1,0); return 1; } /*<---------------------------------------------------------------------->*/ void Scan(HWND hTree,HTREEITEM hNoPai,HWND Inicio) { HWND hwnd = Inicio, hwnd1; TV_INSERTSTRUCT novoItemTree; HTREEITEM htiNovoNo; char bufTxt[256],NomeClasseBuf[256],Saida[1024]; while (hwnd != NULL) { SendMessage(hwnd,WM_GETTEXT,250,(LPARAM) bufTxt); GetClassName(hwnd,NomeClasseBuf,250); wsprintf(Saida,"\"%s\" %s",bufTxt,NomeClasseBuf); memset(&novoItemTree,0,sizeof(novoItemTree)); novoItemTree.hParent = hNoPai; novoItemTree.hInsertAfter = TVI_LAST; novoItemTree.item.mask = TVIF_TEXT | TVIF_PARAM; novoItemTree.item.pszText = (LPSTR) Saida; novoItemTree.item.lParam = (LPARAM) hwnd; htiNovoNo = TreeView_InsertItem(hTree,&novoItemTree); if((hwnd1=GetWindow(hwnd,GW_CHILD))!=NULL) Scan(hTree,htiNovoNo,hwnd1); hwnd=GetWindow(hwnd,GW_HWNDNEXT); } } /*<---------------------------------------------------------------------->*/ LRESULT TrataWmNotify(HWND hwnd, WPARAM wParam, LPARAM lParam) { NMHDR *apontaGrito; TV_HITTESTINFO testaClique; HWND hTree = GetDlgItem(hwnd,IDJANELATREE); HTREEITEM hti; HWND hwndAlvo; apontaGrito = (NMHDR *)lParam; switch (apontaGrito->code) { case NM_CLICK: memset(&testaClique,0,sizeof(TV_HITTESTINFO)); GetCursorPos(&testaClique.pt); MapWindowPoints(HWND_DESKTOP,hTree,&testaClique.pt,1); hti = TreeView_HitTest(hTree,&testaClique); if (hti == (HTREEITEM)0) break; hwndAlvo = PegaItemInfo(hTree,hti); PoeTextoStatus(hwnd,hwndAlvo); break; } return DefWindowProc(hwnd,WM_NOTIFY,wParam,lParam); } /*<---------------------------------------------------------------------->*/ static HWND PegaItemInfo(HWND hwndTree,HTREEITEM hti) { TV_ITEM tvi; memset(&tvi,0,sizeof(TV_ITEM)); tvi.mask = TVIF_PARAM; tvi.hItem = hti; TreeView_GetItem(hwndTree,&tvi); return (HWND) tvi.lParam; } /*<---------------------------------------------------------------------->*/ void PoeTextoStatus(HWND hParent,HWND hwnd) { RECT rc; HANDLE pid; char info[4096],*pNomeProcesso; GetWindowRect(hwnd,&rc); GetWindowThreadProcessId(hwnd,&pid); pNomeProcesso = NomeIDProcesso((ULONG)pid); wsprintf(info, "Handle: 0x%x %s, esq %d, topo %d, dir %d, base %d, altura %d, larg %d, Processo: %s", hwnd, IsWindowVisible(hwnd)? "Visível" : "Escondida", rc.left,rc.top,rc.right,rc.bottom, rc.bottom-rc.top, rc.right-rc.left, pNomeProcesso); UpdateStatusBar(info, 0, 0); } /*<---------------------------------------------------------------------->*/ static char * NomeIDProcesso( DWORD processoID ) { static char szNomeProcesso[MAX_PATH]; HMODULE hMod; DWORD cbNeeded; HANDLE hProcesso = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processoID ); szNomeProcesso[0] = 0; if ( hProcesso ) { if ( EnumProcessModules( hProcesso, &hMod, sizeof(hMod), &cbNeeded) ) { GetModuleBaseName( hProcesso, hMod, szNomeProcesso, sizeof(szNomeProcesso) ); } CloseHandle( hProcesso ); } return szNomeProcesso; }

info O código precisa ser compilado com a biblioteca psapi.lib

Observações da vó

Agradeço a paciência e o interesse pelo tutorial. Caso tenha alguma dúvida, crítica, correção ou sugestão, entre em contato.

Todos os exemplos destes tutoriais foram extraídos do tutorial de C do autor do lcc-win32, Jacob Navia, a quem só tenho que agradecer por disponibilizar gratuitamente esta plataforma de desenvolvimento na Internet. Não conheço o autor do software e nem estou ligada ao desenvolvimento desta plataforma, apenas a utilizo e, por sua excelência, achei justo divulgar o trabalho do Navia.

Os textos são de minha autoria, baseados em informações técnicas, artigos, alguns livros e na minha experiência pessoal. Espero que tenham agradado.

Grande abraço

vovo vó Vicki

Вадим Логофет банкирчугунный казан с крышкой сковородойwobsблюда приготовленныелобановский классглавное новостилобановский александр

Informações adicionais