Windows 7 中的活动窗口(程序)意外失去焦点

Windows 7 中的活动窗口(程序)意外失去焦点

由于我目前正在使用 Windows,所以某些东西正在将焦点从我的活动窗口(活动程序)转移(窃取)。

我有与描述相同的问题这个问题,但有少数例外:

  1. 我在(至少)两台不同的计算机上观察到了这种行为,所以这不是特定于机器的。

  2. 其中一台提到的计算机装有 Windows 7 HE 64 位,另一台装有 Windows 7 Pro 32 位,因此该问题并不特定于某个特定版本的 Windows 或某个特定的硬件平台。

  3. 有时焦点会彻底丢失(必须单击窗口才能继续使用它),有时它只是转移到另一个后台进程(?)并在大约 2-3 秒后返回。

  4. 过去几周我都没有在这些电脑上安装任何新东西(Windows 更新和其他自动更新(如 Chrome 浏览器自动更新)除外)并明确提到问题在上次安装后很多天才开始出现

我的电脑当前的行为确实很奇怪,整个事情变得很烦人。示例:

  1. 我在 Chrome 中选择了一些文本,实际上看到选择颜色从蓝色(在活动窗口中选择)变为灰色(在非活动窗口中选择)。

  2. 我在 Chrome 中编辑 Word、Notepad++ 中的某些文档或 Gmail 中的电子邮件,编辑过程要么停止几秒钟(当焦点转移时),要么永久结束(永远失去焦点)。

我已经活跃、更新并正在工作微软安全必备并且没有报告任何异常。

我有一种感觉,这种情况最常发生在 Google Chrome 中。起初我非常确定,几乎准备指责该浏览器的一些最新更新。但事实证明,我在 Chrome 中发现这种情况异常频繁,因为这是我最常用的程序。

有没有人遇到过类似的问题,或者知道是什么原因导致的或者如何解决这个问题?

答案1

作为和31415建议我,我仔细查看了我的程序Startup选项卡中的内容msconfig,但没有发现任何异常。

现在很清楚,这 99% 是由某些外部程序引起的(虽然之前没有注意到,而且我最近没有安装任何新程序),而不是 Windows。这对我来说是最重要的一点。

我又在 Google 上搜索了一下,得到了一些想法/建议,即在注意到焦点被窃取后,我应该尝试立即按Alt+ 。这应该会退出可能导致焦点被窃取的进程。然后,我可能会尝试使用from包来跟踪刚刚退出的进程。F4Process MonitorSysinternals

这也许可以让我知道是什么导致了这个问题。

答案2

我编写了一个 C# 程序来监控波动过程。如果有人需要找出导致此问题的进程,这里有代码。

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);
            }
        }
    }
}

输出示例显示进程启动(绿色)和终止(红色)

输出样例

答案3

焦点可能被有缺陷的后台任务窃取。它会打开一个窗口,该窗口会窃取焦点,然后很快关闭,但焦点不会返回。最近,Microsoft Office 有这样的错误

要发现此类过程,您可以使用工具喜欢窗口焦点记录器镜子)或类似于以下的自定义 C# 程序进程监控

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();
            }
        }
    }
}

完善并修复了错误的版本Omar Alshaker 提供的代码。也不需要 C# 6。需要 .NET 3.5 或更新版本。

您可以使用 .NET Framework 安装附带的 C# 编译器 ( csc.exe) 对其进行编译,然后运行生成的可执行文件以获取启动(绿色)或结束(红色)的进程的实时日志。使用Ctrl+C终止它。


要查找编译器,请运行where /R %windir%\Microsoft.NET csc.exe。从安装的最新 .NET 版本中选择一个,无论是 32b 还是 64b。将 C# 代码保存在Program.cs并将其编译为Program.exe

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe Program.cs

答案4

使用 退出中断程序的提示效果Alt+F4很好。我没有使用 来跟踪刚刚退出的程序,而是SysInternal按照ProcessManager如下方式跟踪了该程序:

  1. 打开Task manager
  2. 对打开的进程进行截图
  3. 切换到浏览器、邮件等并“等待焦点丢失”
  4. 按下Alt+F4退出中断程序
  5. 转到Task manager并将打开的流程与屏幕截图进行比较
  6. 现在“缺失”的进程导致了问题

在我的情况下twcu.exe,它是一个以 开头的程序TP-Link Configuration tool。它由外部 WIFI-USB 棒使用。正如这里报道的那样(file.net 上的 twcu.exe) 和这里 (computerbase.de 上的 twcu.exe [德语]),TP-Link Configuration toolWIFI 连接本身不需要。我将其从自动启动 ( msconfig> system start) 中删除,重新启动计算机,它仍然可以完美地连接到 WIFI - 焦点丢失问题也消失了!

相关内容