none
Cómo obtener las coordenadas del icono de un archivo en la pantalla ?. RRS feed

  • Pregunta

  • Saludos. Estoy intentando obtener las coordenadas del icono de un archivo. En específico necesito saber las coordenadas de un icono de la pantalla y a qué archivo pertenece. He intentado utilizando las funciones del shell. Mi código es el siguiente.

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

                           

    #include "stdafx.h"
    #include <cstdlib>
    #include <iostream>
    #include <windows.h>
    #include <Shlobj.h>
    #include <Commctrl.h>

    using namespace std;

    int main(int argc, char *argv[])
    {

        SHFILEINFO fileInfo ;

        ICONINFO   iconInfo ;
        IMAGEINFO *pImageInfo = NULL ;
    LPCTSTR name = TEXT( "C:\\Users\\TAFOYA\Desktop\\PRUEBA_DEVC++\\FILE DESCRIPTOR.txt" );
    UINT flags = SHGFI_ICON | SHGFI_ICONLOCATION | SHGFI_SYSICONINDEX  | SHGFI_TYPENAME | SHGFI_DISPLAYNAME | SHGFI_ATTRIBUTES;
        static HIMAGELIST imageList;
        int iconSizeX = 0 , iconSizeY = 0 ;

        //Obtener un handle del ícono del archivo
        SHGetFileInfo( name , FILE_ATTRIBUTE_ARCHIVE ,
                       &fileInfo , sizeof( SHFILEINFO ) , 
                       SHGFI_ATTRIBUTES | SHGFI_DISPLAYNAME | SHGFI_ICON | SHGFI_ICONLOCATION  );

       for( int i = 0 ; i < 60 ; i++ )
       cout << name[i]; 

    if( fileInfo.hIcon == NULL )
    printf(" ICON is Empty\n\n");
    else
    printf(" FileName: %s." , fileInfo.szDisplayName );



        //Obtener la información sobre el archivo. ICONINFO   
        GetIconInfo( fileInfo.hIcon , &iconInfo );  

    if( iconInfo.hbmColor == NULL )
    printf("iconInfo is empy. ERROR\n");

        //OBTENER EL TAMAÑO DEL ÍCONO QUE SE MANEJA EN EL SISTEMA.
        iconSizeX = GetSystemMetrics( SM_CXICON );
        iconSizeY = GetSystemMetrics( SM_CYICON );

        //Crear una lista de imágenes
        imageList = ImageList_Create( iconSizeX, iconSizeY, ILC_COLOR , 10, 1 ); 

    ImageList_Add( imageList, iconInfo.hbmColor, iconInfo.hbmMask );
    ImageList_Add( imageList, iconInfo.hbmColor, iconInfo.hbmMask );
    ImageList_Add( imageList, iconInfo.hbmColor, iconInfo.hbmMask );
    ImageList_Add( imageList, iconInfo.hbmColor, iconInfo.hbmMask );
    ImageList_Add( imageList, iconInfo.hbmColor, iconInfo.hbmMask );
    ImageList_Add( imageList, iconInfo.hbmColor, iconInfo.hbmMask );
    ImageList_Add( imageList, iconInfo.hbmColor, iconInfo.hbmMask );
    ImageList_Add( imageList, iconInfo.hbmColor, iconInfo.hbmMask );
    ImageList_Add( imageList, iconInfo.hbmColor, iconInfo.hbmMask );
    ImageList_Add( imageList, iconInfo.hbmColor, iconInfo.hbmMask );

    ImageList_GetImageInfo( imageList, 1, pImageInfo);

    if( pImageInfo != NULL )
    printf( "\n", pImageInfo->rcImage.left , 
    pImageInfo->rcImage.top  , 
    pImageInfo->rcImage.right,
    pImageInfo->rcImage.bottom );
    else
    printf("pImageInfo is empty.\n");

        printf( "Size: %d - %d\n" , iconSizeX, iconSizeY );  


        system( "PAUSE" );               

    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    Es bastante sencillo e informal, puesto que sólo lo hice para probar las funciones. No tiene ningún error en tiempo de compilación, pero en tiempo de ejecución, la función SHGetFileInfo(), no me detecta nada, no funciona en sí, me regresa los campos vacíos. Esto usando visual stdio. Utilizando el Dev C++, funciona, la función llena las estructuras correctamente y puedo obtener el icono del archivo, pero no puedo utilizar las funciones ImageList_Create(). Alguien sabe cuál puede ser el error lógico?. O bien, alguien sabe cómo puedo utlizar las funciones ImageList_Create(), ImageList_Add(), en el IDE DevC++ ?

    viernes, 9 de agosto de 2013 1:13

Todas las respuestas

  • De nuevo te comento que SHGetFileInfo() no tiene nada que ver con las coordenadas de un icono en pantalla.

    Simplemente obtiene información varia sobre el fichero en disco, no en memoria ni en donde está en la pantalla.

    Si SHGetFileInfo() no te rellena la estructura bien, puedes mirar el valor que devuelve para ver dónde está el error.


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/

    viernes, 30 de agosto de 2013 14:52
    Moderador