Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: fary en 16 Marzo 2013, 15:32 pm



Título: GUI y eventos
Publicado por: fary en 16 Marzo 2013, 15:32 pm
Hola, estoy creando una ventana con un litview y quiero detectar cuando se pulsa un boton sobre uno de los item del listview y sabe rque item es, tengo la ventana así:

(http://img849.imageshack.us/img849/879/asmnet2.jpg)

Pero no consigo saber como hacer eso...

un saludo!


Título: Re: GUI y eventos
Publicado por: Eternal Idol en 16 Marzo 2013, 15:44 pm
Proba con:
LVN_ITEMACTIVATE notification code (Windows) (http://msdn.microsoft.com/en-us/library/windows/desktop/bb774843%28v=vs.85%29.aspx)

Remarks
To obtain the items being activated, the receiving application should use the LVM_GETSELECTEDCOUNT (http://msdn.microsoft.com/en-us/library/windows/desktop/bb761069(v=vs.85).aspx) message to retrieve the number of items that are selected and then send the LVM_GETNEXTITEM (http://msdn.microsoft.com/en-us/library/windows/desktop/bb761057(v=vs.85).aspx) message with LVNI_SELECTED until all of the items have been retrieved.


Título: Re: GUI y eventos
Publicado por: fary en 16 Marzo 2013, 19:04 pm
Creo que tengo mal la constante LVN_ITEMACTIVATE porque no me funciona... No he encontrado su valor en la msdn y la he tenido que obtener así:

Código
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <commctrl.h>
  4.  
  5. #define LVN_ITEMACTIVATE (LVN_FIRST-14)
  6.  
  7. int main()
  8. {
  9.    printf("0x%x",LVN_ITEMACTIVATE);
  10.    return 0;
  11. }
  12.  

Y la uso así:

Código
  1. miWM_NOTIFY:
  2.           mov eax,[lparam]
  3.           add eax,0x8
  4.           mov eax,[eax]  ; EAX = lparam->code
  5.  
  6.  
  7.           .if eax = 0xFFFFFF8E ; LVN_ITEMACTIVATE
  8.               invoke MessageBoxA,0,0,0,0   ; comprobamos que funciona.
  9.           .endif
  10.  
  11.           jmp salirWPROC

saludos!


Título: Re: GUI y eventos
Publicado por: x64core en 16 Marzo 2013, 20:54 pm
Item,Subitem:

WM_NOTIFY->NM_RCLICK


Título: Re: GUI y eventos
Publicado por: fary en 16 Marzo 2013, 21:06 pm
Item,Subitem:

WM_NOTIFY->NM_RCLICK

Código
  1. miWM_NOTIFY:
  2.           mov eax,[lparam]
  3.           add eax,0x8
  4.           mov eax,[eax]  ; EAX = lparam->code
  5.  
  6.  
  7.           .if eax = 0xFFFFFFFB ; NM_RCLICK
  8.               invoke MessageBoxA,0,0,0,0   ; comprobamos que funciona.
  9.           .endif
  10.  
  11.           jmp salirWPROC

Ahí me lo detecta bien el clic derecho pero no se me seleciona el item :S



Título: Re: GUI y eventos
Publicado por: x64core en 16 Marzo 2013, 21:17 pm
Código
  1. miWM_NOTIFY:
  2.           mov eax,[lparam]
  3.           add eax,0x8
  4.           mov eax,[eax]  ; EAX = lparam->code
  5.  
  6.  
  7.           .if eax = 0xFFFFFFFB ; NM_RCLICK
  8.               invoke MessageBoxA,0,0,0,0   ; comprobamos que funciona.
  9.           .endif
  10.  
  11.           jmp salirWPROC

Ahí me lo detecta bien el clic derecho pero no se me seleciona el item :S



Y si llamas a Beep en lugar de Messagebox debido a que Windows da el foco inmediatamente al box de mensaje?  :silbar:


Título: Re: GUI y eventos
Publicado por: fary en 16 Marzo 2013, 23:33 pm
Tampoco le da el foco con Beep@Kernel32.dll  :-\


Título: Re: GUI y eventos
Publicado por: x64core en 17 Marzo 2013, 00:37 am
Tampoco le da el foco con Beep@Kernel32.dll  :-\

En realidad me referia que usando MessageBox window le da el foco al cuadro de texto no que Beep le daria el foco, Beep se usaria solo para saber que el EIP pasa por ahi. un winproc en C no tengo ningun problema, o talvez puedes explicar mejor lo que buscas o talvez lo encuentres en el winproc, nitemact tiene toda la information que estas pidiendo:

Código:
// test only
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
   static   char           szColumnHeader[][12] = {" col1", "col2", "col3"};
   static   Item           ListItem[3];
   static   HWND           hWndListView;
   static   LV_ITEM        lv;
   int                     index;
   int                     iiWidth[3];
   LV_COLUMN               lvC;
   RECT                    rect;

   LV_DISPINFO             *Lvinfo;
   NMITEMACTIVATE          *nitemact;

   switch (iMsg)
   {
   case WM_CREATE :
      hWndListView = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW,"", WS_VISIBLE | WS_CHILD | LVS_REPORT | LVS_SHOWSELALWAYS,0, 0, 0, 0, hwnd,(HMENU)ID_LISTVIEW, NULL, NULL);
      ListView_SetExtendedListViewStyle(hWndListView, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

      iiWidth[0] = 100;
      iiWidth[1] = 100;
      iiWidth[2] = 100;

      lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
      lvC.fmt = LVCFMT_LEFT;

      for(index = 0; index < 3; index++)
      {
         lvC.iSubItem = index;
         lvC.cx = iiWidth[index];
         lvC.pszText = szColumnHeader[index];
         ListView_InsertColumn(hWndListView,index,&lvC);
      }

      strcpy(ListItem[0].szItemNr, "item1");
      strcpy(ListItem[0].szItem, "subitem1");
      strcpy(ListItem[0].szItemDescription, "subitem1");

      strcpy(ListItem[1].szItemNr, "item2");
      strcpy(ListItem[1].szItem, "subitem2");
      strcpy(ListItem[1].szItemDescription, "subitem2");

      AdjustListView(hWndListView, &lv, index);
      break;

   case WM_SIZE :
      GetClientRect(hwnd, &rect);
      MoveWindow(hWndListView, 3, 3, rect.right - 6, rect.bottom - 6, 1);
      break;

   case WM_NOTIFY :
      switch(((LPNMnitemact)lParam)->code)
      {
      case NM_RCLICK :
          
         nitemact = (NMITEMACTIVATE *)lParam;
         break;
      case LVN_GETDISPINFO :
         Lvinfo = (LV_DISPINFO FAR*)lParam;
         if((((LPNMnitemact)lParam)->hwndFrom == hWndListView))
         {
            switch(Lvinfo->item.iSubItem)
            {
            case 0:
               Lvinfo->item.pszText =  ListItem[Lvinfo->item.iItem].szItemNr;
               break;
            case 1:
               Lvinfo->item.pszText = ListItem[Lvinfo->item.iItem].szItem;
               break;
            case 2:
               Lvinfo->item.pszText = ListItem[Lvinfo->item.iItem].szItemDescription;
               break;
            }
            break;
         }
      }
      
      break;
      
   case WM_CLOSE :
      DestroyWindow(hwnd);
      break;

   case WM_DESTROY :
      PostQuitMessage(0);
      break;
   }
   return DefWindowProc(hwnd, iMsg, wParam, lParam);
}


Título: Re: GUI y eventos
Publicado por: fary en 24 Marzo 2013, 15:38 pm
@x64Core ya se que Beep no le da el foco  :rolleyes:. Lo que busco es saber cuando se ha clicado en el ListView y que item se a seleccionado.

un saludo.


Título: Re: GUI y eventos
Publicado por: x64core en 26 Marzo 2013, 16:01 pm
@x64Core ya se que Beep no le da el foco  :rolleyes:. Lo que busco es saber cuando se ha clicado en el ListView y que item se a seleccionado.

un saludo.

Lee el codigo de arriba