FindWindow()

FindWindow() - C - Programmation

Marsh Posté le 09-12-2011 à 10:33:22    

Bonjour à tous,
 
J'aimerai interagir avec l'invité de commande Windows, à partir d'un code C, par exemple je poste "help" à partir de mon code, et dans ma fenêtre de commande, il m'affiche toutes les commandes possibles.
j'utilise pour cela FindWindow() afin de récupérer le handle de ma fenêtre, ensuite j'utilise PostMessage(), mais mon FindWindow me retourne toujours 0.
Si vous pouvez m'aider svp.
 
Voila mon code:
 

Code :
  1. HWND hwnd = FindWindow(0,TEXT("CMD" ) );


 
Merci d'avance


Message édité par lilo_r le 12-12-2011 à 10:43:35
Reply

Marsh Posté le 09-12-2011 à 10:33:22   

Reply

Marsh Posté le 11-12-2011 à 00:45:10    

quelqu'un pour m'aider svp??

Reply

Marsh Posté le 11-12-2011 à 10:09:39    

Quand je testez ton programme avec HWND hwnd = FindWindow(0,TEXT("Invite de commandes" ) ); il fonctionne très bien.
Pour que l'affichage de "help" soit correct, j'ai choisi l'option de projet "Utiliser le jeu de caractères multioctet (MBCS)"
Pour envoyer une commande (ici dir) :

Code :
  1. SendMessage(hwnd,WM_CHAR,'d',0);
  2. SendMessage(hwnd,WM_CHAR,'i',0);
  3. SendMessage(hwnd,WM_CHAR,'r',0);
  4. SendMessage(hwnd,WM_CHAR, VK_RETURN,0);


Message édité par Trap D le 11-12-2011 à 11:06:28
Reply

Marsh Posté le 13-12-2011 à 09:21:29    

Merci Trap D, ça marche.

Reply

Marsh Posté le 16-12-2011 à 12:11:41    

Bonjour,
Peux-tu me dire stp, s'il y a un type de message équivalent à WM_CHAR, qui permet d'envoyer une commande en entier au lieu de caractère par caractère, car l'envoi d'un caractère à la fois prend beaucoup de temps.
J'ai cherché mais je n'ai pas trouvé.
 
Merci d'avance

Reply

Marsh Posté le 16-12-2011 à 13:53:36    

Renseigne-toi sur la fonction SendInput : http://msdn.microsoft.com/en-us/li [...] s.85).aspx
En regardant la description de SendInput, le plus simple est peut-être de faire une petite fonction :

void my_SendMessage(HWND hwnd, char  * mess)
{
 while (*mess)
 {
  SendMessage(hwnd,WM_CHAR,*mess++,0);
 }
 SendMessage(hwnd,WM_CHAR,VK_RETURN,0);
}


Message édité par Trap D le 16-12-2011 à 14:06:20
Reply

Marsh Posté le 16-12-2011 à 16:45:58    

Merci Trap_D pour ta réponse,
 
Actuellement je fais bien une fonction avec SendMessage pour envoyer une commande, mais je trouve que c'est assez long, car il envoie lettre par lettre.
J'ai trouvé WM_SETTEXT qui permet d'envoyer une chaine de caractère à une fenêtre, mais quand j'ai testé ça me remplace le titre de la fenêtre par la chaine envoyé:

Code :
  1. SendMessage(hwnd, WM_SETTEXT,0,(LPARAM)TEXT("Hello World!" ));


une idée de ce que je ne fais pas bien.
Pour SendInput j'ai trouvé que c'est assez compliqué, car il faut gérer chaque clic sur le clavier...
 
Merci d'avance

Reply

Marsh Posté le 16-12-2011 à 22:50:25    

Non, WM_SETTEXT ne fonctionnera pas pour taper des commanders dans une fenetre DOS.
LA fonction est SendInput, il faut en passer par la.
De toute façon, quand tu tapes au clavier, tu tapes lettre par lettre. La tu envoies des caractères par programme à une fenêtre qui n'est pas gérée par ton programme je pense, donc tu ne peux guère faire autrement.
Consulte cette page pour plus d'inofs : http://msdn.microsoft.com/en-us/li [...] s.85).aspx


Message édité par Trap D le 16-12-2011 à 22:55:07
Reply

Marsh Posté le 20-12-2011 à 14:52:41    

Bonjour Trap D, merci pour ta dernière réponse.
 
j'ai une autre question stp, voila dans mon programme c, j'utilise cette fois Sendmessage() pour envoyer des messages à une application,ses messages sont traités et dans la même fenêtre de l'application j'ai les résultats.
Ce que j'aimerai faire c'est récupérer ces résultats (affichés dans la fenêtre).
j'ai cherché un peu, j'ai trouvé la fonction GetMessage():
 

Code :
  1. MSG msg;
  2. while(GetMessage(&msg,NULL,0,0))
  3.  {
  4.   TranslateMessage(&msg);
  5.   DispatchMessage(&msg);
  6.  }


 
 
Mais je n'ai pas bien compris comment l'utiliser, si tu peux m'expliquer stp, si tu connais bien sur.
 
Merci d'avance.


Message édité par lilo_r le 20-12-2011 à 14:53:00
Reply

Marsh Posté le 20-12-2011 à 16:18:43    

Je ne connais pas bien ce mécanisme, il faudrait savoir exactement ce que tu fais.  
Communiques-tu avec une fenêtre quelconque ou avec une autre appli que tu as créé toi même ?

Reply

Marsh Posté le 20-12-2011 à 16:18:43   

Reply

Marsh Posté le 20-12-2011 à 16:25:44    

j'ai un programme c qui communique avec un logiciel, qui contient un invité de commande, donc j'envoie les données avec SendMessage(), il les traites, et les affiches dans la même fenêtre (l'invité de commande), et donc j'aimerai récupérer les données affichées.

Reply

Marsh Posté le 20-12-2011 à 22:31:45    

Il faudrait récupérer le stdout et le stderr de la fenêtre console. Ça dépasse un peu mes compétences désolé.
Peut-être en fouillant la doc MSDN...

Reply

Marsh Posté le 20-12-2011 à 22:42:10    

Tu peux regarder là, mais c'est un peu hardcore :
http://support.microsoft.com/kb/190351/en-us?fr=1

Reply

Marsh Posté le 21-12-2011 à 09:10:39    

Merci pour vos réponses, je vais regardé ça.

Reply

Marsh Posté le 21-12-2011 à 16:35:37    

Ça marche si la fenêtre console a été lancée comme enfant du process principal. Ceci dit c'est une bonne piste.

Reply

Marsh Posté le 21-12-2011 à 17:14:08    

Citation :

Ça marche si la fenêtre console a été lancée comme enfant du process principal. Ceci dit c'est une bonne piste.


 
Excuses moi Trap D, mais tu parles de quoi, de GetMessage ou la récupération de stdout et stderr??


Message édité par lilo_r le 21-12-2011 à 17:23:12
Reply

Marsh Posté le 21-12-2011 à 20:36:36    

De la récupération de stdout et stderr.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed