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
Répondre
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.
Comment puis-je connaître la fenêtre sur laquelle le bouton de la souris est cliqué? – akif
Le crochet vous donne le HWND exact de la fenêtre sur laquelle se produit l'événement souris actuel. –
Veuillez lire la documentation de Microsoft sur le hook WH_MOUSE. –
Activez Microsoft Active Accessibility et SetWinEventHook sur MSDN. Je pense que vous pouvez y arriver en les utilisant efficacement.
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);
}
}
}
}
- 1. Crochet de souris global + simulation des entrées de la souris
- 2. comment redémarrer un crochet de la souris?
- 3. Fermeture des retards de fenêtre si un crochet de la souris est réglé
- 4. Win32 - comment gérer le fil de mon crochet de souris
- 5. Exemple de travail d'un crochet de souris JNA
- 6. Envoyer un clic de souris à une position spécifique sans déplacer la souris
- 7. Crochet Win32 WH_CBT - fermer la fenêtre avant sa création
- 8. L'animation WPF ralentit lorsque la souris est dans la fenêtre
- 9. Windows: Souris sur la décoration de la fenêtre
- 10. onclick fenêtre ouverte et la taille spécifique
- 11. Crochet clavier Java
- 12. Tracer un tracé spécifique dans une fenêtre à plusieurs parcelles?
- 13. Opengl Fenêtre avec contrôle de la souris pour gagner 32
- 14. Simuler le clic de la souris sur la fenêtre au lieu de l'écran
- 15. Déterminez quand un crochet de la souris a traité le dernier message
- 16. XLib Lock Position de la souris (habillage de la souris)
- 17. Crochet côté client SVN
- 18. Passage de la souris dans NSTableView
- 19. En utilisant C#, comment verrouiller une souris dans une fenêtre à des fins de jeu?
- 20. Empêche vim de passer à une fenêtre spécifique
- 21. comment envoyer la souris cliquez sur la fenêtre réduite?
- 22. ASP.NET: crochet global dans la réponse?
- 23. Obtenir Bounds d'une fenêtre spécifique
- 24. WPF MenuItem vs Comportement des boutons dans une nouvelle fenêtre quand la souris est toujours arrêtée
- 25. Enregistrer un crochet global pour détecter si la souris glisse des fichiers/texte
- 26. Comment désactiver le bouton droit de la souris sur une seule image spécifique
- 27. vérifier si une souris a été cliqué dans une zone spécifique
- 28. Réglage de la position de la souris
- 29. Crochet de clavier JNA dans Windows
- 30. La fenêtre WS_EX_LAYERED ne reçoit pas les événements souris
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
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