Curseur sur icone

Résolu
juju116 Messages postés 23 Date d'inscription samedi 14 mars 2009 Statut Membre Dernière intervention 1 février 2010 - 11 avril 2009 à 19:01
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 21 avril 2009 à 10:50
bonjour je cherche a savoir si quelqu'un peut m'aider, j'aimerais savoir sur quel dossier, fichier ou icone je me trouve lorsque je passe ma souris dessus.si quelqu'un à un code pour m'aider je suis vraiment un debutant et j'ai du mal sur l'air de microsoft^^.
merci beaucoup

11 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
15 avril 2009 à 09:36
Ah, il s'agit donc bien de faire ça pour une autre application... En l'occurrence l'explorateur windows (explorer.exe), qui gère aussi les icônes du bureau.

Après inspection via spy++, sous XP, la fenêtre utilisée pour le bureau et dans l'explorateur est de classe SysListView32 et de caption FolderView. Ces fenêtres ont bien le style étendu LVS_EX_INFOTIP (Normal, vu qu'elle affiche des tool tips). Des WM_NOTIFY sont donc bien envoyés lorsque la souris reste sur un item.

Je crois qu'il faudrait que tu mettes en place un hook des messages. Exemple ici et . Globalement, il faut que tu mélanges le source ci-dessus avec un de ces deux sources, mais pas en faisant un hook global. Il faudrait juste hooker les messages envoyés aux SysListView32.
3
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
11 avril 2009 à 21:18
Salut,

Savoir sur quel fichier passe le curseur dans l'explorateur windows ? Tendu... Tu as WindowFromPoint ou des fonctions similaires qui peut peut être t'aider... Espionner ce qui se passe avec spy++ peut éventuellement te donner plus d'infos. Mais même pas sûr.

Bon courage.
0
Miquel75 Messages postés 41 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 23 avril 2009
12 avril 2009 à 07:48
Ca n'a pas de rapport avec WindowFromPoint ..
Un fichier ou une icône, c'est un objet, pas une fenêtre !
Ca se fait depuis des lustres avec les Win32 MA Apis. Très simple (MS)
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
12 avril 2009 à 09:12
Miquel -> "MA" ? Et tu peux être à peine plus précis ?

juju -> En attendant la solution de Miquel, mieux que WindowFromPoint, tu dois pouvoir utiliser les messages. Regarde du côté de LVS_EX_INFOTIP. Exemple ici et .
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
juju116 Messages postés 23 Date d'inscription samedi 14 mars 2009 Statut Membre Dernière intervention 1 février 2010
12 avril 2009 à 10:38
apparemment il fudrait que j'utilise la list view ça aide deja de trouver des infos ^^ reste à savoir comment l'utiliser surtout que msdn c'est de l'anglais et je comprend pas vraiment bien comment cette fonction marche.
0
juju116 Messages postés 23 Date d'inscription samedi 14 mars 2009 Statut Membre Dernière intervention 1 février 2010
12 avril 2009 à 15:23
bon si j'ai bien compris dans mon programme je dois créer une listview ,et je devrais mettre en place des info tips à afficher en fonction de l'itelm sur lequel est positioné mon curseur de souris. sur le site de la msdn ou tu m'as envoyé jé vu la notification LVN_GETINFOTIP. reste plus qu'a comprendre comment marche tout ça ça reste tendu pour moi^^list view je ne connais pas du tout et vu kque je suis un vrais debutant en api win 32 lol
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
14 avril 2009 à 19:20
Ah en fait tu veux savoir sur quel icône ta souris se trouve, mais dans ta propre application ? Bin c'est un peu plus simple d'un coup.

Le code suivant affiche dans la barre de status le texte de l'item d'une listview.
Bon ça marche bien pour ce qui est d'afficher le curseur quand celui-ci arrive sur l'item. Par contre, pour effacer le texte quand on quitte l'item, je vois pas comment faire...

Nécessite kernel32.lib, user32.lib et comctl32.lib en entrée du lieur. Pour compiler sous gcc, ajouter -nostartfiles -nodefaultlibs -nostdlib -ffreestanding dans les options du lieur. Pour compiler sous VC, s'arranger pour que le lieur ignore toutes les librairies par défaut (/nodefaultlib).
<hr size="2" width="100%" />#ifdef UNICODE
#define _UNICODE
#endif /* UNICODE */

/* Requis pour LVN_GETINFOTIP */
#define _WIN32_IE 0x0400

#include <windows.h>
#include <tchar.h>
#include <commctrl.h>

HINSTANCE _hThisInstance;              /* Handle du module                    */
HWND _hWnd;                            /* Handle de la fenêtre                */
HWND _hStatusBar;                      /* Handle sur la bar de status         */
HWND _hListView;                       /* Handle sur la listview              */
LPTSTR _lpAppName = _T("ListView");    /* Nom de l'appli                      */

DWORD _nStatusBarHeight;               /* Redimenssionement de la listview    */
TCHAR _lpItems[3][10] = {_T("titi"), _T("toto"), _T("tata")};

/**
 * Affiche un message d'erreur correspondant à la dernière erreur Win32
 */
DWORD ShowLastError()
{
  DWORD nLastError;           /* Numéro de l'erreur                           */
  LPTSTR lpMessageBuffer;     /* Récupération du message                      */

  nLastError = GetLastError();

  /* Formatage du message */
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (void*)&lpMessageBuffer, 0, NULL);

  /* Affichage du message */
  MessageBox(NULL, lpMessageBuffer, _T("ERROR"), MB_OK | MB_ICONERROR);

  LocalFree(lpMessageBuffer);
  return nLastError;
}

/**
 * Traitement des messages
 */
LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{
  MINMAXINFO *lpMinMaxInfo;   /* Info sur les tailles min et max de la fenêtre */
  RECT clientRect;            /* Taille de la zone cliente                     */
  int bHandled;               /* Pour savoir si le message est traité          */
  long nResult;

  nResult = 0;
  bHandled = 0;
  switch (nMessage)
  {
    case WM_GETMINMAXINFO:
      lpMinMaxInfo = (MINMAXINFO*)lParam;
      lpMinMaxInfo->ptMinTrackSize.x = 300;
      lpMinMaxInfo->ptMinTrackSize.y = 200;
      bHandled = 1;
      break;

    case WM_SIZE:
      /* On signale à la barre de status que la fenêtre a été redimenssionnée */
      SendMessage(_hStatusBar, WM_SIZE, wParam, lParam);

      /* On ajuste la taille de la listview */
      GetClientRect(_hWnd, &clientRect);
      SetWindowPos(_hListView, 0, 0, 0,
                   clientRect.right - clientRect.left,
                   clientRect.bottom - clientRect.top - _nStatusBarHeight,
                   SWP_NOMOVE | SWP_NOZORDER);
      break;

    case WM_NOTIFY:
      if (((NMHDR*)lParam)->code == LVN_GETINFOTIP)
        SendMessage(_hStatusBar, SB_SETTEXT, 0, (LPARAM)_lpItems[((NMLVGETINFOTIP*)lParam)->iItem]);
      break;

    case WM_DESTROY:
      /* On signale que le thread va s'arrêter */
      PostQuitMessage(0);
      bHandled = 1;
      break;
  }
  if (! bHandled)
    nResult = DefWindowProc(hWnd, nMessage, wParam, lParam);
  return nResult;
}

/**
 * Ajoute la barre de status
 */
int CreateStatusBar()
{
  int nWidth;                 /* Largeur de la partie 0                        */
  RECT statusBarRect;         /* Taille de la barre de status                  */
  int nResult;

  nResult = 0;

  /* Création de la barre de status */
  _hStatusBar = CreateWindowEx(0, STATUSCLASSNAME, (LPCTSTR)NULL,
                               SBARS_SIZEGRIP | WS_CHILD | WS_VISIBLE,
                               0, 0, 0, 0,
                               _hWnd, NULL, _hThisInstance, NULL);
  if (! _hStatusBar) goto the_end;

  /* Affectation du nombre de parties */
  nWidth = -1;
  SendMessage(_hStatusBar, SB_SETPARTS, (WPARAM)1, (LPARAM)&nWidth);

  /* Calcul de la hauteur de la barre de status */
  GetWindowRect(_hStatusBar, &statusBarRect);
  _nStatusBarHeight = statusBarRect.bottom - statusBarRect.top;

  nResult = 1;
the_end:
  return nResult;
}

/**
 * Crée une imagelist utilisée par la listview
 */
int CreateImageList()
{
  HIMAGELIST hImageList;    /* Handle sur la imagelist                        */
  int nResult;

  nResult = 0;

  /* Création de la liste */
  hImageList = ImageList_Create(GetSystemMetrics(SM_CXICON),
                                GetSystemMetrics(SM_CYICON),
                                ILC_MASK, 1, 1);
  if (! hImageList) goto the_end;

  /* Ajout d'un icône */
  if (ImageList_ReplaceIcon(hImageList, -1, LoadIcon(NULL, IDI_APPLICATION)) == -1) goto the_end;

  /* Affectation de la imagelist à la listview */
  SendMessage(_hListView, LVM_SETIMAGELIST, (WPARAM)LVSIL_NORMAL, (LPARAM)hImageList);

  nResult = 1;
the_end:
  return nResult;
}

/**
 * Crée les items de la listview
 */
int CreateItems()
{
  LVITEM item;
  int nI;

  item.mask = LVIF_TEXT | LVIF_IMAGE;
  item.iImage = 0;
  item.iSubItem = 0;

  /* Initialisation des items */
  for (nI = 0; nI < 3; nI++)
  {
    item.iItem = nI;
    item.pszText = _lpItems[nI];
    SendMessage(_hListView, LVM_INSERTITEM, 0, (LPARAM)&item);
  }

  return 1;
}

/**
 * Ajoute la listview
 */
int CreateListView()
{
  HWND hTips;     /* Handle sur les tool tips                                 */
  int nResult;

  nResult = 0;

  _hListView = CreateWindowEx(0, WC_LISTVIEW, (LPCTSTR)NULL,
                              WS_CHILD | LVS_ICON | WS_VISIBLE,
                              0, 0, 0, 0,
                              _hWnd, NULL, _hThisInstance, NULL);
  if (! _hListView) goto the_end;

  /* Pour que la listview envoie des message lors du survol des items */
  SendMessage(_hListView, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_INFOTIP, LVS_EX_INFOTIP);

  /* Pour que WM_NOTIFY arrivent instantanément lors du survol d'un item */
  hTips = (HWND)SendMessage(_hListView, LVM_GETTOOLTIPS, 0, 0);
  SendMessage(hTips, TTM_SETDELAYTIME, TTDT_INITIAL, 1);
  SendMessage(hTips, TTM_SETDELAYTIME, TTDT_RESHOW, 1);

  if (! CreateImageList()) goto the_end;
  if (! CreateItems()) goto the_end;

  nResult = 1;
the_end:
  return nResult;
}

/**
 * Initialise la fenêtre principale de l'appli.
 */
int CreateMyWindow()
{
  WNDCLASSEX wincl;       /* Classe de la fenêtre utilisée                    */
  int nResult;

  nResult = 0;

  /* Création de la classe de fenêtre */
  wincl.cbSize = sizeof(WNDCLASSEX);
  wincl.style = 0;
  wincl.lpfnWndProc = WindowProcedure;
  wincl.cbClsExtra = 0;
  wincl.cbWndExtra = 0;
  wincl.hInstance = _hThisInstance;
  wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
  wincl.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
  wincl.lpszMenuName = 0;
  wincl.lpszClassName = _lpAppName;
  wincl.hIconSm = NULL;

  /* Enregistrement de la classe */
  if (! RegisterClassEx(&wincl)) goto the_end;

  /* Création de la fenêtre */
  _hWnd = CreateWindowEx(0, _lpAppName, _lpAppName,
                         WS_OVERLAPPEDWINDOW,
                         CW_USEDEFAULT, CW_USEDEFAULT, 500, 300,
                         HWND_DESKTOP, NULL, _hThisInstance, NULL);
  if (! _hWnd) goto the_end;

  /* Création de la barre de status */
  if (! CreateStatusBar()) goto the_end;

   /* Création de la listview */
  if (! CreateListView()) goto the_end;

  /* Affichage de la fenêtre */
  ShowWindow (_hWnd, SW_SHOW);

  nResult = 1;
the_end:
  return nResult;
}

/**
 * Main
 */
int __cdecl WinMainCRTStartup()
{
  MSG messages;                       /* Messages envoyés à l'application     */
  INITCOMMONCONTROLSEX initCommon;    /* Initialisation de comctl32           */
  int nResult;

  initCommon.dwSize = sizeof(initCommon);
  initCommon.dwICC = ICC_BAR_CLASSES | ICC_LISTVIEW_CLASSES;
  InitCommonControlsEx(&initCommon);

  /* Récupération du handle du module */
  _hThisInstance = GetModuleHandle(NULL);

  if (! CreateMyWindow())
  {
    nResult = ShowLastError();
    goto the_end;
  }

  /* Boucle de traitement des messages */
  while (GetMessage(&messages, NULL, 0, 0))
  {
    TranslateMessage(&messages);
    DispatchMessage(&messages);
  }
  nResult = messages.wParam;

the_end:
  /* ExitProcess nécessaire car sinon c'est un ExitThread */
  ExitProcess(nResult);

  /* Pour esquiver le warning */
  return 0;
}
0
juju116 Messages postés 23 Date d'inscription samedi 14 mars 2009 Statut Membre Dernière intervention 1 février 2010
14 avril 2009 à 21:38
ah ben merci pour le code ; je vais essayé de l'etudié pour comprendre comment ça marche, en fait ce que je veu faire c'est que lorsque ma souris passe sur un icone de mon bureau, ou un iconde fichier dossier etc une fenetre s'active au bout d'un délais et que je puisse avoir differentes info sur l'icone, sa taille, son contenu, par exemple pour un dossier de musique avoir des info sur les pistes, l'lbum, la taille, un curseur interactif seulement quand on mexplique ben j'avour j'ai du mal, donc si tu peu me proposer une code et mettre des petites explication ça m'aideré beaucoup =) merci d'avence.
0
juju116 Messages postés 23 Date d'inscription samedi 14 mars 2009 Statut Membre Dernière intervention 1 février 2010
15 avril 2009 à 17:35
mon dieux ^^ ben merci à force de mdonner des infos comme ça jyarrivereré peut etre :p c dur quand on debute :(
0
juju116 Messages postés 23 Date d'inscription samedi 14 mars 2009 Statut Membre Dernière intervention 1 février 2010
21 avril 2009 à 10:34
j'ai bien reçu ton mail et je t'en remercie rt15, est-ce que tu pense que je devrais inclure la shell32.dll, ainsi je devrais charger tout mes icones de bureau non? reste après à l'exploité
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
21 avril 2009 à 10:50
Hein ??

Toutes les icônes du bureau ne sont pas dans shell32.
0
Rejoignez-nous