2013-01-14 5 views
2

Je suis nouveau à la programmation de Windows, la plupart du temps fait Java (Java SE, Java ME, Android, Java EE), donc être détaillée et douce.Puis-je utiliser Global System Hooks pour capturer quel fichier a été cliqué?

Je veux capturer « le nom du fichier/chemin qui a été cliqué dans les fenêtres, comme cliquer sur un fichier sur le bureau »?

Plus de recherche http://www.codeproject.com/Articles/6362/Global-System-Hooks-in-NET, qui est une petite application C#/C++ sympa qui utilise Global System Hooks, pour capturer les événements de souris tels que les coordonnées, les clics, etc.

Alors, quel est le droit API ou crochet Global System qui capture les événements sur les icônes de fichiers?

Répondre

4

Il n'y a pas d'API unique qui fournit ce niveau de détail.

Le WH_MOUSE et WH_MOUSE_LL crochets de SetWindowsHookEx(), ou le message WM_INPUT délivré par RegisterRawInputDevices(), peuvent dire quand la souris est intereacted avec, et la fonction GetCursorPos() peut vous dire où le curseur de la souris se trouve à l'écran au moment d'un clic , mais il ne peut pas vous dire sur quoi il clique. Vous devez comprendre cela manuellement.

Par exemple, le bureau est implémenté comme un contrôle ListView, vous pouvez utiliser les fonctions WindowFromPoint() et GetDesktopWindow() pour vérifier si la souris se trouve aux coordonnées correspondant à la fenêtre de bureau lui-même au lieu d'une fenêtre d'application, et si oui, utiliser les messages LVM_HITTEST et LVM_GETITEM pour déterminer quelle icône onthe bureau est en cours cliqué sur et extraire le texte d'affichage. Puis utilisez la fonction SHGetDesktopFolder() et l'interface IShellFolder, ou la fonction SHParseDisplayName(), pour analyser ce texte et voir s'il renvoie un PIDL qui représente un chemin/fichier, et si c'est le cas, utilisez SHGetPathFromIDList() pour obtenir le chemin/nom de fichier réel.

Si vous voulez faire la même chose avec l'application Windows Explorer, cela devient un peu plus compliqué. Utilisez pour déterminer si la souris est sur l'application Windows Explorer WindowFromPoint(), GetWindowThreadProcessId(), OpenProcess() et EnumProcessModules(). Toutefois, son interface utilisateur passe de la version Windows à la suivante, mais vous devez localiser manuellement le contrôle ciblé via AttachThreadInput() et GetActiveWindow(), vérifier s'il s'agit d'un contrôle TreeView/ListView, et si oui, utiliser des messages spécifiques au contrôle pour obtenir des informations sur l'élément/icône sous les coordonnées du curseur de la souris, et utilisez à nouveau IShellFolder pour comprendre ce que le texte de cet élément/icône représente réellement. La programmation de Shell est un système très complexe et pas pour la feinte de coeur d'interagir avec. Donc, vous devez vous demander, pourquoi avez-vous besoin de cette information en premier lieu?

Questions connexes