Aldeia Numaboa
Um portal diferente em Português do Brasil
Informática da Aldeia

Tutoriais
Home Informática Tutoriais e Programação Linguagem C Linguagem C - Projeto Espião IV

Na Aldeia

Há 119 visitantes online

3630 registros
0 hoje
14 nesta semana
4 neste mês

Boas vindas: flor

Estatística

Membros: 3639
Artigos: 1045
Links: 90
Leituras: 6681373

Login



Kanji da hora




Faça contato






Dom

30

Nov

2008


21:15

Linguagem C - Projeto Espião IV PDF Imprimir Indique esta página
(2 votos, média 5.0 de 5)
Escrito por vovó Vicki   


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 <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <string.h>
#include <psapi.h>
#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 <a class="mosinfopop" style="cursor:help;border-bottom:1px dotted #000000;" href="javascript:void(0)" onmouseover="return overlib('<p>Bandeiras de sinalização ou bits de indicação de estado. Muito usadas na linguagem assembly.</p>&amp;nbsp;<br />', CAPTION, 'flags',BELOW,RIGHT, WIDTH, 300, FGCOLOR, '#CCCCFF', BGCOLOR, '#333399', TEXTCOLOR, '#000000', CAPCOLOR, '#FFFFFF', OFFSETX, 10, OFFSETY, 10);" onmouseout="return nd();" > flags</a>
 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 Vicki vó Vicki

Última atualização ( Dom, 30.11.2008 21:37 )
 

Topo

Topo

Exceto onde especificamente citado, todo material deste site está sob Licença Creative Commons