c # - Hvordan kan man vide, om et vindue er gået?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil gerne vide, om jeg kan få nogen besked til at sige, at et bestemt åbent vindue er gået?


Clearify: Jeg åbner et notesblok, indtaster nogle tekst, så lukker jeg det. Jeg vil gerne have mit C # -program til at vise en besked for at angive, at mit vindue er gået. Jeg er ny til C # så bedes du foreslå en klasse eller klasser, jeg måske skal undersøge, eller bedre give en kort prøve for at demonstrere hovedopgaven. Jeg er meget taknemmelig for din hjælp.

Bedste reference


Beskidt, men arbejdsmæssigt vil være at afstemme de igangværende processer med en Timer, sammenligne listen med de processer, der kørte i den tidligere afstemning, du lavede.


Først skal du tilføje en sådan klassemedlem til at gemme processerne til sammenligning senere:


List<string> lastRunningProcesses = new List<string>();


Så, for at starte afstemningen har sådan kode:


System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 500; //half a second
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer\_Elapsed);
timer.Start();


Og endelig er det polling og sammenligningskoden:


void timer\_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    List<string> currentlyRunningProcesses = System.Diagnostics.Process.GetProcesses().ToList().ConvertAll(p => p.ProcessName);
    if (lastRunningProcesses.Count > 0)
    {
        List<string> closedProcesses = lastRunningProcesses.FindAll(p => !currentlyRunningProcesses.Contains(p));
        if (closedProcesses.Count > 0)
            MessageBox.Show(string.Format("{0} process(es) have been closed:
{1}", closedProcesses.Count, string.Join("
", closedProcesses)));
    }
    lastRunningProcesses = currentlyRunningProcesses;
}


Så længe din ansøgning kører, vil den holde afstemning.

Andre referencer 1


Som @Richard påpeger, har du brug for FindWindow() for at se ethvert vindue. I tilfælde af notesblok kan du gøre det mere simpelt, da notesblok proces afsluttes så snart vinduet er væk.


Du kan starte notesblokken med Process.Start() og bruge Exited hændelsen på det returnerede Process objekt til at køre kode, når notesblokken er færdig:


Process notepad = Process.Start("Notepad", "c:	emp	ext.txt");
notepad.Exited += MyExitEventHandler;

Andre referencer 2


Du skal bruge interop til at gøre dette. Opret en timer, der kalder FindWindow win32-funktionen. [9]


Når dette stopper med at finde vinduet, er vinduet forsvundet