Curseur sur icone [Résolu]

juju116 23 Messages postés samedi 14 mars 2009Date d'inscription 1 février 2010 Dernière intervention - 11 avril 2009 à 19:01 - Dernière réponse : cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention
- 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
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 15 avril 2009 à 09:36
3
Merci
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.

Merci cs_rt15 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de cs_rt15
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 11 avril 2009 à 21:18
0
Merci
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.
Commenter la réponse de cs_rt15
Miquel75 41 Messages postés mercredi 5 mars 2008Date d'inscription 23 avril 2009 Dernière intervention - 12 avril 2009 à 07:48
0
Merci
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)
Commenter la réponse de Miquel75
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 12 avril 2009 à 09:12
0
Merci
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 .
Commenter la réponse de cs_rt15
juju116 23 Messages postés samedi 14 mars 2009Date d'inscription 1 février 2010 Dernière intervention - 12 avril 2009 à 10:38
0
Merci
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.
Commenter la réponse de juju116
juju116 23 Messages postés samedi 14 mars 2009Date d'inscription 1 février 2010 Dernière intervention - 12 avril 2009 à 15:23
0
Merci
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
Commenter la réponse de juju116
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 14 avril 2009 à 19:20
0
Merci
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;
}
Commenter la réponse de cs_rt15
juju116 23 Messages postés samedi 14 mars 2009Date d'inscription 1 février 2010 Dernière intervention - 14 avril 2009 à 21:38
0
Merci
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.
Commenter la réponse de juju116
juju116 23 Messages postés samedi 14 mars 2009Date d'inscription 1 février 2010 Dernière intervention - 15 avril 2009 à 17:35
0
Merci
mon dieux ^^ ben merci à force de mdonner des infos comme ça jyarrivereré peut etre :p c dur quand on debute :(
Commenter la réponse de juju116
juju116 23 Messages postés samedi 14 mars 2009Date d'inscription 1 février 2010 Dernière intervention - 21 avril 2009 à 10:34
0
Merci
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é
Commenter la réponse de juju116
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 21 avril 2009 à 10:50
0
Merci
Hein ??

Toutes les icônes du bureau ne sont pas dans shell32.
Commenter la réponse de cs_rt15

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.