3304 registros
0 hoje
9 nesta semana
41 neste mês![]() | 73% | Brasil (47535) |
![]() | 5% | Portugal (3069) |
![]() | 3% | EUA (2132) |
![]() | 0% | Rússia (259) |
![]() | 0% | Holanda (239) |
| Hoje: | 135 |
| Ontem: | 2587 |
| No mês: | 39312 |
| Mês passado: | 25815 |
| Total: | 65127 |
| Recorde: | 3037 |
| No dia: | 04.03.10 |
| Leituras hoje: | 19006 |
| Leituras Total: | 280558 |
| Bots hoje: | 60 |
| Dados desde: | 16.02.2010 |
|
Dom 30 Nov 2008 20:20 |
|
Página 1 de 3
Se você seguiu os tutoriais anteriores, então seu programa espião.exe já deve estar funcionando. Mas está meio tímido, porque não fala com o usuário - só mostra o menu e, quando solicitado, a árvore com as janelas abertas no momento da solicitação. Calado demais, este nosso espião. Neste tutorial vamos fazer com que entregue e ouro Quem é quem no pedaçoNosso projeto inicial incluía informações sobre as janelas na barra de status. Uma das formas de pedir informações é clicando num dos itens da árvore. Mas, como saber quando o usuário clica um item? O controle de árvore, assim como muitos outros controles, envia mensagens do tipo WM_NOTIFY para nossa central de mensagens toda vez que um evento acontece, ou seja, com qualquer coisinha o controle grita. É justamente esta mensagem que precisamos interceptar com o auxílio do caso WM_NOTIFY (linhas 11 e 12):
Fiéis ao estilo "top-down", chamamos a função TrataWmNotify, a qual deverá fazer o serviço final de espionagem: obter informações precisas sobre a janela indicada pelo usuário. Catando gritosO código da função é um tantinho mais complicado que os anteriores, mas não é nada que assuste. Veja abaixo: 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); } De todos os gritos que o controle de árvore possa dar, o único que nos interessa é o NM_CLICK. Como este controle é muito nervoso (por ser muito complexo), a quantidade de gritos que ele é capaz de dar é muito grande. O tipo de grito dado é sempre armazenado no parâmetro lParam da mensagem WM_NOTIFY. Este parâmetro nada mais é do que um ponteiro indicando o endereço de memória de uma estrutura chamada de NMHDR: typedef struct tagNMHDR { HWND hwndFrom; UINT idFrom; UINT code; } NMHDR; O campo HWND hwndFrom contém o manipulador da janela que está gritando (ou enviando a mensagem, como queira), o campo UINT idFrom contém o identificador do controle e o campo UINT code contém o código do grito. Existem oito tipos de grito:
Selecionando gritosComo já disse, o único grito que nos interessa é o NM_CLICK, mas não todos os NM_CLICKs. Se o usuário clicar sobre um item, sim; se clicar na janela do controle, mas não sobre um item, não! Então, vamos por partes:
Antes de prosseguir, vamos dar uma olhada na definição da estrutura TV_HITTESTINFO, usada para determinar a localização de um ponto relativo a um controle de árvore: typedef struct _TVHITTESTINFO { POINT pt; UINT <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>&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>; HTREEITEM hItem; } TV_HITTESTINFO, FAR *LPTV_HITTESTINFO; POINT pt contém as coordenadas-cliente do ponto testado, UINT flags recebe as informações do resultado do ponto que foi testado e HTREEITEM hItem contém o manipulador (handle) do item que ocupa o ponto. Agora podemos continuar com a análise:
|
|||||
| Última atualização ( Dom, 30.11.2008 21:14 ) |