由于我目前正在使用 Windows,所以某些东西正在将焦点从我的活动窗口(活动程序)转移(窃取)。
我有与描述相同的问题这个问题,但有少数例外:
我在(至少)两台不同的计算机上观察到了这种行为,所以这不是特定于机器的。
其中一台提到的计算机装有 Windows 7 HE 64 位,另一台装有 Windows 7 Pro 32 位,因此该问题并不特定于某个特定版本的 Windows 或某个特定的硬件平台。
有时焦点会彻底丢失(必须单击窗口才能继续使用它),有时它只是转移到另一个后台进程(?)并在大约 2-3 秒后返回。
过去几周我都没有在这些电脑上安装任何新东西(Windows 更新和其他自动更新(如 Chrome 浏览器自动更新)除外)并明确提到问题在上次安装后很多天才开始出现。
我的电脑当前的行为确实很奇怪,整个事情变得很烦人。示例:
我在 Chrome 中选择了一些文本,实际上看到选择颜色从蓝色(在活动窗口中选择)变为灰色(在非活动窗口中选择)。
我在 Chrome 中编辑 Word、Notepad++ 中的某些文档或 Gmail 中的电子邮件,编辑过程要么停止几秒钟(当焦点转移时),要么永久结束(永远失去焦点)。
我已经活跃、更新并正在工作微软安全必备并且没有报告任何异常。
我有一种感觉,这种情况最常发生在 Google Chrome 中。起初我非常确定,几乎准备指责该浏览器的一些最新更新。但事实证明,我在 Chrome 中发现这种情况异常频繁,因为这是我最常用的程序。
有没有人遇到过类似的问题,或者知道是什么原因导致的或者如何解决这个问题?
答案1
作为和31415建议我,我仔细查看了我的程序Startup
选项卡中的内容msconfig
,但没有发现任何异常。
现在很清楚,这 99% 是由某些外部程序引起的(虽然之前没有注意到,而且我最近没有安装任何新程序),而不是 Windows。这对我来说是最重要的一点。
我又在 Google 上搜索了一下,得到了一些想法/建议,即在注意到焦点被窃取后,我应该尝试立即按Alt+ 。这应该会退出可能导致焦点被窃取的进程。然后,我可能会尝试使用from包来跟踪刚刚退出的进程。F4Process Monitor
Sysinternals
这也许可以让我知道是什么导致了这个问题。
答案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
如下方式跟踪了该程序:
- 打开
Task manager
- 对打开的进程进行截图
- 切换到浏览器、邮件等并“等待焦点丢失”
- 按下
Alt+F4
退出中断程序 - 转到
Task manager
并将打开的流程与屏幕截图进行比较 - 现在“缺失”的进程导致了问题
在我的情况下twcu.exe
,它是一个以 开头的程序TP-Link Configuration tool
。它由外部 WIFI-USB 棒使用。正如这里报道的那样(file.net 上的 twcu.exe) 和这里 (computerbase.de 上的 twcu.exe [德语]),TP-Link Configuration tool
WIFI 连接本身不需要。我将其从自动启动 ( msconfig
> system start
) 中删除,重新启动计算机,它仍然可以完美地连接到 WIFI - 焦点丢失问题也消失了!