Visualizzazione dei risultati da 1 a 3 su 3

Discussione: Bypass Dialog in C#

  1. #1
    Utente di HTML.it L'avatar di Nexus0100
    Registrato dal
    Aug 2016
    residenza
    Firenze
    Messaggi
    83

    Bypass Dialog in C#

    Salve a tutti, sto facendo pratica col C#, ma mentre stavo provando a fare un test ho incontrato un problema.
    Il test è questo: il Programma Visual Studio di microsoft ha una versione Comunity, free, ma dopo 30 giorni con una finestra di Dialog chiede di creare un account microsoft. Ovviamente nessun problema, con l'account mi sono iscritto, e la finestra scompare... Tuttavia volevo provare a creare un programma in C# che avviasse Visual Studio e controllasse se la finestra della richiesta della registrazione si aprisse, in caso positivo, la nascondevo e continuavo a usare Visual Studio. (Si intende, a fine istruttivo per imparare a usare le APi di windows con C# ovviamente)
    Tuttavia il problema che subentra è la attività della finestra di Dialog, che blocca l'input dell'utente. Visto che non la chiudo ma la nascondo e basta essa rimane attiva e dunque non mi permette di usare normalmente Visual Studio.
    A questo punto ho provato a ridare l'EnabledWindow() alla pagina di visual Studio ma comunque l'invio, il backspace rimangono bloccati dalla Dialog...
    Ho provato anche a cambiare il focus ma niente.
    Posto anche il codice:
    codice:
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading;
    
    
    namespace HackedVisualStudio
    {
        class Program
        {
            //importo dalla dll user32 la funzione GetWindowText per poter accedere al 
                //titolo dei Thread in esecuzione sul PC
            [DllImport("user32.dll", CharSet = CharSet.Unicode)]
            private static extern int GetWindowText(IntPtr hWnd, StringBuilder strText, int maxCount);
    
    
            //import la funzione GetWindowTextLength per trovare le window che hanno un
                //titolo di lunghezza almeno superiore a 0
            [DllImport("user32.dll", CharSet = CharSet.Unicode)]
            private static extern int GetWindowTextLength(IntPtr hWnd);
    
    
            //import la funzione EnumWindows che mi permette di richiedere al OS i processi in esecuzione
            [DllImport("user32.dll")]
            private static extern bool EnumWindows(EnumWindowsProc enumProc, IntPtr lParam);
    
    
            // importo la funzione per poter nascondere la finestra di log-in di Visual Studio e la console
            [DllImport("user32.dll")]
            static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
    
    
            //importo la fuznione per prendere l'handler della console e nasconderla
            [DllImport("kernel32.dll")]
            static extern IntPtr GetConsoleWindow();
    
    
            //si delega la funzione EnumWindowProc che è la funzione di callback di EnumWindows
            public delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
    
    
            //importo la funzione per Riattivare VisualStudio dopo il pop-up del login
            [DllImport("user32.dll")]
            static extern bool EnableWindow(IntPtr hWnd, bool bEnable);
    
    
            /* Questa funzione controlla che il titolo di una finestra sia di lunghezza superiore a 0
             * dopo di che se è superiore a 0 crea una StringBuilder di lunghezza del titolo
             * + 1 e la utilizza per salvare il titolo della finestra ottenuta dal puntatore passato
             * e la ritorna.
             * Se la lunghezza del titolo è 0 allora ritorna una stringa vuota
             * */
            public static string GetWindowText(IntPtr hWnd)
            {
                int size = GetWindowTextLength(hWnd);
                if (size > 0)
                {
                    var builder = new StringBuilder(size + 1);
                    GetWindowText(hWnd, builder, builder.Capacity);
                    return builder.ToString();
                }
    
    
                return String.Empty;
            }
    
    
            /*
             * Funzione che itera le finestre aperte del SO come descritto sotto, e attraverso altre funzioni
             * trova l'hWnd della finestra col titolo cercato e la ritorna.
             * */
            public static List<IntPtr> FindWindows(EnumWindowsProc filter)
            {
                //lista di puntatori (per salvare le finestre richieste)
                List<IntPtr> windows = new List<IntPtr>();
                //singolo puntatore all'handler, utilizzo la lista per chiudere piu finestre 
                        //di log nel caso ci siano aperti più visual studio
                        //questo senza far partire ulteriori HackedVisualStudio
                //IntPtr windows = new IntPtr();
                //funzione EnumWindows che itera i processi del SO
                EnumWindows(delegate (IntPtr wnd, IntPtr param)
                //trimete EnumWindows si itera le finestre sull'OS, se viene ritornato true
                    //la ricerca continua, continuerà fino ad aver ciclato tutte le finestre
                {
                    //si chiama la funzione filter, delegata nella funzione FindWindowsWithText
                    if (filter(wnd, param))
                    {
                        //se viene superato il filtro allora si aggiunge il puntatore alla list
                        //windows.Add(wnd);
                        windows.Add(wnd);
                    }
                    //ritorna true per ciclare tutte le finestre aperte
                    return true;
                }, IntPtr.Zero);
    
    
                return windows;
            }
    
    
            /*
             * Questa funzione prende come parametro una stringa da cercare all'interno del
             * titolo di ogni finestra in esecuzione.
             * Al suo interno chiama la funzione FindWindows, e come parametro
             * gli passa la funzione delegate (anonima) create qui sotto.
             * La funzione anonima controlla che il titolo della finestra ottenuto
             * dall'EnumWindows contenga la stringa da ricercare, se la contiene ritorna true, e
             * nella funzione FindWindows alla lista windows viene aggiunto l'hWnd
             * che contiene la stringa ricercata nei titoli.
                */
            public static List<IntPtr> FindWindowsWithText(string titleText)
            {
                return FindWindows(delegate (IntPtr wnd, IntPtr param)
                {
                    return GetWindowText(wnd).Contains(titleText);
                });
            }
    
    
    
    
            static void Main(string[] args)
            {
                //acquisisco l'hWnd della Console e lo nascondo
                var console = GetConsoleWindow();
                ShowWindow(console, 0);
                Process visual_studio = Process.Start("devenv.exe");
                //mentre Visual Studio è aperto si esegue il controllo della finestra di Log-In
                while (!visual_studio.HasExited)
                {
                    //prendo gli hWnd di visual studio  -   itero nel caso le finestre cambiassero
                    List<IntPtr> visual_studio_handler = FindWindowsWithText("- Microsoft Visual Studio");
                    //Lista per Visual Studio in italiano
                    List<IntPtr> loginVS = FindWindowsWithText("Impostazioni account Microsoft Visual Studio");
                    if (loginVS.Count > 0)
                    {
                        //ciclo per tutte le finestre di log trovate e le chiudo
                        foreach (IntPtr WindowLog in loginVS)
                        {
                            bool loginHide = ShowWindow(WindowLog, 0);
                            if (loginHide)
                            {
                                foreach (IntPtr vs in visual_studio_handler)
                                    //Attivo la pagina di Visual Studio bloccata dal LogOn
                                    EnableWindow(vs, true);
                                //se la finestra viene nascosta la disattivo dopo aver riattivato
                                    //le finestre bloccate da questa
                                EnableWindow(WindowLog, false);
                            }
                        }
                    }
                    else
                    {
                        //Si controlla se visual Studio è in inglese
                        List<IntPtr> loginVSeng = FindWindowsWithText("Microsoft Visual Studio Account Settings");
                        //ispezione di tutte le finestre tornate
                        foreach (IntPtr WindowLog in loginVSeng)
                        {
                            bool loginHide = ShowWindow(WindowLog, 0);
                            if (loginHide)
                            {
                                foreach (IntPtr vs in visual_studio_handler)
                                    EnableWindow(vs, true);
                                //se la finestra viene nascosta la disattivo dopo aver riattivato
                                //le finestre bloccate da questa
                                EnableWindow(WindowLog, false);
                            }
                        }
                    }
                    Thread.Sleep(2000);
                }
            }
        }
    }
    E l'immagine d'errore che ne deriva dal programma:
    Immagine-min.jpg
    Scusate la qualità... Ho dovuto comprimere l'immagine per mandarla...
    Se sono stato poco chiaro accetto qualsiasi domanda, grazie mille dell'aiuto che da questo forum! E grazie a tutti ovviamente!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,161
    Sposto nel forum dedicato ai linauggi .NET.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di Nexus0100
    Registrato dal
    Aug 2016
    residenza
    Firenze
    Messaggi
    83
    Ok grazie della change, non avevo visto quella sezione xD, scusa

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.