Discussion: C# Soucis API Windows [Débutant]

  1. #1
    Membre à l'essai
    Femme Profil pro
    Architecte de base de données
    Inscrit en
    mai 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : mai 2014
    Messages : 21
    Points : 13
    Points
    13

    Par défaut C# Soucis API Windows

    Re-bonjour ! Je suis passer par ici il y'a quelques jours pour un soucis d'ouverture de fenêtre en c# ( cc ericlm128 )

    Pour résumer je fais un petit soft qui détecte un logiciel en particulier et me permet de naviguer avec une seule touche de mon clavier entre les différentes fenêtres de celui-ci ( un jeux, très pratique donc pour faire du multicompte )

    Après avoir eu de nombreux soucis qui m'ont obliger à changer plusieurs fois le code. Le programme est fonctionnel à 99% !

    Bien sur le petit % qui manque gâche tout !

    Je vous explique le fonctionnement actuel :

    Je lance mon soft, j'ouvre jusqu'à 8 fois le jeux.
    Je lance une détection du jeux par process.name, je récupère la liste des ID dans une listBox.
    Ensuite je sélectionne une ID et je l'attribue à un label via un bouton assigner ( une photo parle mieux que des mots )
    Nom : 255555555555555555555555555555555e.png
Affichages : 74
Taille : 4,7 Ko

    Les label " ID " correspondent au bouton " Assigner " juste à côté.
    Le bouton Test me permet de montrer la fenêtre associé à l'ID ( avant de l'assigner ) ainsi je peux mettre mes fenêtres dans l'ordre.

    Une fois que toutes les fenêtres ont été assignées j'appuie sur la touche pour me permettre de lancer la détection de touche et donc de switcher de fenêtres.

    Mon problème intervient ici !

    Lorsque j'appuie sur ma touche pour switcher de fenêtre je peux changer 8 fois de fenêtres puis une fois retourner à la 1er fenêtre sa bugue et les fenêtres ne s'ouvrent plus ( elles clignotent en orange dans ma barres des tâches )

    Selon le précèdent post que j'avais fais obtenu de la part de ericlm128 ce code :
    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
    private enum ShowWindowEnum
            {
                Hide = 0, ShowNormal = 1, ShowMinimized = 2, ShowMaximized = 3, Maximize = 3, ShowNormalNoActivate = 4, Show = 5, Minimize = 6, ShowMinNoActivate = 7, ShowNoActivate = 8, Restore = 9, ShowDefault = 10, ForceMinimized = 11
            };
     
            [DllImport("user32.dll")]
            static extern bool ShowWindow(IntPtr hWnd, ShowWindowEnum nCmdShow);
     
            [DllImport("user32.dll")]
            private static extern int SetForegroundWindow(IntPtr hwnd);
     
            static void Main(string[] args)
            {
                try
                {
                    int id = 2064;
                    Process p = Process.GetProcessById(id);
                    ShowWindow(p.MainWindowHandle, ShowWindowEnum.Restore);
                    SetForegroundWindow(p.MainWindowHandle);
                }
                catch
                {
                }
     
            }
    Pouvez vous m'aidez une fois de plus à corriger se problème ? Voici le code dans ma textbox qui me permet de détecter quand j'appuie sur la touche et donc de demander le changement.

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    private void Touche_TextChanged(object sender, EventArgs e)
            {
                if (Touche.Text == "Insert")
                {
                    if (progressBar1.Value == 0 & Assigner2.Enabled == true)
                    {
                        int id = Convert.ToInt32(ID1.Text.ToString());
                        Process p = (Process.GetProcessById(id));
                        ShowWindow(p.MainWindowHandle, ShowWindowEnum.Restore);
                        SetForegroundWindow(p.MainWindowHandle);
                        Touche.Text = "";
                        progressBar1.Value = 1;
                        MessageBox.Show("Info","La détection à démarrer !", MessageBoxButtons.OK,MessageBoxIcon.Information);
                    }
                    else if (progressBar1.Value == 1 & Assigner2.Enabled == true)
                    {
                        int id = Convert.ToInt32(ID2.Text.ToString());
                        Process p =  (Process.GetProcessById(id));
                        ShowWindow(p.MainWindowHandle, ShowWindowEnum.Restore);
                        SetForegroundWindow(p.MainWindowHandle);
                        Touche.Text = "";
                        progressBar1.Value = 2;
                    }
                    else if (progressBar1.Value == 2 & Assigner3.Enabled == true)
                    {
                        int id = Convert.ToInt32(ID3.Text.ToString());
                        Process p = Process.GetProcessById(id);
                        ShowWindow(p.MainWindowHandle, ShowWindowEnum.Restore);
                        SetForegroundWindow(p.MainWindowHandle);
                        Touche.Text = "";
                        progressBar1.Value = 3;
                    }
                    else if (progressBar1.Value == 2 & Assigner3.Enabled == false)
                    {
                        int id = Convert.ToInt32(ID1.Text.ToString());
                        Process p = Process.GetProcessById(id);
                        ShowWindow(p.MainWindowHandle, ShowWindowEnum.Restore);
                        SetForegroundWindow(p.MainWindowHandle);
                        Touche.Text = "";
                        progressBar1.Value = 1;
                    }
                    else if (progressBar1.Value == 3 & Assigner4.Enabled == true)
                    {
                        int id = Convert.ToInt32(ID4.Text.ToString());
                        Process p = Process.GetProcessById(id);
                        ShowWindow(p.MainWindowHandle, ShowWindowEnum.Restore);
                        SetForegroundWindow(p.MainWindowHandle);
                        Touche.Text = "";
                        progressBar1.Value = 4;
                    }
                    else if (progressBar1.Value == 3 & Assigner4.Enabled == false)
                    {
                        int id = Convert.ToInt32(ID1.Text.ToString());
                        Process p = Process.GetProcessById(id);
                        ShowWindow(p.MainWindowHandle, ShowWindowEnum.Restore);
                        SetForegroundWindow(p.MainWindowHandle);
                        Touche.Text = "";
                        progressBar1.Value = 1;
                    }
                    else if (progressBar1.Value == 4 & Assigner5.Enabled == true)
                    {
                        int id = Convert.ToInt32(ID5.Text.ToString());
                        Process p = Process.GetProcessById(id);
                        ShowWindow(p.MainWindowHandle, ShowWindowEnum.Restore);
                        SetForegroundWindow(p.MainWindowHandle);
                        Touche.Text = "";
                        progressBar1.Value = 5;
                    }
                    else if (progressBar1.Value == 4 & Assigner5.Enabled == false)
                    {
                        int id = Convert.ToInt32(ID1.Text.ToString());
                        Process p = Process.GetProcessById(id);
                        ShowWindow(p.MainWindowHandle, ShowWindowEnum.Restore);
                        SetForegroundWindow(p.MainWindowHandle);
                        Touche.Text = "";
                        progressBar1.Value = 1;
                    }
                    else if (progressBar1.Value == 5 & Assigner6.Enabled == true)
                    {
                        int id = Convert.ToInt32(ID6.Text.ToString());
                        Process p = Process.GetProcessById(id);
                        ShowWindow(p.MainWindowHandle, ShowWindowEnum.Restore);
                        SetForegroundWindow(p.MainWindowHandle);
                        Touche.Text = "";
                        progressBar1.Value = 6;
                    }
                    else if (progressBar1.Value == 5 & Assigner6.Enabled == false)
                    {
                        int id = Convert.ToInt32(ID1.Text.ToString());
                        Process p = Process.GetProcessById(id);
                        ShowWindow(p.MainWindowHandle, ShowWindowEnum.Restore);
                        SetForegroundWindow(p.MainWindowHandle);
                        Touche.Text = "";
                        progressBar1.Value = 1;
                    }
                    else if (progressBar1.Value == 6 & Assigner7.Enabled == true)
                    {
                        int id = Convert.ToInt32(ID7.Text.ToString());
                        Process p = Process.GetProcessById(id);
                        ShowWindow(p.MainWindowHandle, ShowWindowEnum.Restore);
                        SetForegroundWindow(p.MainWindowHandle);
                        Touche.Text = "";
                        progressBar1.Value = 7;
                    }
                    else if (progressBar1.Value == 6 & Assigner7.Enabled == false)
                    {
                        int id = Convert.ToInt32(ID1.Text.ToString());
                        Process p = Process.GetProcessById(id);
                        ShowWindow(p.MainWindowHandle, ShowWindowEnum.Restore);
                        SetForegroundWindow(p.MainWindowHandle);
                        Touche.Text = "";;
                        progressBar1.Value = 1;
                    }
                    else if (progressBar1.Value == 7 & Assigner8.Enabled == true)
                    {
                        int id = Convert.ToInt32(ID8.Text.ToString());
                        Process p = Process.GetProcessById(id);
                        ShowWindow(p.MainWindowHandle, ShowWindowEnum.Restore);
                        SetForegroundWindow(p.MainWindowHandle);
                        Touche.Text = "";
                        progressBar1.Value = 8;
                    }
                    else if (progressBar1.Value == 7 & Assigner8.Enabled == false)
                    {
                        int id = Convert.ToInt32(ID1.Text.ToString());
                        Process p = Process.GetProcessById(id);
                        ShowWindow(p.MainWindowHandle, ShowWindowEnum.Restore);
                        SetForegroundWindow(p.MainWindowHandle);
                        Touche.Text = "";
                        progressBar1.Value = 1;
                    }
                    else if (progressBar1.Value == 8)
                    {
                        int id = Convert.ToInt32(ID1.Text.ToString());
                        Process p = Process.GetProcessById(id);
                        ShowWindow(p.MainWindowHandle, ShowWindowEnum.Restore);
                        SetForegroundWindow(p.MainWindowHandle);
                        Touche.Text = "";
                        progressBar1.Value = 1;
                    }     
                }
            }
    Merci d'avance si vous avez des questions n'hésitez pas !

  2. #2
    Membre chevronné

    Homme Profil pro
    Responsable déploiement (SCCM, AirWatch, AMP)
    Inscrit en
    juillet 2014
    Messages
    1 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, AirWatch, AMP)
    Secteur : Transports

    Informations forums :
    Inscription : juillet 2014
    Messages : 1 055
    Points : 1 942
    Points
    1 942

    Par défaut

    Essai en ajoutant cette ligne au milieu, ceci devrait activer la fenêtre même si elle est déjà ouverte.

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ShowWindow(p.MainWindowHandle, ShowWindowEnum.Restore);
    ShowWindow(p.MainWindowHandle, ShowWindowEnum.Show);
    SetForegroundWindow(p.MainWindowHandle);

    Ou ceci
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ShowWindow(p.MainWindowHandle, ShowWindowEnum.ShowNormal);
    SetForegroundWindow(p.MainWindowHandle);

    Pour plus d'info voir : https://msdn.microsoft.com/fr-fr/lib...(v=vs.85).aspx
    https://support.microsoft.com/fr-fr/help/886217

  3. #3
    Membre à l'essai
    Femme Profil pro
    Architecte de base de données
    Inscrit en
    mai 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : mai 2014
    Messages : 21
    Points : 13
    Points
    13

    Par défaut

    Citation Envoyé par ericlm128 Voir le message
    Essai en ajoutant cette ligne au milieu, ceci devrait activer la fenêtre même si elle est déjà ouverte.

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ShowWindow(p.MainWindowHandle, ShowWindowEnum.Restore);
    ShowWindow(p.MainWindowHandle, ShowWindowEnum.Show);
    SetForegroundWindow(p.MainWindowHandle);

    Ou ceci
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ShowWindow(p.MainWindowHandle, ShowWindowEnum.ShowNormal);
    SetForegroundWindow(p.MainWindowHandle);

    Pour plus d'info voir : https://msdn.microsoft.com/fr-fr/lib...(v=vs.85).aspx
    https://support.microsoft.com/fr-fr/help/886217
    Hello j'ai essayé malheureusement pas le résultat attendu

    J'ai essayé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ShowWindow(p.MainWindowHandle, ShowWindowEnum.Minimize);
    ShowWindow(p.MainWindowHandle, ShowWindowEnum.ShowMaximized);
    Pour l'instant ça à l'air de fonctionner je tiens au jus !

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    octobre 2013
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2013
    Messages : 1 326
    Points : 2 893
    Points
    2 893

    Par défaut

    Il existe la fonction AppActivate pour rendre active une fenêtre. Tu as juste l'id du processus à passer en paramètres.

  5. #5
    Membre chevronné

    Homme Profil pro
    Responsable déploiement (SCCM, AirWatch, AMP)
    Inscrit en
    juillet 2014
    Messages
    1 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, AirWatch, AMP)
    Secteur : Transports

    Informations forums :
    Inscription : juillet 2014
    Messages : 1 055
    Points : 1 942
    Points
    1 942

    Par défaut

    @Bob06
    Ce n'est pas très beau de minimiser puis de maximiser ... est ce que cela fonctionne vraiment mieux ?
    As tu le même problème sur notepad.exe par exemple ? Si j'ai besoin de faire les tests.

    @ZenZiTone
    C'est du VB AppActivate ? https://msdn.microsoft.com/fr-fr/lib...(v=vs.90).aspx
    Voir aussi : http://codes-sources.commentcamarche...pactivate-en-c

  6. #6
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    octobre 2013
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2013
    Messages : 1 326
    Points : 2 893
    Points
    2 893

    Par défaut

    Citation Envoyé par ericlm128 Voir le message
    Oops, j'avais pas fais gaffe que c'était C# ici, autant pour moi !

    A supposer que AppActivate utilise le SetForegroundWindow, le problème devrait être le même. Donc +1 pour le test avec notepad.

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : juin 2007
    Messages : 366
    Points : 556
    Points
    556

    Par défaut

    Je n'ai plus tous les détails en tête mais il me semble qu'il existait une dll du Framework qui permettait d'accéder à du code VB depuis un assembly .Net.

  8. #8
    Membre à l'essai
    Femme Profil pro
    Architecte de base de données
    Inscrit en
    mai 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : mai 2014
    Messages : 21
    Points : 13
    Points
    13

    Par défaut

    Bonjour à tous, longue période de test et c'est concluant à 100% ! Merci à tous pour votre aide !

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

Discussions similaires

  1. Réponses: 29
    Dernier message: 14/01/2013, 10h40
  2. API Windows, soucis
    Par sayce dans le forum Windows
    Réponses: 10
    Dernier message: 05/11/2010, 16h40
  3. tutoriel : La programmation de l'API Windows en C++ par Bob
    Par Aurelien.Regat-Barrel dans le forum Windows
    Réponses: 19
    Dernier message: 21/06/2008, 14h34
  4. Documentation gratuite sur l'API Windows, COM, DCOM, OLE, etc.
    Par Community Management dans le forum Windows
    Réponses: 1
    Dernier message: 16/11/2006, 15h28
  5. Utilisation de Pointeurs dans API windows
    Par Drooxy dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 13/03/2003, 22h39

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