IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

SendKey() dans un winform


Sujet :

Windows Forms

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 61
    Points : 30
    Points
    30
    Par défaut SendKey() dans un winform
    Salut
    Dans un ancien programme MFC prenant en charge le CLR, j'ai ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	ShellExecute(NULL,"open","firefox.exe","http://www.google.fr",NULL,SW_SHOWNORMAL);
    	Sleep(3000);
    	for(j=0;j<5;j++)
    		SendKeys::SendWait( "{TAB}" );
    Je voudrais faire la même chose depuis un Winform, mais je n'ai pas trouvé la fonction ShellExecute, j'ai donc produit le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    				 Process::Start("firefox.exe","http://www.google.fr");
    				 Sleep(3000);
    				 for(j=0;j<5;j++)
    					 SendKeys::SendWait( "{TAB}" );
    J'ai mis ce deuxieme bout de code dans une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
    ajouté au code exemple de la FAQ C++ ftp://ftp-developpez.com/nico-pyrigh...usWinforms.rar

    Mon problème c'est que les deux bout de code ne font pas la même chose. Le premier avant bien de 5 tabulation et arrive sur "Image" alors que le second semble sauter un mot sur deux.

    Je ne comprend pas du tout ce qu'il se passe. Avez vous une idée svp ?

    D'avance merci pour votre aide.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 61
    Points : 30
    Points
    30
    Par défaut
    En fait, j'ai réussi à faire un shellExecute depuis la winform, du coup j'ai exactement le même code dans les 2 projets. Le problème doit provenir du fait que l'un s'exécute depuis un écouteur de la winform alors que l'autre s'exécute directement dans le programme MFC.

    Ca vous aide à m'aider ?

  3. #3
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Ouala, ouvrir firefox, simuler des tab tab tab, c'est pas super pérenne...
    Réfléchissons. Que se passe-t-il quand on recherche "Machin" dans google ?
    Réponse: on tombe sur une page dont l'URL contient tout plein de trucs, mais notamment "q=Machin".
    Ajouté au fait que la méthode Process.Start prend directement un nom de fichier ou une URL, et que le programme associé est directement ouvert, on a (en C#, je te laisse traduire en C++/CLI)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void OpenGoogle(string query)
    {
     Process.Start("http://www.google.com/#q=" + query);
    }
    Ce qui est quand même nettement plus simple.
    ಠ_ಠ

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 61
    Points : 30
    Points
    30
    Par défaut
    Merci pour ta réponse mais le site en question (google etait un exemple) ne permet pas d'utiliser ce genre de méthode. J'ai bel et bien besoin de faire des tab à répétition et de lancer firefox (ou un autre navigateur).

    Si vous avez d'autres idées, je suis preneur ...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 61
    Points : 30
    Points
    30
    Par défaut
    Bon je reprend. Je suis en VS2008. Je crée un /Nouveau Projet/Visual C++/CLR/Application Windows Forms/.
    J'ajoute la fonction suivante dans Form1.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	public: static System::Void lal(void)
    			 {
     				int j;
    				Process^ myProcess = gcnew Process;
    				myProcess->StartInfo->FileName = "C:\\Program Files\\Mozilla Firefox\\firefox.exe" ;
    				myProcess->StartInfo->Arguments = "google.fr";
    				myProcess->StartInfo->UseShellExecute = true;
    				myProcess->Start();
    				Thread::Sleep(3000);
    				for(j=0;j<5;j++)
    					SendKeys::SendWait("{TAB}");
    			 }
    J'ajoute un bouton dans ma Winforms avec un écouteur sur le click, je me retrouve avec ces 2 méthodes à la fin de mon Form1.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
    			 louf();
    			 }
    	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    			 louf();
    			 }
    // J'ai ajouté l'appel a ma fonction dans chacune de ces fonctions.
    A l'execution Form1_Load() est appelé et louf() s'execute correctement, le curseur se trouve sur le mot cle "Image" sur google.
    Lorsque je clique sur le bouton1 pour appeler button1_Click(), louf() est appelé mais la gestion des tabulations envoyées a firefox est anormale, je me retrouve sur le mot cle "Actualité" de google.

    Si quelqu'un veux tester je vous met tous les includes que j'utilise ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
    #include <time.h>
     
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    	using namespace System::Diagnostics;
    	using namespace System::Threading;
    J'imagine que le probleme provient d'un écouteur dans la winforms ou... j'en sais rien en fait ...
    Merci de m'aider

  6. #6
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Mais au fait, puisque tu restes en C++/CLI, qu'est qui t'oblige à utiliser le framework .Net pour faire ça ?

    Pourquoi tu ne gardes pas le code que tu avais déjà ? Tu peux toujours utiliser la méthode ShellExecute.

    Quitte à revoir ce code, autant en faire quelque chose de solide, plutôt qu'une solution qui ne fonctionnera plus si le site cible change de layout, et que tes tab tab ne fonctionneront plus... Un add-on firefox (codé en javascript), peut-être ?
    ಠ_ಠ

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 61
    Points : 30
    Points
    30
    Par défaut
    J'ai besoin d'utiliser le framework .Net car j'ai besoin de Sendkey() qui est apparu dans le framework 3.0.
    Mon ancien code englobe énormément de chose qui n'ont plus lieu d'être aujourd'hui. Je veux donc réécrire le programme et le passer en Winform pour apprendre. De toute façons le problème ne vient pas du ShellExecute. Pour me le prouver j'ai fait ce code et j'ai eut le même problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    	char* wpurl = new char[500];
    	int len; 
    	wchar_t *wText1;
    	wchar_t *wText2;
    	wchar_t *wText3;
     
    	// 1
    	sprintf_s(wpurl,500,"open");
    	len = strlen(wpurl)+1;
    	wText1 = new wchar_t[len];
    	::MultiByteToWideChar(CP_ACP, NULL,wpurl, -1, wText1,len);
    	// 2
    	sprintf_s(wpurl,500,"firefox.exe");
    	len = strlen(wpurl)+1;
    	wText2 = new wchar_t[len];
    	::MultiByteToWideChar(CP_ACP, NULL,wpurl, -1, wText2,len);
    	// 3
    	sprintf_s(wpurl,500,"www.google.fr");
    	len = strlen(wpurl)+1;
    	wText3 = new wchar_t[len];
    	::MultiByteToWideChar(CP_ACP, NULL,wpurl, -1, wText3,len);
     
    	for(i=0;i<1;i++)
    	{
     
    		ShellExecute(NULL,wText1,wText2,wText3,NULL,SW_SHOWNORMAL);
    		Sleep(5000);
    		for(j=0;j<39;j++)
    		{
    			SendKeys::SendWait( "{TAB}" );
    			Sleep(500);
    		}
    	}
    J'ai aussi essayé avec d'autre navigateur et le résultat est le même.

    Je ne pense pas que je puisse trouver rapidement une solution plus simple. Car mon programme fait bien plus de chose que ce que je décris ici.

    Avez vous pu reproduire mon problème ? C'est quand même étrange ... Pourquoi ca marche au lancement de la winform lors de l'appel de Form1_Load(...) et pas sur un bouton ...

  8. #8
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Hello,

    je n'ai pas la solution à ton problème. Et je persiste à penser que tu fais trop d'hypothèses sur l'environnement dans lequel se déroule ton appli. Si tu masques la barre d'URL, si tu masques la barre de recherche, si le site en question change de layout, ... ton programme ne marchera plus.
    Un peu de google me renvoie , par exemple, où l'on inclut un web browser dans l'appli, ce qui permet de manipuler son DOM.

    Ou tu peux aussi regarder bien directement le contrôle WebBrowser, proposé par les winforms.

    Et un dernier conseil: si tu veux apprendre les winforms, profites-en pour apprendre C#, nettement plus simple que C++/CLI (même si on connait déjà bien C++). C'est plus simple, mieux pris en charge par Visual Studio, plus rapide à compiler, moins contraignant, ...
    ಠ_ಠ

Discussions similaires

  1. Avoir des panneaux réductibles et extensibles dans un WinForm
    Par ager1912 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 24/07/2007, 10h10
  2. affichage dans un Winform
    Par idream dans le forum VB.NET
    Réponses: 1
    Dernier message: 14/07/2007, 17h01
  3. [C#]Edition de fichiers office dans une winform
    Par cyrille_naert dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/01/2007, 16h50
  4. Fonction SendKeys dans une macro
    Par freya91 dans le forum Access
    Réponses: 2
    Dernier message: 06/06/2006, 10h27
  5. [C#] Passer un dataset en paramètre dans un WinForm enfant
    Par iDaaX dans le forum Windows Forms
    Réponses: 3
    Dernier message: 06/01/2005, 21h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo