Lecture à partir d'un champ de texte dans une autre fenêtre de l'application
Est-il un moyen pour une application Windows pour accéder à d'autres applications de données, plus précisément un champ de saisie de texte en mode graphique, et de saisir le texte pour le traitement dans notre propre application?
Si elle est possible, est-il un moyen de "bouclier" de votre application pour l'empêcher?
EDIT: Les trois premières réponses semblent être sur la une autre les demandes de titre de la fenêtre, non un champ de saisie de texte dans la fenêtre.
Je ne suis pas d'API Windows s'attendre, donc, pourriez-vous être plus précis, comment puis-je trouver un certain champ de texte dans cette fenêtre, quels sont les prequisites pour elle (on dirait que le fait de connaître un handle de fenêtre quelque chose est nécessaire, il faut connaître le champ de texte de la poignée ainsi? Comment puis-je obtenir? etc...)
Des extraits de Code en C++ serait vraiment très apprécié. L'aide MSDN est dur à parcourir depuis Win32 API a de l'atrocité des conventions de nommage.
Terminé! Voir ma réponse ci-dessous pour un savoir-faire en C++.
Vous devez vous connecter pour publier un commentaire.
Pour la lecture du contenu du texte à partir d'un autre texte de l'application de boîte, vous aurez besoin d'obtenir que le contrôle de zone de texte de la poignée de fenêtre en quelque sorte. Selon la façon dont votre INTERFACE utilisateur de l'application est conçue (si il a une INTERFACE utilisateur qui est) il y a un couple de façons différentes que vous pouvez utiliser pour obtenir cette poignée. Vous pouvez utiliser "FindWindow"/"FindWindowEx" pour localiser votre contrôle ou d'utiliser des "WindowFromPoint" si cela fait sens. De toute façon, une fois que vous avez la poignée pour le contrôle de texte vous pouvez envoyer un "WM_GETTEXT" message pour récupérer son contenu (en supposant que c'est une norme de contrôle de zone de texte). Voici un concocté échantillon (sans contrôles d'erreur):
J'ai utilisé "Spy++" pour obtenir la poignée pour une zone de texte de la fenêtre qui s'est passé à traîner.
Aussi pour la protection de vos propres zones de texte à partir de l'inspection de ce genre, vous pouvez toujours sous-classe de votre zone de texte (voir "SetWindowLong" avec "GWL_WNDPROC" pour le "nIndex" paramètre) et faire un peu de traitement spécial de la "WM_GETTEXT" message afin de s'assurer que seules les demandes à partir du même processus sont desservies.
OK, j'ai compris cela.
Le point de départ est maintenant de savoir la poignée de la fenêtre exactement, nous savons seulement partielle de titre de la fenêtre, de sorte que la première chose à faire est de trouver que la fenêtre principale:
qui énumère toutes les fenêtres sur le bureau. Il fait un rappel avec chacun de ces poignées de fenêtre:
et à l'aide de la wsTitle et peu regex magie, nous pouvons trouver la fenêtre que nous voulons.
En utilisant les Spy++ je pouvais comprendre le champ de saisie nom de la classe et l'utiliser pour trouver voulais champ dans la hwndWindow:
et puis on peut lire le texte de ce champ:
J'espère que cela aide quelqu'un combat avec le même problème!
TCHAR wsTitle[2048];
dans le rappel de code. La Source est déjà perdu, désolé.Regarder AutoHotkey. Si vous avez besoin d'une API pour votre application, regardez leurs sources.
Pour éviter cela, utilisez un widget personnalisé au lieu de WinForms, MFC ou de l'API Win32. Qui n'est pas infaillible, mais il aide.
Sur la façon de bouclier de l'application pour éviter cela, vous pouvez faire beaucoup de choses.
Un autre moyen serait d'avoir un contrôle à la poignée de saisie de texte qui construisent le texte permet de dire quelques étiquettes placées là où le texte serait, ou qui dessine le texte sous forme de graphique.
Oui, il est possible de plusieurs façons (une façon est d'utiliser WINAPI et de GetWindow GetWindowText).
D'abord, obtenir une poignée à la zone de texte que vous souhaitez extraire du texte à partir d' (à l'aide de la fonction FindWindow, EnumChildWindows et d'autres Api), puis:
Vieux VB6-codeexample, la déclaration de l'API:
Code pour extraire du texte:
Vous pouvez également obtenir le texte d'un contrôle richedit avec EM_GETTEXTRANGE message, mais il ne fonctionne que dans le même processus dans lequel le contrôle a été créé.
http://msdn.microsoft.com/en-us/library/ms633499.aspx