O foco provavelmente é roubado por uma tarefa em segundo plano com bugs. Ele abre uma janela, que rouba o foco e é fechada muito rapidamente, mas o foco não retorna. Ultimamente, o Microsoft Office tinha um bug .
Para descobrir esses processos, você pode usar as ferramentas como Window Focus Logger ( mirror ) ou um programa C # personalizado semelhante 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();
}
}
}
}
Versão polida e corrigida do código fornecido por Omar Alshaker . Também não requer o C # 6. Requer .NET 3.5 ou mais recente.
Você pode compilá-lo usando o compilador C # ( csc.exe
) que vem com a instalação do .NET Framework e executar o executável resultante para obter um registro em tempo real dos processos que começam (verde) ou final (vermelho). Use Ctrl + C para finalizá-lo.
Para encontrar o compilador, execute where /R %windir%\Microsoft.NET csc.exe
. Escolha a versão mais recente do .NET instalada, não importa se 32b ou 64b. Salve o código C # em Program.cs
e compile-o para Program.exe
:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe Program.cs