Accueil > Forum > > > > PostMessage
PostMessage
mardi 27 juin 2006 à 14:52:20 |
PostMessage

la_gavorade
|
Bonjour à tous,
J'ai un soucis avec PostMessage (ça va être un peu long, je vous préviens) :
Voilà, j'ai fait une appli qui entre autres lance un programme externe (programme de stats dont l'interface ressemble bcp à une invite de commande), et j'ai besoin de simuler des entrées clavier pour lancer les macros de ce programme externe.
Alors quand je le lance sur mon poste, pas de pb, je fais des keybd_event et ça marche. Le pb est que je veux également qu'elle fonctionne à partir d'un serveur virtuel auquel j'accède par une connexion bureau à distance. Là encore, si je reste sur le bureau du serveur virtuel, ça marche, mais dès que je ferme ou minimise la fenêtre de ce serveur, alors le keybd_event ne marche plus.
J'ai bien essayé de forcer la mise au premier plan de la fenêtre du prg en utilisant SetForeGround, et c'est OK....là encore si je reste sur le bureau du serveur, sinon ça marche pas.
Ma piste d'aujourd'hui, c'est d'utiliser un PostMessage en indiquant le handle de la fenêtre du prg, puis les touches à simuler, mais là bizarre, mon PostMessage ne fait rien du tout.
(J'ai bientôt fini). J'ai donc créé un petit test qui met une fenêtre Notepad en premier plan puis écrit dedans, et ça marche pas. Je vous montre le code correspondant :
J'utilise un FindWindow(Notepad) pour trouver le handle du Notepad, puis un SetForeGround(handle_notepad). Tout ça, ça marche
C'est maintenant que ça marche plus, et pourtant la fenêtre Notepad est bien en surbrillance :
PostMessage(handle_notepad, WM_KEYDOWN, VK_DECIMAL, 0) ;
PostMessage(handle_notepad, WM_KEYUP, VK_DECIMAL, 0) ;
// Là, il ne se passe rien, et pourtant le programme va bien au delà de ces deux lignes de code, il n'est pas bloqué... J'y comprends pas grand chose...
Merci de votre aide !
|
|
mardi 27 juin 2006 à 16:03:37 |
Re : PostMessage

Francky23012301
|
Salut,
D'apres ce que je comprends des que tu quittes la pièce ton appli fonctionne plus ? et si tu utilisais un épouvantail ?? Peut etre que ca fonctionnerait.
L'autre solution est de faire appel à un exorsiste. Je crois que fOxi a une incatation spéciale ou il faut se mettre tout nu et danser la coucaratcha avec un balai à la main. Mais ca fonction qu'à la pleine lune.
Plus sérieusement, pourrais tu reformuler ta question de facon plus claire car la il est assez difficile de comprendre (trop d'informations pas tres clairs)
Merci à toi
A+ ;)
|
|
mardi 27 juin 2006 à 16:32:37 |
Re : PostMessage

la_gavorade
|
Alors pour Francky, dont l'humour n'a rien à envier à celui de Guy Montagné pour ne citer que lui, je donne une définition du terme "bureau", qu'on peut trouver facilement sur internet :
"Ecran qui s'affiche après le démarrage de l'ordinateur. Y apparaissent différentes icônes : Poste de travail, corbeille, etc..."
De la même façon, cliquer sur une souris ne signifie pas pour autant qu'on fait du mal à un petit rongeur...
Quand je quitte "le bureau du serveur virtuel", en termes plus clairs, je clique sur la petite croix en haut à gauche de la fenêtre dans laquelle s'affiche le bureau du serveur virtuel. Pas besoin d'exorciste (avec un "c") pour tout ça...
Bref, désolé d'avoir été un peu obscur, je ré-explique mon pb en vous donnant le code du test :
handle_notepad := findwindow('notepad', nil) ; //jusque là, OK
Setforeground(handle_notepad) ; // Encore OK, la fenêtre Notepad est active
PostMessage(handle_notepad, WM_KEYDOWN, VK_DECIMAL, 0) ;
PostMessage(handle_notepad, WM_KEYUP, VK_DECIMAL, 0) ; //Pas OK, le point (ou la virgule, bref le symbole décimal) ne s'affiche pas dans ma fenêtre.
Je reprécise qu'en utilisant keybd_event ça marche mais ça ne résoud pas mon pb (je vais pas répéter mon histoire de bureau virtuel à minimiser et de connexion à distance...mais faudrait que je puisse utiliser soit PostMessage, soit SendMessage). Alors, y'a quoi qui coince avec mon PostMessage ???
Merci d'avance !
|
|
mardi 27 juin 2006 à 19:09:53 |
Re : PostMessage
|
mercredi 28 juin 2006 à 11:51:14 |
Re : PostMessage

la_gavorade
|
Bon, Matt et Francky, j'ai vu sur DelphiLab que vous étiez copains comme cochons, pas étonnant donc qu'une solidarité amicale se dégage pour me renvoyer dans mes 22...
Désolé d'avoir été un peu agressif, si vous l'avez ressenti comme ça, mais l'énervement dû au bug que je rencontre depuis deux jours et qui bloque le travail d'une équipe de 8 personnes qui attendent sa résolution additionné à la désagréable impression d'être pris pour un gros blaireau (plus le stress d'un 1/8 de finale à venir le soir même) m'ont fait perdre ma retenue habituelle. Encore désolé.
Est-ce que l'absence de réponses depuis est due à un boycott-punition, au fait que ma demande n'est toujours pas claire, ou au fait que personne ne trouve la solution ?
Merci d'avance.
Thomas.
|
|
mercredi 28 juin 2006 à 12:01:49 |
Re : PostMessage

Matt 261
|
Disons que tout est un peu confondu dans ce que essaye de nous expliquer. Mais nous sommes là pour t'aider donc si tu peux réexpliquer plus clairement, nous ferons notre possible pour t'aider. @+ Matt La paresse est la mère du génie... http://www.delphilab.com
|
|
mercredi 28 juin 2006 à 14:05:17 |
Re : PostMessage

la_gavorade
|
Ok, on oublie (pour le moment) les pb de connexion à distance, etc etc et on se concentre sur mon petit test qui marche pas et qui me déconcerte.
J'ai créé un tout petit prog pour tester l'utilisation de PostMessage ou SendMessage, qui contient juste un bouton avec les lignes de codes ci-dessous lorsqu'il est activé (j'ai une fenêtre Notepad ouverte au préalable):
handle_notepad := findwindow('notepad', nil) ; //jusque là, OK, je trouve le handle de ma fenêtre Notepad.
Setforeground(handle_notepad) ; // Encore OK, la fenêtre Notepad est activée et mise au premier plan.
PostMessage(handle_notepad, WM_KEYDOWN, VK_DECIMAL, 0) ;
PostMessage(handle_notepad, WM_KEYUP, VK_DECIMAL, 0) ; //Pas OK, le point (ou la virgule, bref le symbole décimal) ne s'affiche pas dans ma fenêtre.
Je veux juste savoir pourquoi j'arrive pas à afficher mon symbole décimal dans cette fenêtre Notepad grâce à PostMessage...
A+
|
|
mercredi 28 juin 2006 à 14:17:32 |
Re : PostMessage

Francky23012301
|
Bon vu le poste apres le tien, je tiens à intervenir ;) :
Si je t'ai vexé j'en suis navré. Sincèrement dans ma réponse, je souhaitais faire de l'humour en aucune facon te porter atteinte dans ton intégrité (qu'est ce que je parle bien en ce moment : j'ai eu des doigts tout neufs). Je me suis simplement permis de te signaler que tu avais donné trop d'infos : conséquences une grosse difficulté à analyser le probleme. Si je te l'ai signalé c'est que l'on puisse t'aider.
Effectivement j'ai un lien d'amitié avec Matt et d'autres membres actifs (JLen, Cirec,fOxi, Delphiprog, Florenth,Nico ect ect ect). Maintenant il peut m'arriver de me planter (et c'est vrai pour les autres) et de déraper : si tel est le cas, je peux t'assurer que je serai remis à ma place (et ca déjà été le cas) malgré l'amitié que l'on peut avoir entre nous (question d'honneté). Si Matt a posté ce message ce n'est pas (uniquement) par solidarité ou amitié mais parce qu'il n'avait rien de mal dans mes propos.
Par rapport à DelphiLab (Au fait merci de leur faire de la pub ^^), on m'a proposé d'y devenir Administrateur : décision que j'avais accepté puis enfin de compte décliné pour une question de loyauté envers CS (ce qui ne vas pas dire que je ne vais pas leur donné un coup de main : ;)). J'apprécie cette communauté et la respecte (donc toi aussi).
Désolé si je t'ai vexé. Reformule et recadre ta question et si je peux aider, je le ferai
A+
|
|
mercredi 28 juin 2006 à 14:41:32 |
Re : PostMessage

Francky23012301
|
Une petite recherche sur Google (avec les mots : delphi+Handle+PostMessage) t'aurais expliquer le pourquoi du comment : http://tcharles.developpez.com/simul/?delphi=1.
... la fonction PostMessage() et l'utilisation de keybd_event() ne permet pas de limiter l'évènement à une application cible. Par ailleurs, une combinaison de ces deux fonction ne résoud pasle problème à coup sûr. Le problème vient du fait que la fonction PostMessage() n'attends pas que le message ai été traité par l'application cible avant de rendre la main à notre programme de contrôle. Pour parer à ce problème, on est obligé d'utiliser la fonction SendMessage() qui a le même prototype que PostMessage() mais qui attend que le message ai été traité pour rendre la main. Cependant, si l'application cible ne rend pas la main très rapidement il y a de grande chances pour que l'utilisateur appuye sur touche du clavier pendant ce laps de temps et on ne peut pas mesurer les conséquences de cette interférence. La seule solution qui nous reste est donc d'espèrer que l'utilisateur sera loin de son clavier au moment où on effectuera la simulation.
Il faut utiliser SendMessage : PostMessage est non bloquant. Voila déjà un début d'explication et un début de solution.
De plus je te conseille de faire un petit test : tu inverses des deux PostMessages. Et la tu aurais ciblé ton probleme réellement.
A+
|
|
mercredi 28 juin 2006 à 15:11:54 |
Re : PostMessage

la_gavorade
|
Merci Francky pour ces pistes.
Malheureusement, le post de GRrosminet que tu as mis en lien, c'est un des premiers trucs que je suis allé voir et que j'ai imprimé avant même de poster mon message sur le forum. C'est très bien fait, et ça m'a éclairci pas mal de trucs sur les simu clavier / souris.....mais même avec des SendMessage à la place des PostMessage ça marche toujours pas !
Et l'ajout à la fin de mon code d'un petit "ShowMessage('fin du test');" m'a malheureusement prouvé que le SendMessage n'est pas bloquant non plus dans mon cas, et rend la main très vite.
Il envoie donc la requête, mais je sais pas où, en tout cas pas vers la fenêtre Notepad...
???
A+, merci pour votre aide.
|
|
Cette discussion est classée dans : handle, marche, fenêtre, postmessage, notepad
Répondre à ce message
Sujets en rapport avec ce message
handle de la fenêtre lister les composants [ par yvessimon ]
Bonjour,A partir d'une application principale je récupére le handle d'une autre fénêtre .Comment récupérer la liste des composants de cette autre fénê
Probleme avec postmessage [ par darkst ]
je veut envoyer des touche a une autre application avec postmessageje reussi a envoyer les lettre mais elle double et les touche f1-f2-..- .. ne marc
récupérer le nom (ou le handle) de la fenêtre actuellement active du windows) [ par bazbazus ]
salut a tous je veut récupérer le nom (ou le handle) de la fenêtre actuellement active du windows)? . j'ai chercher sur le site et jai pas trouver.
Récupérer tous les handles des contrôles d'une fenêtre (avec TabControl) [ par jnmchl ]
Bonjour,La question est dans le titre est bien qu'un post existe quelques lignes auparavant ... Cirec me dirait : cherche au topic :<a href="http://ww
Handle-savonnette à la c.. [ par Caribensila ]
Bonjour,Je fais un bench et j'ai besoin du gestionnaire des tâches de Windows pour contrôler certains trucs.Je me suis dit, confiant (et décontracté a
Pourquoi la police symbol n'apparait pas dans RichEdit? [ par Gerard ]
J'utilise les codes de couleur pour les cartes: ? <span lang="ZH-CN" style="FONT-SIZE:
Créer la miniature d'une fenêtre [ par L_art_ment ]
Mes cieux d'âmes, bien le bonjour;Je vous viens avec une question délicate, je vais essayé de l'expliciter au mieux dans ce post...Alors voilà, pour v
Execution boite de dialogue "ouvrir avec" avec paramètres [ par DarthBlondin ]
Bonjour,J'essaye de lancer la boîte de dialogue "ouvrir avec " de windows J'y arrive via un ShellExecute(0, 'open', 'rundll32.exe', PChar('shell
items PopupMenu via handle [ par yannfrance ]
Bonjour,je contrôle un application externe à la mienne.je récupère le handle à chaque clic d'un popupMenu externe.Ayant çe handle, comment puis-je réc
afficher image webcam sur une fenêtre par son hwnd [ par Bestdoud ]
Bonjour,je suis entrain de faire une dll pour afficher l'image d'une webcam dans mon appli.j'ai repris la source suivante pour m'aider<a href="http://
Livres en rapport
|
Derniers Blogs
TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Arnault Nouvel et Antoine Dongois Le processus à prendre : Apprendre (découvrir la plateforme) Préparer (documenter l'historique et choisir la méthode de MAJ) Test (Test de MAJ) Implémenter (Effectuer la MAJ) Valid...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : LA PLEINIèRE DU SECOND JOURTECHDAYS PARIS 2010 : LA PLEINIèRE DU SECOND JOUR par ROMELARD Fabrice
Après un retour sur l'histoire des TechDays de Paris et le fait que ce soit le plus gros event MS au monde (du fait de sa gratuité), le président de MS France (Eric Boustoullier) a fait une présentation de la vision Microsoft pour les années à venir...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|