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

C# Discussion :

Tangage sur la machine


Sujet :

C#

  1. #1
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 317
    Points : 2 507
    Points
    2 507
    Par défaut Tangage sur la machine
    Bonjour tout le monde,

    Récemment j'ai écrit un programme pour fermer des fenêtres en démarrage de session, les touches Alt F4 n'avaient pas l'air de faire beaucoup d'effet alors j'ai émulé un clic de souris sur le bouton de fermeture, la croix rouge en haut à droite, et ça marchait très bien.

    Tout-à-l'heure, sur trois fenêtres, une ne s'est pas fermée, c'est occasionnel, mais je me suis dit, on dirait que mon clic se fait quelques points trop à droite, je vais corriger le tir.

    Il s'avère qu'à présent, mon programme est incapable de faire un clic de souris.

    Un autre programme, plus ancien, qui lui fait un clic droit, continue de fonctionner. Donc, ce sont les nouveaux programmes qui ont un souci.

    Je dois préciser qu'un peu avant, pour essayer de palier une difficulté de mise en veille de la machine, j'ai exécuté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DISM.exe /Online /Cleanup-Image /RestoreHealth
    sfc /scannow
    qui d'ailleurs n'ont pas annoncé avoir trouvé d'erreur, mais je me dis que ça mérite d'être mentionné.

    Un point de restauration n'a rien résolu.

    Il existe d'autres versions de user32.dll sur la machine, mais j'ai comme l'impression que remplacer celle de C:\Windows\SYSTEM32 par une autre n'est pas un truc à faire à la légère.

    Ça m'aiderait bien que quelqu'un ait une idée de la route à suivre

    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
            [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
            public static extern void mouse_event(uint dwFlags, uint dx, uint dy,
        uint cButtons, uint dwExtraInfo);
            //Mouse actions
            public const int MOUSEEVENTF_LEFTDOWN = 0x02;
            public const int MOUSEEVENTF_LEFTUP = 0x04;
            public const int MOUSEEVENTF_RIGHTDOWN = 0x08;
            public const int MOUSEEVENTF_RIGHTUP = 0x10;
     
            public static void DoMouseClick(uint X, uint Y)
            {
                mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
            }
                    System.Threading.Thread.Sleep(1000);
                    SetForegroundWindow(hWnd);
                    SetActiveWindow(hWnd);
                    SetFocus(hWnd);
                    SetCursorPos((int)x, (int)y);
                    System.Threading.Thread.Sleep(500);
                    Console.Beep(1800, 200);
                    System.Threading.Thread.Sleep(1500);
                    DoMouseClick(x, y);
    Ah au fait dans le programme il y a eu un autre souci, c'est que le fichier app.config n'était plus valide, du reste impossible de l'ouvrir, alors après suppression j'en ai créé un nouveau ; avec rien dedans du coup.
    Ce qui n'empêche pas l'application de positionner proprement le curseur, simplement elle ne clique pas.

  2. #2
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 317
    Points : 2 507
    Points
    2 507
    Par défaut
    Je crois plutôt que j'ai dit une ânerie.

    En repartant de zéro j'arrive bien à obtenir une émulation de clic de souris, mais si l'application se retrouve avec une configuration vide ...

    C'est bizarre, d'ailleurs. Il faut attendre C# 8.0 pour pouvoir mettre un point d'interrogation derrière un type de variable dans les déclarations d'API, sinon ça râle quand on lui passe un null, mais lancer l'application sans aucune référence, ça non, ça ne la dérange pas.

    Sauf qu'elle ne fait pas le boulot.

  3. #3
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 317
    Points : 2 507
    Points
    2 507
    Par défaut
    Ah, une réponse disparue, ce matin ...

    Je confirme bien que je parlais des WinAPI :
    http://pinvoke.net/default.aspx/user32/mouse_event.html

    Alors on en est où ...
    La machine qui ouvre des fenêtres au démarrage les ferme bien de nouveau, donc on peut dire problème résolu. En créant un autre projet, donc pas de la façon la plus élégante, mais ça marche.

    Je profite pour un commentaire, pas forcément au bon endroit, sur l'émulation d'actions utilisateur sur des fenêtres, déclenchées par un moteur d'exécution asynchrone (une instruction Process.Start par ligne).
    Le fait de créer un nouveau processus rend cela inattendu, mais si c'est une application console qui est appelée, ça met au premier plan la fenêtre console du script d'exécution asynchrone. Une fenêtre de console qui se met au premier plan au moment de déclencher une action utilisateur sur une fenêtre, pas terrible. Alors je crée plutôt un projet Windows, en ajoutant la référence System.Console depuis les Nugets (sinon les émulations de touches ne sont pas exécutées, même si ça ne me paraît pas complètement intuitif). On verra bien si quelqu'un a envie de rebondir là-dessus.

    Ce qui a créé une hésitation a été une restauration de système juste avant, dont je peine à croire qu'elle soit responsable de la perte de configuration du projet.

    Cette restauration était motivée par des difficultés de mise en veille de la machine. Ce problème-là n'est pas résolu puisqu'une minute après avoir appuyé sur la touche pour mettre en veille j'entends toujours la machine crépiter, mais ... ça ne relève pas du même forum.

    Ce qui revient dans le sujet c'est que peut-être je vais devoir faire un peu de lecture sur la question des fichiers de configuration.

    J'ai compris dernièrement que pour réaliser un déploiement c'est dans le fichier de configuration qu'il faut regarder pour savoir quelles plateformes installer sur la machine utilisatrice. Mon petit coup de panique sur ce projet-ci laisse entendre que je ferais bien de consolider un peu le sujet.

    À moins que quelqu'un ait un commentaire à faire sur le sujet des fichiers de configuration, je vais considérer que c'est à moi de trouver la doc et que donc le sujet est résolu.

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

Discussions similaires

  1. serveur WEB,FTP,MAIL sur meme machine C raisonnable ?
    Par littleman dans le forum Serveurs (Apache, IIS,...)
    Réponses: 5
    Dernier message: 06/07/2004, 23h01
  2. info sur la machine
    Par bobymaw dans le forum C++Builder
    Réponses: 3
    Dernier message: 18/06/2004, 10h37
  3. Savoir quel OS est installer sur une machine
    Par batmat86 dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/06/2004, 16h16
  4. Comment récupérer la liste des logiciels installés sur une machine ?
    Par david_chardonnet dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 19/09/2003, 17h41
  5. [Débutant] Connexion sur une machine distante protégée
    Par arthix dans le forum Développement
    Réponses: 3
    Dernier message: 28/08/2003, 09h46

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