Partage
  • Partager sur Facebook
  • Partager sur Twitter

Simuler clique souris

    1 novembre 2018 à 15:26:12

    Salut, je cherche un code en c# qui me permet de simuler un clique droit ou gauche de la souris, par exemple :
    int a;
    if (a>0)
    { fait un clique droit}
    sinon { fait un clique gauche }
    merci :)

    -
    Edité par Vertinhol 1 novembre 2018 à 16:22:22

    • Partager sur Facebook
    • Partager sur Twitter
    "C'est un coup du sort étrange : tout les hommes dont on a ouvert le crâne avaient un cerveau" . Wittgenstein.
      1 novembre 2018 à 18:31:19

      Bonjour,

      Manque de précisions

      Vous êtes ici sur un forum d'entraide communautaire et non pas sur un forum de demande de service, le but n'est donc pas de fournir une réponse toute faite ou de directement fournir la solution à quiconque viendrait sans la moindre trace. Afin d'obtenir de l'aide et une solution à votre problème, il est fortement recommandé de présenter clairement l'état actuel du problème en nous fournissant :

      • Un descriptif clair et précis du problème
      • La tentative actuelle de résolution que vous avez effectué
      • Le résultat attendu et le résultat actuel
      • Toutes pistes de recherches pouvant aider à la résolution

      -
      Edité par Lamecarlate 1 novembre 2018 à 18:31:41

      • Partager sur Facebook
      • Partager sur Twitter

      Pas d'aide concernant le code par MP, le forum est là pour ça :)

        2 novembre 2018 à 10:19:44

        Tu as pleiiiiin d'exemples sur le net ... as-tu essayé ce qui est proposé dans ces derniers ?

        Si oui, quels problèmes as-tu rencontrés ?
        Si non, essayes :p

        • Partager sur Facebook
        • Partager sur Twitter
          2 novembre 2018 à 12:14:10

          Lamecarlate a écrit:

          Bonjour,

          Manque de précisions

          Vous êtes ici sur un forum d'entraide communautaire et non pas sur un forum de demande de service, le but n'est donc pas de fournir une réponse toute faite ou de directement fournir la solution à quiconque viendrait sans la moindre trace. Afin d'obtenir de l'aide et une solution à votre problème, il est fortement recommandé de présenter clairement l'état actuel du problème en nous fournissant :

          • Un descriptif clair et précis du problème
          • La tentative actuelle de résolution que vous avez effectué
          • Le résultat attendu et le résultat actuel
          • Toutes pistes de recherches pouvant aider à la résolution

          -
          Edité par Lamecarlate il y a environ 17 heures

          Oui je m'excuse pour ça, je ferai mieux la prochaine fois.

          Meylin a écrit:

          Tu as pleiiiiin d'exemples sur le net ... as-tu essayé ce qui est proposé dans ces derniers ?

          Si oui, quels problèmes as-tu rencontrés ?
          Si non, essayes :p


          Il existe beaucoup de solutions sur le net et elles sont presque toutes les mêmes, mais le problème c'est que ça ne marche pas et je ne sais pas comment les utilisés, bon je débute en c# mais d'après ce que j'ai compris, il suffit juste de chercher la fonction dans l'onglet outil et faire quelques réglages xD

          using System;
          using System.Windows.Forms;
          using System.Runtime.InteropServices;
          
          public class Form1 : Form
          {
             [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
             private const int MOUSEEVENTF_LEFTDOWN = 0x02;
             private const int MOUSEEVENTF_LEFTUP = 0x04;
             private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
             private const int MOUSEEVENTF_RIGHTUP = 0x10;
          
             public Form1()
             {
             }
          
             public void DoMouseClick()
             {
               //Call the imported function with the cursor's current position
               uint X = (uint)Cursor.Position.X;
               uint Y = (uint)Cursor.Position.Y;
               mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
             }
          }



          En tout cas merci j'ai compris ce qu'il faut faire, la première chose c'est d'ajouter les bibliothèques (using...), deuxième chose est supprimer public form1 et dernière chose c'est d'écrire DoMouseClick() à l'endroit souhaité pour appeler la fonction.

          Merci :).

          using System;
          using System.Windows.Forms;
          using System.Runtime.InteropServices;
          [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
                  private const int MOUSEEVENTF_LEFTDOWN = 0x02;
                  private const int MOUSEEVENTF_LEFTUP = 0x04;
                  private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
                  private const int MOUSEEVENTF_RIGHTUP = 0x10;
          
                  
          
                  public void DoMouseClick()
                  {
                      //Call the imported function with the cursor's current position
                      uint X = (uint)Cursor.Position.X;
                      uint Y = (uint)Cursor.Position.Y;
                      mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
                  }

          -
          Edité par Vertinhol 2 novembre 2018 à 12:23:01

          • Partager sur Facebook
          • Partager sur Twitter
          "C'est un coup du sort étrange : tout les hommes dont on a ouvert le crâne avaient un cerveau" . Wittgenstein.
            5 novembre 2018 à 16:51:11

            Bon, si c'est pour faire un bot sur un jeu DirecX, tu peux déjà oublier ces infâmes bricolages, c'est interdit, et si c'est pour autre chose, présentes ta vraie problématique.
            • Partager sur Facebook
            • Partager sur Twitter
            Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
              8 novembre 2018 à 17:47:28

              bacelar a écrit:

              Bon, si c'est pour faire un bot sur un jeu DirecX, tu peux déjà oublier ces infâmes bricolages, c'est interdit, et si c'est pour autre chose, présentes ta vraie problématique.


              Non xD je ne vais pas l'utiliser pour créer des bots mais je voulais juste commander le curseur via ma carte Arduino avec des boutons, et j'ai réussi à le faire ce n'était pas si difficile que ça, mais en essayant d'autres manœuvres j'ai constaté que le visual studio n’exécute pas les lignes de code en série comme en c ou c++,  je ne sais pas comment il les parcourt mais en tout cas je suis persuadé que c'est du random :p

              Je ne sais même pas si il faut écrire le code dans la partie Fom1.cs ou Program.cs vu que je connais pas la différence ni comment je peux envoyer/recevoir des informations entre eux.

              • Partager sur Facebook
              • Partager sur Twitter
              "C'est un coup du sort étrange : tout les hommes dont on a ouvert le crâne avaient un cerveau" . Wittgenstein.
                9 novembre 2018 à 10:17:36

                Votre manière de faire est un bricolage, rien ne garantit que votre bidouille soit valide à la prochaine update du système pour serrer les boulons de sécurité (vous utilisez une fonctionnalité qui est massivement utiliser pour faire des trucs illégaux).

                Vous avez même des chances que les applications "piratées" cessent de fonctionner ou que l'installation d'un autre logiciel aussi brouillon que le vôtre rende le vôtre inopérant. Et je parle même pas d'un anti-virus qui fait correctement son travail et flingue (mise en quarantaine) votre application pour "comportement suspect".

                Si vous voulez ajouter la gestion d'un nouveau périphérique de pointage, ce n'est clairement pas comme cela qu'il faut faire et c'est plus du domaine de la programmation Kernel. Vous semblez connaitre le C, donc faire un driver pour votre "nouveau périphérique de pointage" ne devrait pas vous faire peur. Et vous pourrez correctement intégrer votre bidule à tous le système.

                Visual Studio, c'est un IDE, pas un environnement d'exécution ou un interpréteur de commande.

                Le C# est un langage compilé, exactement comme le C ou le C++. Si vous voyez des dé-séquencement dans le débogueur, c'est pour les même raison que pour un débogueur C ou C++, l'optimisation du code. Donc, si vous déboguer du code optimisé, vous devez en payer le prix, comme en C ou C++ (personnellement, je n'ai jamais eu besoin de déboguer du code .NET non "DEBUG"). Ça peut aussi le fait de déboguer du code qui ne compile pas et passer outres les messages d'alerte.

                Si vous ne voyez pas la différence entre "Form1" et "Program", c'est que très probablement vous n'avez pas besoin d'une interface graphique ou que vous n'avez pas compris grand-chose à Winform. Si vous n'avez pas besoin d'une interface graphique et donc vous créez un projet console ou "service windows". Si vous avez besoin d'une interface graphique, vous mettez dans Program ce qui doit s'exécuter avant l'affichage de l'interface graphique et ce qui doit s'exécuter après la fermeture de l'interface graphique.

                • Partager sur Facebook
                • Partager sur Twitter
                Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                  9 novembre 2018 à 23:20:43

                  bacelar a écrit:

                  Votre manière de faire est un bricolage, rien ne garantit que votre bidouille soit valide à la prochaine update du système pour serrer les boulons de sécurité (vous utilisez une fonctionnalité qui est massivement utiliser pour faire des trucs illégaux).

                  Vous avez même des chances que les applications "piratées" cessent de fonctionner ou que l'installation d'un autre logiciel aussi brouillon que le vôtre rende le vôtre inopérant. Et je parle même pas d'un anti-virus qui fait correctement son travail et flingue (mise en quarantaine) votre application pour "comportement suspect".

                  Si vous voulez ajouter la gestion d'un nouveau périphérique de pointage, ce n'est clairement pas comme cela qu'il faut faire et c'est plus du domaine de la programmation Kernel. Vous semblez connaitre le C, donc faire un driver pour votre "nouveau périphérique de pointage" ne devrait pas vous faire peur. Et vous pourrez correctement intégrer votre bidule à tous le système.

                  Visual Studio, c'est un IDE, pas un environnement d'exécution ou un interpréteur de commande.

                  Le C# est un langage compilé, exactement comme le C ou le C++. Si vous voyez des dé-séquencement dans le débogueur, c'est pour les même raison que pour un débogueur C ou C++, l'optimisation du code. Donc, si vous déboguer du code optimisé, vous devez en payer le prix, comme en C ou C++ (personnellement, je n'ai jamais eu besoin de déboguer du code .NET non "DEBUG"). Ça peut aussi le fait de déboguer du code qui ne compile pas et passer outres les messages d'alerte.

                  Si vous ne voyez pas la différence entre "Form1" et "Program", c'est que très probablement vous n'avez pas besoin d'une interface graphique ou que vous n'avez pas compris grand-chose à Winform. Si vous n'avez pas besoin d'une interface graphique et donc vous créez un projet console ou "service windows". Si vous avez besoin d'une interface graphique, vous mettez dans Program ce qui doit s'exécuter avant l'affichage de l'interface graphique et ce qui doit s'exécuter après la fermeture de l'interface graphique.

                  Merci pour votre réponse, tout d'abord je ne cherche pas à faire un truc illégal ou qui peut endommager un pc, je veux juste faire des petites commandes en utilisant ma propre manette, par exemple j'ai 5 boutons et un analogue, bah je dirige le curseur avec l'analogue et les boutons je peux les programmer pour faire une combinaison de touche, le bouton 1 (alt + f4), le bouton 2 (clique droit souris), le bouton 3 (entrée)..., donc ce n'est pas seulement du pointage.

                  J'en ai aussi besoin d'une interface graphique pour que puisse changer ou initialiser différentes variables lors de l’exécution sur un autre PC en utilisant directement le fichier exe.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  "C'est un coup du sort étrange : tout les hommes dont on a ouvert le crâne avaient un cerveau" . Wittgenstein.
                    12 novembre 2018 à 10:03:24

                    Une raison de réinventer la roue ?

                    https://www.windowscentral.com/how-use-xbox-one-controller-mouse-control-your-windows-10-pc

                    C'est le genre de soft qui incruste un driver qui va bien.

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                      12 novembre 2018 à 19:15:00

                      bacelar a écrit:

                      Une raison de réinventer la roue ?

                      https://www.windowscentral.com/how-use-xbox-one-controller-mouse-control-your-windows-10-pc

                      C'est le genre de soft qui incruste un driver qui va bien.

                      Le logiciel Xpadder peut tout faire avec n'importe quelle manette, mais je veux apprendre à coder, à comprendre l’interaction software/hardware...
                      • Partager sur Facebook
                      • Partager sur Twitter
                      "C'est un coup du sort étrange : tout les hommes dont on a ouvert le crâne avaient un cerveau" . Wittgenstein.
                        12 novembre 2018 à 19:50:51

                        >à comprendre l’interaction software/hardware...

                        Alors, je vous conseille de regarder du coté des drivers, pas des applicatifs.

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                          13 novembre 2018 à 15:05:17

                          bacelar a écrit:

                          >à comprendre l’interaction software/hardware...

                          Alors, je vous conseille de regarder du coté des drivers, pas des applicatifs.


                          Je pense que j'ai déjà appris le nécessaire, c'est juste une communication simple de texte qu'il faut l'interpréter dans les deux parties, mais il me faut les outils nécessaire pour passer à l'action, malheureusement il n'y pas un langage ergonomique pour faire des micro-opérations.

                          Par exemple j'envoie une information vers l'ordinateur pour lui demander de décaler le curseur de 100 pixels vers la gauche ou de faire un arrêt complet, selon mes connaissances (qui n'aboutissent à rien) ça sera très facile d'avoir un truc du genre :

                          if (condition) { shutdown;} ou if (condition) {décaler.curseur(100);}

                          Mais non xD c'est toujours difficile, en c# y'a des trucs plus ou moins digérable mais le compilateur fait du random, en c++ sur code blocks je n'arrive pas à lire les données sur le port série, en c++ CLR sur visual studio je ne peux faire aucune opération malgré une communication très bonne avec le port série, et je connais même pas les différences entre tous ces langages ni lequel est le plus optimiser, c'est un peu frustrant de trouver ce genre de difficulté alors que normalement le domaine d'informatique doit être très facile à utiliser (codage) surtout après des années de développement.

                          Bon ça peut être une vision d'une personne qui n'a pas beaucoup de connaissances en codage mais voilà ce n'est pas un domaine que je l'excelle mais j'en ai besoin d'apprendre ^^.

                          • Partager sur Facebook
                          • Partager sur Twitter
                          "C'est un coup du sort étrange : tout les hommes dont on a ouvert le crâne avaient un cerveau" . Wittgenstein.
                            13 novembre 2018 à 17:04:03

                            >Je pense que j'ai déjà appris le nécessaire,

                            Je crois que c'est là qu'est le cœur du problème.

                            Vous vous imaginez un mode de fonctionnement simpliste, proche de ce que vous avez dans les µ-controleur, mais on est à des années lumières de ce type de fonctionnement.

                            Si vous voulez progresser dans ce domaine, vous ne devez pas faire de raccourci sur des partie que vous croyez connaitre.

                            Si vous connaissez les driver sous Windows, combien de type/couche de driver pour un périphérique de pointage doit-on avoir pour correctement faire le travail ?

                            C'est loin d'être trivial, et c'est très très loin de ce que vous pouvez vous imaginez en venant des µ-contrôleur.

                            Vous trouvez un bricolage sur Internet et vous pensez que c'est LA manière de faire, mais on en est très très loin.

                            Ces bricolages pullulent bien plus sur Internet que les solutions fiables et maintenable, mais qui demandent bien plus de connaissances.

                            Votre bonne connaissance des couches bases est peut-être ici un désavantage, car vous voulez aller directement dans votre zone de confort, sans chercher à bien comprendre tout les tenants et les aboutissants de vos choix.

                            Voici juste pour indication, l'empilage de drivers qui existe entre un port COM physique et l'API à donner au Kernel pour qu'il le rende disponible aux applications utilisateurs :

                            https://docs.microsoft.com/en-us/windows-hardware/drivers/serports/configuration-of-plug-and-play-serial-device-connected-to-an-rs-232-po

                            Vous pouvez lire tout le document ( https://docs.microsoft.com/en-us/windows-hardware/drivers/serports/ ) si vous travailler avec un "vrai" port COM.

                            Avec une émulation via USB, je vous laisse cherchez comment travaillent les drivers supérieurs pour communiquer avec les drivers USB à la place des drivers "serial".

                            Donc entre le hardware de votre manette et l'applicatif utilisateur qui bidouille le curseur :

                            hardware PC => Drivers de Bus => Driver du matériel physique => Driver d'interconnexion avec les drivers de gestion des ports COM => driver "filter" des port COM => driver de gestion du PnP=> .... Kernel (COM)=> NTAPI => Win32 API => Programme Utilisateur => GDI => Win32 API => NTAPI => Kernel (GDI).

                            Et là, vous pensez que des bidouilles à base d'envoi de "faux" messages au GDI, et ricochet vers le Kernel, vous allez avoir un truc qui tiennent la route ???

                            On n'est plus sous DOS où le moindre programme était capable de foutre en l'air tout le système juste pour lire ou écrire un octet sur le port RS-232.

                            Moi, ce que je vous conseille, c'est de voir comment fonctionne ces différents drivers et de légèrement modifier le code source de ceux existant pour qu'ils gèrent au mieux votre manette et fassent leur besogne sur les données avant de passer dans la moulinette Kernel.

                            Vous pouvez toujours "pluger" une IHM pour voir l'état interne de vos drivers.

                            >c'est juste une communication simple de texte

                            Comme je l'ai déjà montré, il y a déjà un travail colossal juste pour que les programmes utilisateurs puissent lire simplement ce qui passe par le port COM. Et après, votre bidouille cherche à "communiquer", via le GDI, avec le Kernel, en essayant d'émuler les actions qui auraient dû se produire dans les drivers.

                            Mais on est d'accord que si vous utilisez correctement les API, l'accès aux données communiquées par le port COM est grandement plus simple. Mais chaque API a ces contraintes et ces usages qu'il faut respecter (RTFM). Les API ne sont forcement liées à un langage ou un framework. En .NET (C#, VB.NET, C++/CLI), vous pouvez facilement utiliser la classe SerielPort (https://docs.microsoft.com/fr-fr/dotnet/api/system.io.ports.serialport?redirectedfrom=MSDN&view=netframework-4.7.2 ) et en natif (C, C++, C++/CLI, etc...), vous pouvez facilement utiliser l'API Win32 ( https://msdn.microsoft.com/en-us/library/ff802693.aspx ) ou tout autres API/Librairies "native" (non .NET/managé). Utiliser une API Native en .NET, comme celle que vous utiliser pour faire des "mouse_event", c'est beaucoup plus casse-gueule et utiliser des API .NET depuis du code Natif, c'est aussi un peu tricky. C'est là que le C++/CLI prend tout son intérêt en pouvant utiliser les 2 mondes (.NET/managé Vs natif) sans trop de problèmes.

                            Le fait de vouloir truander le calcul de pointage fait en interne par le GDI (gestion des fenêtres) est tellement chelou que les concepteurs du Framework .NET n'ont même pas jugé bon de le rendre facilement accessible aux programmes .NET, c'est pour dire comment votre approche est contre-intuitive pour les personnes connaissant bien le système Windows.

                            Vous vous retrouvez donc à appeler du code Natif depuis du code .NET.

                            Pourquoi ne pas utiliser du code natif alors ?

                            >qu'il faut l'interpréter dans les deux parties

                            ???

                            >mais il me faut les outils nécessaire pour passer à l'action

                            Mais quelle action au juste ? blouser le GDI ?

                            >un langage ergonomique pour faire des micro-opérations.

                            Quelles "micro-opérations" ?

                            >if (condition) { shutdown;} ou if (condition) {décaler.curseur(100);}

                            Le calcul de la position est géré le GDI qui doit gérer des aspects bien plus complexe, comme le bornage de la zone du curseur dans le cas de fenêtre modale système, de la sécurité dans les écrans sensibles comme le login, la capture du curseur pour des applications de capture vidéo, etc...

                            Vous n'êtes pas seul sur la machine.

                            >Mais non xD c'est toujours difficile

                            Comme de vivre en communauté. :lol:

                            >en c# y'a des trucs plus ou moins digérable mais le compilateur fait du random,

                            Là, je pense que vous vous faites un film. ;)

                            >en c++ sur code blocks je n'arrive pas à lire les données sur le port série

                            L'API natif est moins user-friendly mais avec de bons exemples, il n'y a pas de complexité particulière.

                            >en c++ CLR sur visual studio

                            C++/CLI, et c'est du C++, Visual Studio n'est qu'un IDE, comme Code::Blocks.

                            >je ne peux faire aucune opération malgré une communication très bonne avec le port série

                            En natif ? en .NET ? Si c'est en .NET, c'est exactement comme en C#.

                            >et je connais même pas les différences entre tous ces langages

                            Faut peut-être commencer par les apprendre, au moins un minimum, non ?

                            >ni lequel est le plus optimiser

                            Il n'y a pas de "plus optimiser", c'est à vous, programmeur d'optimiser votre programme pour qu'il atteigne vos contraintes.

                            > c'est un peu frustrant de trouver ce genre de difficulté

                            Commencez par bien les caractériser. Pris un par un, il n'y rien de bien complexe, intrinsèquement.

                            >surtout après des années de développement

                            Je pense que vous sautez aux conclusions bien trop vite en pensant déjà savoir.

                            Commencez par spécifier vos besoins, analyses les technologies qu'il faut vous fait, apprenez les, AVANT de vous lancer.

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                              13 novembre 2018 à 19:56:31

                              Merci pour votre réponse xD, il y'a trop d'informations que je dois les reviser point par point, donc voilà je vais commencer petit par petit, carte arduino m'envoie un texte de ce genre "a123b456c789d" :

                              Les nombres 123, 456 et 7890 sont les valeurs que je cherche à récolter, les caractères a, b, c et d sont les séparateurs.

                              En utilisant les fonctions de base, IndexOf, Serial.Length, Parse.int, ... j'arrive théoriquement à les séparer et à les enregistrer dans des variables que j'ai déjà déclaré.

                              int x=123, y=456, z=7890;

                              Le problème majeur c'est que parfois (90%) l'ide ne reçoit pas ou ne lit pas la chaîne de caractères correctement, par exemple x peut recevoir a12 ou 23b alors quelle est un entier, et si j'essaye d'élargir le code en mettant des conditions partout pour éviter cette erreur bah je reçois une autre, la légendaire System.Timeut.Exception, et enfin je me trouve coincé, si je règle un problème un autre apparaît, si je change de langage je trouve d'autres difficultés...

                              Je ne sais pas pourquoi ça arrive, peut être car il n'y a pas de synchronisation, ou parce que mon processeur fait du multithreading, ou bien que je dois diminuer la vitesse d'envoie de données, pour le moment j'en ai aucune idée.

                              Pour le moment je n'ai pas un code pour vous le montrer car je l'ai refait et refait sur plusieurs languages (ça donne le sentiment d'être un expert de développement de dire ça :p) et le seul qui marchait moyennement je l'ai écrasé accidentellement -_-

                              -
                              Edité par Vertinhol 13 novembre 2018 à 20:41:25

                              • Partager sur Facebook
                              • Partager sur Twitter
                              "C'est un coup du sort étrange : tout les hommes dont on a ouvert le crâne avaient un cerveau" . Wittgenstein.
                                15 novembre 2018 à 14:53:02

                                Vous faites toujours ce que je vous "reproche", passer directement aux conclusions juste avec vos connaissances parcellaires qui vous font imaginer un mode de fonctionnement simpliste qui est totalement faux (ce qui ne veut pas dire que cela ne tombera pas en marche de temps en temps).

                                Je vous conseille donc chaudement de prendre connaissance, au moins superficiellement, des infos que j'ai indiqué.

                                Ce que je vous préconise n'est pas la seul approche possible, ni forcément la meilleur, mais la vôtre est clairement un bricolage qui ne peut servir que d'illustration à des fonctionnalités qui ne devraient pas être utilisées dans VOTRE solution.

                                Mais, comme vous avez la fâcheuse tendance à ne pas remettre en question vos choix, je vais passer au mode "questionnement socratique".

                                On va donc admettre que faire ce type de traitement dans une application "utilisateur" est valide, même si c'est clairement pas le cas.

                                (Oui, à la fin, vous ne devriez plus utiliser ni .NET ni Visual Studio)

                                Sauf erreur de la part, le "protocole" série est orienté caractères (octet en faite mais bon) et que, donc, rien ne délimite une trame,paquet,cellule (etc...).

                                Quand un émetteur envoi X caractères, rien ne garantit que le receveur reçoive les X caractères en un appel de primitive unique. Il n'y pas de mécanisme de synchronisation autre que caractère par caractère : on peut pas lire "un demi caractère". Seul l'atomicité de l'octet et l'ordre sont garantis.

                                Dans votre exposé, vous faites l'assertion que vous allez lire dans l'application "utilisateur" les 13 octets de la chaine "a123b456c789d" d'un coup. Quel mécanisme avez-vous mis en place pour garantir cette assertion ?

                                >j'arrive théoriquement à les séparer

                                Si vous faites l'assertion que vous les avez bien déjà tous reçu, et c'est pas gagné.

                                >Le problème majeur c'est que parfois (90%) l'ide ne reçoit pas

                                L'IDE ne reçoit JAMAIS rien. Un IDE n'est qu'un environnement de développement, en aucun cas un environnement d'exécution.

                                C'est VOTRE programme qui reçoit les informations. L'éventuel débogueur, configuré par l'IDE, ne fait qu'espionner VOTRE programme.

                                >ne lit pas la chaîne de caractères correctement, par exemple x peut recevoir a12 ou 23b

                                Il ne fait qu'utiliser les primitives de l'OS qui ne garantit rien de plus que ce qu'offre le protocole série.

                                Si vous voulez lire toujours 13 caractères, vous devez faire en sorte d'utiliser ces primitives en boucle pour avoir ces 13 caractères.

                                >alors quelle est un entier

                                Qu'est-ce qui vous fait dire cela ? C'est parce que l'information est passé sur le file (sniffer de protocole série) ? L'OS n'est peut-être même pas au courant de l'information si le hardware du port comme fait de la bufferisation, et les différents drivers "standard" d'un port série sont aussi en droit de bufferiser ou d'envoyer les informations caractères par caractères selon son paramétrage, etc...

                                Donc, qu'est-ce qui vous fait dire cela ?

                                >et si j'essaye d'élargir le code en mettant des conditions partout

                                C'est quoi "élargir" ?

                                Il ne faut pas mettre des "conditions partout", il faut faire un code qui fait correctement son travail/algorithme. Les conditions font partie de l'algorithme, c'est pas une variable "ajustable".

                                Donc non, on n'ajoute pas des "conditions partout", on implémente correctement l'algorithme, condition comprise, qui elles, sont fonction des limitations des primitives utilisées pour implémenter l'algorithme.

                                >pour éviter cette erreur

                                On évite pas les erreurs, on implémente un algorithme correctement. Si c'est un cas d'erreur "exceptionnel", on lance des exceptions pour que le code capable de gérer l'erreur soit à même de faire son ouvrage.

                                >la légendaire System.Timeut.Exception

                                Si c'est lié à votre implémentation, vous n'avez qu'à corriger votre implémentation.

                                >et enfin je me trouve coincé,

                                J'ai l'impression que vous vous coincé car vous ne cherchez pas à comprendre pourquoi une implémentation ne fonctionne pas et vous zappez directement à une autre implémentation, mais vous avez toujours pas compris les limitations des protocoles et primitives sous-jacents donc toutes vos implémentations auront les mêmes problèmes. Le problème n'est pas technologique (ou pas encore), il est entre la chaise et le clavier. ;)

                                > si je change de langage je trouve d'autres difficultés...

                                Maitrisez correctement un langage/technologie prend au moins un peu de temps, plus vous changez de langage plus vous vous éloignez du vrai problème. Arrêtez de zapper, ce que vous voulez faire n'est pas si complexe pour qu'une technologie quelconque ne soit pas à même de le faire.

                                >Je ne sais pas pourquoi ça arrive,

                                Peut-être parce que vous ne prenez pas le temps de comprendre les outils/primitives que vous utilisez.

                                >peut être car il n'y a pas de synchronisation

                                De quel synchronisation parlez-vous ? Si les primitives ne parlent (leur documentation) pas de synchronisation, elles n'en font pas.

                                >, ou parce que mon processeur fait du multithreading

                                Le rapport avec la choucroute ?

                                >ou bien que je dois diminuer la vitesse d'envoie de données,

                                Vous devez configurer le port COM. Si vous ne commencez pas par le début, c'est pas fini.

                                >pour le moment j'en ai aucune idée.

                                Pourquoi ne pas nous montrez votre implémentation de la récupération des données et les problèmes que cela engendre ?

                                >Pour le moment je n'ai pas un code pour vous le montrer car je l'ai refait et refait sur plusieurs languages

                                Arrêtez de zapper. (BIS)

                                >et le seul qui marchait moyennement je l'ai écrasé accidentellement

                                Marchez moyennement, ça n'existe pas (Loi de Murphy), il vaut mieux un code qui ne fonctionne pas systématiquement qu'un code qui "tombe en marche".

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                                  15 novembre 2018 à 15:49:05

                                  Bon j'ai refait un autre code qui fonctionne bizarrement mais sans aucune erreur, mais je sais d'après vos conseils, que ce n'est pas la bonne approche.

                                  Voici la partie Windows form

                                  using System;
                                  using System.Collections.Generic;
                                  using System.ComponentModel;
                                  using System.Data;
                                  using System.Drawing;
                                  using System.Linq;
                                  using System.Text;
                                  using System.Threading.Tasks;
                                  using System.Windows.Forms;
                                  using System.Runtime.InteropServices;
                                  
                                  namespace Cyber
                                  {
                                      public partial class Form1 : Form
                                      {
                                          [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);
                                  
                                          int x, y, z;
                                  
                                          int width = Screen.PrimaryScreen.Bounds.Width;
                                          int heigth = Screen.PrimaryScreen.Bounds.Height;
                                  
                                          public Form1()
                                          {
                                              InitializeComponent();
                                              MC.Open();
                                              Resolution.Text = (width.ToString() + 'x' + heigth.ToString());
                                          }
                                  
                                          decimal Map(decimal value, decimal fromSource, decimal toSource, decimal fromTarget, decimal toTarget)
                                          {
                                              return ((value - fromSource) / (toSource - fromSource) * (toTarget - fromTarget) + fromTarget);
                                          }
                                  
                                          private void Start_Click(object sender, EventArgs e)
                                          {
                                              loop.Enabled = true;
                                          }
                                  
                                          private void Stop_Click(object sender, EventArgs e)
                                          {
                                              loop.Enabled = false;
                                          }
                                  
                                          private void loop_Tick(object sender, EventArgs e)
                                          {
                                              MC.WriteLine("1");
                                              x = decimal.ToInt32(Map(int.Parse(MC.ReadLine()), -16384, 16383, 0, width));
                                  
                                              MC.WriteLine("2");
                                              y = decimal.ToInt32(Map(int.Parse(MC.ReadLine()), -16384, 16383, 0, heigth));
                                  
                                              MC.WriteLine("3");
                                              z = decimal.ToInt32(Map(int.Parse(MC.ReadLine()), -16384, 16383, 0, 32700));
                                  
                                              MC.WriteLine("4");
                                              if(int.Parse(MC.ReadLine()) == 1)
                                              {
                                                  mouse_event(0x02 | 0x04, (uint)x, (uint)y, 0, 0); //MouseClickLeft
                                              }
                                  
                                              MC.WriteLine("5");
                                              if (int.Parse(MC.ReadLine()) == 1)
                                              {
                                                  mouse_event(0x08 | 0x10, (uint)x, (uint)y, 0, 0); //MouseClickRight
                                              }
                                  
                                              axe_x.Text = (x.ToString());
                                              axe_y.Text = (y.ToString());
                                              axe_z.Text = (z.ToString());
                                  
                                              Cursor.Position = new Point(x, y);
                                  
                                              //mouse_event(0x02 | 0x04, (uint)x, (uint)y, 0, 0); //MouseClickLeft
                                              //mouse_event(0x08 | 0x10, (uint)x, (uint)y, 0, 0); //MouseClickRight
                                              //mouse_event(0x20 | 0x40, (uint)x, (uint)y, 0, 0); //MousemiddleRight
                                              //mouse_event(0x800, 0, 0, 120, 0); //MouseWheel
                                          }
                                      }
                                  }
                                  

                                  Arduino

                                  #include <Wire.h>
                                  
                                  #define mouse_left 3
                                  #define mouse_right 4
                                  
                                  String axe_x, axe_y, axe_z;
                                  
                                  void setup() 
                                  {
                                    pinMode(mouse_left, INPUT);
                                    pinMode(mouse_right, INPUT);
                                    
                                    Wire.begin();
                                    Wire.beginTransmission(0x68);
                                    Wire.write(0x6B);
                                    Wire.write(0);
                                    Wire.endTransmission(true);
                                    Serial.begin(9600);
                                  }
                                  
                                  void loop() 
                                  {
                                    Wire.beginTransmission(0x68);
                                    Wire.write(0x3B);
                                    Wire.endTransmission(false);
                                    Wire.requestFrom(0x68,12,true);
                                    
                                    axe_x = Wire.read()<<8|Wire.read();
                                    axe_y = Wire.read()<<8|Wire.read();
                                    axe_z = Wire.read()<<8|Wire.read();
                                    
                                    if (Serial.available())
                                    {
                                      int data = Serial.read();
                                      if(data == '1')
                                      {
                                        Serial.println(axe_x);
                                      }
                                      else if(data == '2')
                                      {
                                        Serial.println(axe_y);
                                      }
                                      else if(data == '3')
                                      {
                                        Serial.println(axe_z);
                                      }
                                      else if(data == '4')
                                      {
                                        Serial.println(digitalRead(mouse_left));
                                      }
                                      else if(data == '5')
                                      {
                                        Serial.println(digitalRead(mouse_right));
                                      }
                                    }
                                  }

                                  Là j'utilise un accéléromètre pour orienter le curseur et deux boutons (gauche & droite), j'ai changé un peu la méthode de communication en envoyant des demandes vers l'Arduino pour obtenir les données que je cherche à récupérer au lieu de toujours recevoir "a123b456c789d", le nombre des caractères dans l'exemple n'est pas constant sinon ça sera plus facile (enfin je pense).

                                  Bon jusqu'à maintenant le seul problème c'est que la sensibilité du capteur est très élevé donc le curseur vibre beaucoup même si je ne touche à rien, j'ai pensé à mettre une boucle qui prend la valeur moyenne sur 50 par exemple:

                                  for (int i=0 ; i<50 ; i++)
                                  {
                                      x = (x + la nouvelle x)/2 ;
                                  }

                                  Quand j’exécute le code il semble il ne répond plus comme si je lui ai mis une boucle infinie.

                                  Bon ce n'est encore gagné, je suis encore très loin de comprendre les principes de bases je dois encore approfondir les recherches :) .

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  "C'est un coup du sort étrange : tout les hommes dont on a ouvert le crâne avaient un cerveau" . Wittgenstein.
                                    15 novembre 2018 à 17:16:16

                                    Il manque beaucoup d'informations importantes dans l'extrait votre code. C'est quoi "MC" comme type ? etc...

                                    Bon déjà que je vous disais qu'une application utilisateur n'était pas le type de composant exécutable le plus approprié à votre type de projet, une application utilisateur "graphique + managé(.NET) + Winform (vieille API graphique)", on cumule les choix peu judicieux.

                                    Mais bon, votre problème n'est actuellement pas là.

                                    C'est juste que le passage par un timer Winform dans un thread d'IHM, c'est pas ce qui se fait de plus fiable pour ne pas manquer des messages. Mais bon, comme vous faites, semble-t-il, du pooling sur le périphérique, on n'est plus à du manque de réactivité coté client près.

                                    Vous semblez, peut-être malgré vous, avoir implémenté un protocole applicatif à base d'envoi de ligne dans le sens Arduino->PC et à base de caractère unique dans le sens PC->Arduino. C'est rudimentaire, mais ça fait le taf.

                                    > le seul problème c'est que la sensibilité du capteur est très élevé donc le curseur vibre beaucoup

                                    C'est le genre de truc qui est déjà pris en charge par les drivers des périphériques de pointage. Si vous aviez implémenté un driver à la place de cette cochonnerie d'application .NET, vous auriez pu configurer les drivers au-dessus du votre pour utiliser les mêmes routines de stabilisation que celles des drivers de souris, ainsi que les outils de configuration de la sensibilité qui existe déjà pour les souris.

                                    En bref, vous êtes en train de réinventer une roue carrée, mais bon, vous voulez une application utilisateur et pas un driver, c'est à vous de la faire cette roue.

                                    >j'ai pensé à mettre une boucle qui prend la valeur moyenne sur 50 par exemple:

                                    ???

                                    >il semble il ne répond plus comme si je lui ai mis une boucle infinie.

                                    Les boucles, dans une application avec une IHM, c'est jamais une bonne idée.

                                    Bon, si votre objectif, c'est d'utiliser une fenêtre glissante de 50 valeurs et d'utiliser la moyenne de la fenêtre, le plus simple, c'est de stocker les 50 valeurs dans une structures FIFO ( toute faite ou implémenté maison, ça casse pas 3 pates à un canard) et à chaque tick d'horloge, vous supprimez la valeur la plus vieille de la FIFO, vous ajoutez la nouvelle valeur dans la FIFO, et vous faites la moyenne dans données encore dans le FIFO.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

                                    Simuler clique souris

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown