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! 