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 Discussion :

Envoie d'evenement à une application en fond de tache


Sujet :

Windows

  1. #1
    Membre actif Avatar de Robxley
    Homme Profil pro
    Docteur ingénieur traitement d'image
    Inscrit en
    Mai 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Docteur ingénieur traitement d'image

    Informations forums :
    Inscription : Mai 2009
    Messages : 158
    Points : 228
    Points
    228
    Par défaut Envoie d'evenement à une application en fond de tache
    Dans mon programme j'ai besoin d'envoyer des saisies claviers&souris virtuelles à notepad.

    Dans une premier approche cela fonctionne, mais que lorsque je ramène notepad au premier plan. Voici le morceau code de mon application concernée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            HWND idWindow = FindWindow("notepad","test1.txt - Bloc-notes"); //récupère le handle de la fenêtre concernée
    	if( idWindow != NULL) //si elle existe
    	{
    		cout<< "Fenetre trouvée" <<endl;
    		SwitchToThisWindow(idWindow,0); //la rend active
    		SendInput(1, &npt, sizeof(INPUT)); //envoie la touche souhaitée
            }
    Donc j'aimerai éviter de devoir toujours remettre le notepad en premier plan, et de pouvoir continuer à lui envoyer des instructions en le laissant en arrière plan et même lorsqu'il est réduit si possible

    Alors j'ai essayé un SetFocus(idWindow) au lieu de SwitchToThisWindow(idWindow,0); mais sans succès rien ne se passe.

    J'ai pensée à relever le handle de la fenêtre courante (avec GetForegroundWindow) pour lui redonner la main ensuite, mais les animations fenêtre n'étant pas instantané c'est pas très fonctionnel surtout quand plusieurs envoie à intervalle régulier sont effectué.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            HWND idWindow = FindWindow("notepad","test1.txt - Bloc-notes"); //récupère le handle de la fenêtre concernée
    	if( idWindow != NULL) //si elle existe
    	{
                    
    		cout<< "Fenetre trouvée" <<endl;
                    HWND currentWindow = GetForegroundWindow(); //sauvegarde de l'application courante
    		SwitchToThisWindow(idWindow,0); //rend actif notepad
    		SendInput(1, &npt, sizeof(INPUT)); //envoie la touche souhaité
    
                    SwitchToThisWindow(currentWindow ,0); //rend la main à l'application courante
            }
    Est - ce que quelqu'un aurait une solution qui permettrait d'envoyer évènements claviers à une application sans pour autant devoir la ramener au premier plan.
    Rien ne sert de courir, mieux vaut partir à point. Programmer aussi d'ailleurs.
    Surtout, mais surtout pas d’astuces !
    Pas de bras, pas de chocolat. Les deux mains sur le clavier.

  2. #2
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    Salut,

    Citation Envoyé par Robxley Voir le message
    Est - ce que quelqu'un aurait une solution qui permettrait d'envoyer évènements claviers à une application sans pour autant devoir la ramener au premier plan.
    Oui, des messages du type WM_KEYDOWN/WM_KEYUP ou WM_CHAR ... transmis par une fonction comme PostMessage() peuvent faire l'affaire.

  3. #3
    Membre actif Avatar de Robxley
    Homme Profil pro
    Docteur ingénieur traitement d'image
    Inscrit en
    Mai 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Docteur ingénieur traitement d'image

    Informations forums :
    Inscription : Mai 2009
    Messages : 158
    Points : 228
    Points
    228
    Par défaut
    Oui effectivement c'est ce que j'ai pu trouvé sur le net. Merci pour ta réponse Minnesota.

    Bien que je n'ai pas très bien compris la différence entre la fonction

    PostMessage() et SendMessage().

    Seul différence que j'ai pu constater après plusieurs tests c'est que les WM_CHAR ne marchent qu'avec les SendMessage. Enfin pour ce que je voulais en faire ça fonctionne.

    Mais bon, si quelqu'un a une explication entre la différence PostMessage et SendMessage je suis preneur, je suis pas trop fan de marcher à l'aveugle.

    Ce que j'ai pu en lire sur MSDN c'est que contrairement à PostMessage, SendMessage attend un "accusé réception" de fin d'exécution de procédure du message avant de rendre la main. Mais bon en aucun cas il n'est expliqué pourquoi WM_CHAR ne marche pas avec ce dernier.
    Rien ne sert de courir, mieux vaut partir à point. Programmer aussi d'ailleurs.
    Surtout, mais surtout pas d’astuces !
    Pas de bras, pas de chocolat. Les deux mains sur le clavier.

  4. #4
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    SendMessage appelle directement la procédure de fenêtre (et attend donc la fin du traitement), tout comme DispatchMessage, qui soumet un message à la procédure de fenêtre qui lui va. PostMessage ne fait que placer ("poster") un message dans la queue des messages - le message ne sera traité qu'après qu'il aura été retiré de la queue, par GetMessage par exemple, pour être soumis à la procédure de fenêtre qui lui va. Il est possible que Windows sache vérifier "l'authenticité" d'un WM_CHAR, c'est-à-dire vérifier s'il y avait réellement un WM_KEYDOWN correspondant avant, au moment du GetMessage ou du TranslateMessage par exemple. Dans ce cas, PostMessage(... WCHAR ...) n'aura que peu de chances de fonctionner. Avec SendMessage, tu ne fais qu'appeler la WndProc, donc rien de mal si tu sais ce que tu fais.

  5. #5
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    En production, il faut éviter l'usage de SendMessage et préférer SendMessageTimeout, ceci pour ne pas avoir un état bloquant. Sinon, pour utiliser le couple PostMessage()/WM_CHAR, sauf erreur, c'est la zone d'édition qu'il faut cibler (par son "handle") et non sa fenêtre parent.

    Cordialement.

  6. #6
    Membre actif Avatar de Robxley
    Homme Profil pro
    Docteur ingénieur traitement d'image
    Inscrit en
    Mai 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Docteur ingénieur traitement d'image

    Informations forums :
    Inscription : Mai 2009
    Messages : 158
    Points : 228
    Points
    228
    Par défaut
    Merci pour toutes ces réponses.
    J'y vois un peu plus claire parmi toutes ces fonctions.

    Effectivement j'étais pas fan de SendMessage qui provoquait un état bloquant.

    minnesota, comme tu l'as fait remarquer effectivement je sélection le champ "Edit" du note pad avec un FindWindowEx si non sans ça, ca ne fonctionne pas.

    Tout fonction nickel chrome.
    Merci pour votre aide.

    Je poste le résultat de mon code si ca peut servir à quelqu'un autre.

    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
    
             HWND idWinPad = FindWindow("notepad",NULL);
             if(idWinPad)
    	   cout<< "Fenetre trouvee" <<endl;
            else cout<<"Erreur Fenetre non trouvee"<<endl;
    
            HWND idEdit = FindWindowEx(idWinPad , NULL, "Edit" , NULL );
    	if( idEdit != NULL)
    	{
    		cout<< "Edit trouvee" <<endl;
    		
                     PostString(idEdit ,"test si marche");  //simulation de touche correspondant à une chaine de caractère
                     PostMessage(idEdit ,WM_KEYDOWN,VK_SPACE,0);	
    		//PostMessage(idEdit ,WM_KEYUP,VK_SPACE,0);	
    
    	}
    Rien ne sert de courir, mieux vaut partir à point. Programmer aussi d'ailleurs.
    Surtout, mais surtout pas d’astuces !
    Pas de bras, pas de chocolat. Les deux mains sur le clavier.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/11/2011, 19h14
  2. lancer une application + la barre des taches
    Par karim15 dans le forum WinDev
    Réponses: 2
    Dernier message: 28/12/2009, 19h48
  3. Envoi de sms à une application J2ME
    Par chrischelmi dans le forum Java ME
    Réponses: 1
    Dernier message: 20/11/2009, 18h28
  4. Lancer une application en fond.
    Par palmitoto dans le forum C++
    Réponses: 3
    Dernier message: 21/07/2008, 02h37
  5. debutant : couleur de fond d'une application direct3D
    Par ptidrone dans le forum DirectX
    Réponses: 2
    Dernier message: 12/06/2004, 17h08

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