Saltar al contenido

La ventana activa (programa) pierde inesperadamente el foco en Windows 7

Solución:

Como and31415 me aconsejó, eché un vistazo cuidadoso a lo que hay en mi Startup pestaña de msconfig programa, pero no encontró nada inusual.

Ahora está claro que esto es 99% causado por algún programa externo (aunque no lo noté antes y aunque no he instalado nada nuevo recientemente), no por Windows. Este es el punto más importante para mí aquí.

Busqué en Google un poco más y obtuve algunas ideas / consejos, a saber, que debería intentar presionar Alt+F4 inmediatamente después de que noto un robo de enfoque. Esto debería salir del proceso que podría causar este enfoque sigiloso. Entonces, puedo intentar usar Process Monitor de Sysinternals paquete para rastrear el proceso que acaba de salir.

Esto puede darme una idea de lo que está causando este problema.

Programé un programa en C # para monitorear los procesos fluctuantes. Aquí está el código si alguien necesita averiguar qué proceso está causando este problema.

using System;
using System.Diagnostics;
using System.Linq;

namespace ProcessMonitor
{
    class Program
    {
        static void Main(string[] args)
        {
            var lastPros = Process.GetProcesses().Select((x) => x.Id).ToList();
            var oldProcessList = Process.GetProcesses();
            while (true)
            {
                var processlist = Process.GetProcesses();

                var currentPros = processlist.Select(x => x.Id).ToList();
                var diff = lastPros.Except(currentPros).ToList();
                Console.ForegroundColor = ConsoleColor.Red;

                var pro = oldProcessList.Where(x => diff.Contains(x.Id)).ToList();

                if (diff.Count == 0)
                {
                    pro = processlist.Where((x) => diff.Contains(x.Id)).ToList();
                    diff = currentPros.Except(lastPros).ToList();
                    Console.ForegroundColor = ConsoleColor.Green;
                    pro = processlist.Where((x) => diff.Contains(x.Id)).ToList();
                }
                foreach (var oldPid in diff)
                {
                    Console.Write("PID {0}", oldPid);
                    try
                    {
                        Console.WriteLine(" name {0}", pro.Where((x) => x.Id == oldPid).ToList()[0].ProcessName);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine($" Hit exception {e}");
                    }
                }
                if (diff.Count > 0)
                {
                    lastPros = currentPros;
                    oldProcessList = processlist;
                }
                System.Threading.Thread.Sleep(100);
            }
        }
    }
}

Muestra de salida que muestra el inicio del proceso (verde) y la terminación (rojo)

Muestra de salida

Es probable que el foco haya sido robado por una tarea en segundo plano con errores. Abre una ventana, que roba el foco, y se cierra muy rápidamente, pero el foco no vuelve. Últimamente, Microsoft Office tuvo un error de este tipo.

Para descubrir tales procesos, puede usar herramientas como Window Focus Logger (espejo) o un programa C # personalizado similar a Process Monitor:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

namespace ProcessMonitor
{
    class Program
    {
        const int pollDelay = 100;

        static void Main(string[] args)
        {
            var lastProcesses = GetDescriptions();
            while (true)
            {
                System.Threading.Thread.Sleep(pollDelay);
                var now = DateTime.Now;
                var processes = GetDescriptions();

                var started = processes.Except(lastProcesses);
                var stopped = lastProcesses.Except(processes);

                foreach (var p in started)
                {
                    Print(now, p, ConsoleColor.Green);
                }
                foreach (var p in stopped)
                {
                    Print(now, p, ConsoleColor.Red);
                }

                lastProcesses = processes;
            }
        }

        static void Print(DateTime dateTime, ProcessDescription process,
            ConsoleColor color)
        {
            Console.ForegroundColor = color;
            Console.WriteLine("{0:hh\:mm\:ss\.ff}tPID {1}t{2}",
                dateTime.TimeOfDay, process.Id, process.Description);
            Console.ResetColor();
        }

        static List<ProcessDescription> GetDescriptions()
        {
            return Process.GetProcesses().Select(x => GetDescription(x)).ToList();
        }

        static ProcessDescription GetDescription(Process p)
        {
            int pid = -1;
            string description;
            try
            {
                pid = p.Id;
                description = p.ProcessName;
            }
            catch (Exception e)
            {
                description = "Hit exception " + e;
            }
            return new ProcessDescription { Id = pid, Description = description };
        }

        struct ProcessDescription
        {
            public int Id;
            public string Description;

            public override bool Equals(object obj)
            {
                return obj != null && Id == ((ProcessDescription)obj).Id;
            }
            public override int GetHashCode()
            {
                return Id.GetHashCode();
            }
        }
    }
}

Versión pulida y corregida del código proporcionado por Omar Alshaker. Tampoco requiere C # 6. Requiere .NET 3.5 o más reciente.

Puede compilarlo usando el compilador de C # (csc.exe) que viene con su instalación de .NET Framework y ejecute el ejecutable resultante para obtener un registro en tiempo real de los procesos que comienzan (verde) o terminan (rojo). Usar control + C para terminarlo.


Para encontrar el compilador, ejecute where /R %windir%Microsoft.NET csc.exe. Elija uno de la última versión de .NET instalada, sin importar si es 32b o 64b. Guarde el código C # en Program.cs y compilarlo para Program.exe:

C:WindowsMicrosoft.NETFramework64v4.0.30319csc.exe Program.cs
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *