原文:https://blog.iyatt.com/?p=14383
1 前言
刚才在打字的时候发现会随机失去焦点,然后又要用鼠标点一下正在输入的位置才能继续输入,特别烦。开始我怀疑是手碰到触摸板导致失去焦点,但是我用了差不多十年带触摸板的笔记本电脑,习惯中打字就不会碰到触摸板。保持疑惑就观察了一下,不触碰电脑,结果一会也会失去焦点,就说明是系统中有什么软件在夺取焦点,关键是这个夺取焦点的软件还是不可见的,所以就会表现出突然正在操作的地方失去焦点。
我在网上查了一下,找到了一段可用于捕获活动窗口的代码(https://bbs.nga.cn/read.php?tid=6997752&rand=770 )
#include <Windows.h>
#include <wchar.h>
#include <Psapi.h>
#pragma comment(lib, "Psapi.lib")
int main()
{
HWND last_fore = NULL;
wchar_t name[MAX_PATH];
DWORD size = MAX_PATH;
while (1)
{
HWND fore = GetForegroundWindow();
if (fore != last_fore)
{
last_fore = fore;
DWORD processid;
GetWindowThreadProcessId(fore, &processid);
HANDLE process = OpenProcess(PROCESS_QUERY_INFORMATION, NULL, processid);
GetProcessImageFileNameW(process, name, size);
wprintf(L"%s\n", name);
}
Sleep(10);
}
return 0;
}
用 VS 2022 编译了,这里提供我编译的 64 位可执行文件:见原文
害怕有病毒就自己编译
2 分析
直接运行后,不做任何操作,当有程序成为当前活动窗口的时候就会被捕获到
等了一会,就发现箭头所指的程序成为活动窗口,然后过一会又把活动窗口还回原来的(这里就是终端窗口),然后过会又变成活动窗口
然后我去任务管理器搜索这个程序,发现这个程序一会出现一会消失。也就是会突然运行夺取焦点,过一会又关闭还回焦点,然后一直往复。
去搜了一下这个程序,发现 WSL 的 issues 上有人提过这个问题(https://github.com/microsoft/wslg/issues/894 )
如果是其它软件导致的焦点失去也可以去搜索查找解决方案