Appuyez par programme sur un bouton d'une autre application (C, Windows)
Je suis en train d'utiliser le code suivant pour appuyer sur un bouton sur mon autre application:
HWND ButtonHandle;
if( (wnd = FindWindow(0, "Do you want to save?")) )
{
ButtonHandle = FindWindowEx(wnd, 0, "SaveButton", "&Save");
SendMessage(wnd, WM_COMMAND, MAKEWORD(GetDlgCtrlID(ButtonHandle), BN_CLICKED ), (LPARAM)ButtonHandle);
}
Il ne fonctionne pas. J'ai essayé de passage les différentes poignées de MAKEWORD et de changer le WPARM et LPARAM mais rien.
Toutes les idées sur la manière de cliquer sur un bouton sur une autre fenêtre de l'application?
Code est apprécié.
Merci.
EDIT:
La raison pour laquelle il ne semble pas fonctionner autorisations. J'ai envoyé un PostMessage() et le résultat a été une erreur avec GetLastError() = 5 (ou Accès Refusé).
Des idées?
EDIT2 je ne veux pas être impoli, mais s'il vous plaît veuillez s'il vous plaît, j'ai déjà cherché sur toutes les API, y compris l'obtention et définition des régions pour le bouton, puis l'envoi d'un bouton vers le bas et bouton, l'obtention de l'ID de contrôle, l'obtention de l'ID de classe et d'une foultitude de plus.
La raison que j'ai posé la question ici, en premier lieu, parce que j'ai déjà épuisé mes recherches sur internet.
Si vous connaissez la réponse VEUILLEZ CODE postal, ne suggèrent pas une API et c'est tout, montrez-moi comment cette API permet de résoudre le problème. Il n'est pas difficile.
je vous remercie.
EDIT 3: La question de la réponse a été sélectionnée automatiquement lorsque le bounty fini. La question reste encore sans réponse.
source d'informationauteur wonderer
Vous devez vous connecter pour publier un commentaire.
poignée?
Mise à jour: je crois que cela devrait fonctionner,
Vous devez envoyer un clic sur un bouton deux fois. Je ne sais pas pourquoi (peut-être le premier clic seulement active la fenêtre du bouton), mais je suis en utilisant ce code pour une longue période et il a toujours travaillé pour moi.
peut-être cela peut vous aider:
http://www.cplusplus.com/forum/beginner/8806/
Voir la solution ci-dessous, vous pouvez également utiliser
Ou
Note:
Obtention d'assurer à partir de la fenêtre de texte,le texte du bouton (vérifier si il y a de l'espace à la fin du titre de la fenêtre)
Des erreurs d'accès Refusé sur SendMessage ou PostMessage n'ont pas de sens, sauf si le processus de l'envoi du message est en cours d'exécution à une baisse du niveau d'intégrité que le processus cible.
Cela ne devrait pas se produire à moins que le processus qui possède la fenêtre cible est en cours d'exécution "asAdministrator" ou d'un service. Et ses sacrément dur pour les services pour créer des fenêtres sur le bureau interactif avec Windows à partir de 6 ans.
Vous pouvez faire un peu de lecture à propos de Des Niveaux D'Intégrité Ici si elles s'appliquent, même de loin, à cette situation. Internet Explorer est le seul autre application qui opte à l'intégrité du modèle de sécurité de dessein par l'abaissement du niveau d'intégrité de lui-même pour sandbox lui-même de manière plus efficace.
Si vous pouvez lever la fenêtre contenant le bouton, vous pouvez envoyer des premières événement de souris à un poste dans les limites de bouton.
Il y a deux fonction pour simuler événement de souris SendInput et
mouse_event
. Je recommande d'utilisermouse_event
fonction. Pour élever une fenêtre que vous pouvez utiliser ShowWindow. Je ne sais pas comment pour obtenir le handle d'un bouton, mais si vous avez de ses hWnd est facile de trouver sa position absolue à l'aide de GetWindowRect fonction. Essayez d'utiliser ces, si vous rencontrez des problèmes, je serai heureux de vous aider.Ou de définir une coutume WM au sein de votre application fenêtre pour gérer enregistrer la demande.
WM_CUSTOM
ouWM_USER
(ne me souviens plus qui) marque le début d'défini par l'utilisateur de la fenêtre de messages.Quand je dois faire ce genre de choses-je utiliser SendKeys. Il est VB-ish et C# fournit une interface agréable à utiliser, mais pour le C/C++, vous aurez à le faire <de cette façon>. Ce qui est sympa c'est que l'on peut écrire des scripts et de les exécuter à la place de codage en dur dans votre code.
Microsoft est en train de pousser Active Accessibility (MSAA) pour UI Automation,
(Il a été renommé un certain nombre de fois au fil des années)
voir
Désolé je n'ai pas de code simple pour vous aider à démarrer. “SendMessage()” ne semble pas fonctionner pour vous, je ne sais pas d'autre option à part “UI Automation”
Je suis en supposant que vous avez vérifier avec Spy++ (installé avec MsDev) que vous message sont en cours d'envoyer le bon bouton, etc – et que le bouton est un standard de windows boutons. Mon premier instant dirais utiliser “SendMessage()" ou "PostMessage ()”, mais étant donné le nombre de réponses à propos de “SendMessage()” et le fait qu'il ne fonctionne pas pour vous. J'attends que quelqu'un va sur...
Vous pouvez utiliser sendkeys (tr3 a dit) pour envoyer des clics de souris, ce qui est différent que d'utiliser SendMessage. Il est également moins directe et plus hack-ish, mais est utile pour l'automatisation (en VBS).
Aussi, juste une supposition, mais le problème pourrait être que votre message manipulation est cassé quelque part en ne demandant pas le membre de classe de base. Exemple:
si vous assurez-vous ButtonHandle sont valables poignée vous pouvez utiliser la paire de WM_LBUTTONDOWN et WM_LBUTTONUP message au lieu de BN_CLICKED
Un non-C approche: l'Utilisation de Java et java.awt.Classe de Robot pour déplacer la souris autour d'effectuer des clics (je pense qu'il y a quelque chose dans le Monde de Windows pour cela, aussi).
Problème: Vous ne savez jamais où votre bouton 😀