2009-10-28 18 views
0

Je dois définir un crochet sur les clics de souris, en utilisant C++, Win API. Alors, quand on clique sur une icône sur le bureau, j'obtiens l'événement. Comment cela arrivera-t-il? Je pense que les seules informations que je reçois dans l'événement hook de la souris sont les coordonnées de la souris, n'est-ce pas? Maintenant, comment puis-je m'assurer que la chose cliquée est une icône sur le bureau?Crochet de la souris dans une fenêtre spécifique

+0

Je pense que vous devez expliquer vos besoins plus en détail - voulez-vous juste savoir quand l'icône est lancée? avez-vous besoin de surveiller toutes les icônes tout le temps ou attendez-vous simplement que l'utilisateur clique sur une icône dans une circonstance spécifique? – Elemental

+0

Non, je dois surveiller pour l'utilisateur de cliquer sur une icône. Ensuite, je dois obtenir les détails de l'icône, le nom de l'icône, etc. – akif

Répondre

1

Implémentez un hook de souris dans une DLL et utilisez SetWindowsHookEx() pour installer le hook pour le thread qui gère la fenêtre du bureau. Utilisez GetDesktopWindow() et GetWindowThreadProcessId() pour obtenir cet ID de thread. ensuite, à chaque fois que votre hook est déclenché, le hook vous indiquera sur quelle fenêtre l'utilisateur clique et quelle opération de la souris est effectuée. Utilisez GetClassName() pour déterminer si la fenêtre qui déclenche le hook est une ListView, et si c'est le cas, utilisez l'API ListView pour interroger la fenêtre sur les coordonnées de la souris.

+0

Comment puis-je connaître la fenêtre sur laquelle le bouton de la souris est cliqué? – akif

+0

Le crochet vous donne le HWND exact de la fenêtre sur laquelle se produit l'événement souris actuel. –

+0

Veuillez lire la documentation de Microsoft sur le hook WH_MOUSE. –

0

Activez Microsoft Active Accessibility et SetWinEventHook sur MSDN. Je pense que vous pouvez y arriver en les utilisant efficacement.

0

Ce code fonctionne dans une DLL hook que j'ai créée. Je pense que le problème ici est qu'il est facile d'obtenir des choses comme le texte de l'icône, mais comprendre comment accéder à l'application sous-jacente à un raccourci est un autre problème entièrement. C'est la connaissance qui réside dans l'application gérant la liste, dans ce cas, l'explorateur. Pardonnez le code désespérément démodé, j'ai fait ce test dans une ancienne DLL ANSI hook. DebugStr est juste un wrapper pour OutputDebugString. Le code est basé sur l'affichage de Remy.

LRESULT DLL_CALL MouseFunc (int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    BOOL bGoActive = TRUE; 
    char szDebug [200]; 
    char szBuff [100]; 

    MOUSEHOOKSTRUCT * pmhs = (MOUSEHOOKSTRUCT *)lParam; 
    LVFINDINFO lvfi; 
    LVITEM lvi; 
    int iIndexItem; 

    long lx = pmhs->pt.x; 
    long ly = pmhs->pt.y; 

    if (nCode >= 0) 
    { 
     if (wParam == WM_LBUTTONDOWN) 
     { 
     GetClassName (pmhs->hwnd, szBuff, sizeof(szBuff)); 

     wsprintf (szDebug, "wparam=0x%X, nCode=%d, HTC=%d, class='%s', x=%d, y=%d", 
        wParam, nCode, pmhs->wHitTestCode, szBuff, lx, ly); 
     DebugStr (szDebug); 

     if (strcmpi (szBuff, TEXT("SysListView32")) == 0) 
     { 
      ZeroMemory (&lvfi, sizeof(lvfi)); 
      lvfi.flags = LVFI_NEARESTXY; 
      lvfi.pt.x = lx; 
      lvfi.pt.y = ly; 
      ScreenToClient (pmhs->hwnd, &(lvfi.pt)); 
      lvfi.vkDirection = VK_NEXT; 
      iIndexItem = ListView_FindItem (pmhs->hwnd, -1, &lvfi); 

      if (iIndexItem != -1) 
      { 
       ZeroMemory (&lvi, sizeof(lvi)); 
       lvi.mask = LVIF_TEXT; 
       lvi.iItem = iIndexItem; 
       lvi.pszText = szBuff; 
       lvi.cchTextMax = sizeof(szBuff); 

       if (ListView_GetItem (pmhs->hwnd, &lvi)) 
       { 
        wsprintf (szDebug, "item text = '%s'", szBuff); 
        DebugStr (szDebug); 
       } 
      } 
     } 
     } 
Questions connexes