一次抓“小偷”的经过(找出偷走当前活动窗口的小偷)
最近在使用Windows的过程中经常发现当前活动窗口被莫名其妙切换走需要按AltTab键或用鼠标左键单击恢复很烦人。于是写了一个每隔0.5秒获取当前窗口对应的进程PID窗口标题和对应进程全路径名有变化时记录到日志文件中的小程序FocusMonitor源代码如下#pragma warning(disable:4996) #pragma comment(lib,user32) #pragma comment(lib,psapi) #include io.h #include stdio.h #include string.h #include windows.h #include psapi.h //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include time.h #include sys/timeb.h #include stdarg.h char logfilename1[]FocusMonitor1.log; char logfilename2[]FocusMonitor2.log; static char logstr[MAXLINSIZE1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; char pathfilename[_MAX_FNAME]; char path[_MAX_FNAME]; char filename[_MAX_FNAME]; char tt[2]; void Lock(CRITICAL_SECTION *l) { EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) { LeaveCriticalSection(l); } void LogV(const char *pszFmt,va_list argp) { struct tm *now; struct timeb tb; if (NULLpszFmt||0pszFmt[0]) return; _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp); ftime(tb); nowlocaltime(tb.time); sprintf(datestr,%04d-%02d-%02d,now-tm_year1900,now-tm_mon1,now-tm_mday); sprintf(timestr,%02d:%02d:%02d,now-tm_hour ,now-tm_min ,now-tm_sec ); sprintf(mss,%03d,tb.millitm); // printf(%s %s.%s %s,datestr,timestr,mss,logstr); flogfopen(logfilename1,a); if (NULL!flog) { fprintf(flog,%s %s.%s %s,datestr,timestr,mss,logstr); if (ftell(flog)MAXLOGSIZE) { fclose(flog); if (rename(logfilename1,logfilename2)) { remove(logfilename2); rename(logfilename1,logfilename2); } } else { fclose(flog); } } } void Log(const char *pszFmt,...) { va_list argp; Lock(cs_log); va_start(argp,pszFmt); LogV(pszFmt,argp); va_end(argp); Unlock(cs_log); } //Log} void GetPathByProcessId(DWORD dwPid, char *fullpath) { HANDLE hProcess OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPid); if (hProcess NULL) return; fullpath[0]0; GetModuleFileNameEx(hProcess,NULL,fullpath,MAX_PATH); } INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow) { remove(noloop.txt); InitializeCriticalSection(cs_log); Log(FocusMonitor.exe Begin...\n); //防止该进程重入 HANDLE hMutex; hMutex CreateMutex(NULL, FALSE, FocusMonitor.exe ); if ( WaitForSingleObject(hMutex, 1000) WAIT_TIMEOUT ) { Log(FocusMonitor.exe already running\n); Log( ...End\n); DeleteCriticalSection(cs_log); return 1; } if ( GetLastError() ERROR_ALREADY_EXISTS ) { ReleaseMutex(hMutex); Log(FocusMonitor.exe already running\n); Log( ...End\n); DeleteCriticalSection(cs_log); return 2; } char str1[2*MAX_PATH]; char str2[2*MAX_PATH]; str2[0]0; while (1) { if (_access(noloop.txt,0) 0) break;// Sleep(500); HWND hWndGetForegroundWindow(); char title[10241]; if (0GetWindowText(hWnd, title, 1024)) title[0]0; DWORD pid; GetWindowThreadProcessId(hWnd,pid); char fullpath[MAX_PATH]; GetPathByProcessId(pid,fullpath); sprintf(str1,PID:%5ld, TITLE:%-100s, FULLPATH:%s\n,pid,title,fullpath); if (strcmp(str2,str1)){ strcpy(str2,str1); Log(str2); } } remove(noloop.txt); Log(Create a file noloop.txt or kill process FocusMonitor.exe to exit\n); Log(...End\n); DeleteCriticalSection(cs_log); return 0; }使用这个工具果然让我抓到了“小偷”2026-07-17 15:50:12.784 PID: 9527, TITLE:mphelper, FULLPATH:C:\Users\zhao4zhong1\AppData\Roaming\mphelper\2.0.21.1\mphelper.exe然后我就祭出我的“手铐”资源管理器中将文件夹C:\Users\zhao4zhong1\AppData\Roaming\mphelper的属性、安全、编辑、组或用户名、删除把这个“小偷”送进了“监狱”。

相关新闻

Windows Defender彻底移除指南:3种系统优化方案与完整实施流程

Windows Defender彻底移除指南:3种系统优化方案与完整实施流程

Windows Defender彻底移除指南:3种系统优化方案与完整实施流程 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mir…

2026/9/29 21:35:40 阅读更多 →
Efficient Streaming Language Models with Attention Sinks

Efficient Streaming Language Models with Attention Sinks

StreamingLLM论文精读:为什么只保留开头几个Token,就能让模型持续生成数百万Token? 在普通大语言模型中,KV Cache会随着对话或文本长度不断增长。最直接的解决办法是只保留最近一段Token,也就是滑动窗口。 但论文发现…

2026/10/8 2:16:09 阅读更多 →
肇庆东莞惠州公司变更地址法人流程对比与注意事项

肇庆东莞惠州公司变更地址法人流程对比与注意事项

肇庆、东莞、惠州公司变更地址法人流程对比与注意事项在珠三角经济圈,随着商业活动的日益频繁,企业主在处理工商注册、变更或注销事务时,常面临“自行办理”与“委托专业服务”的选择。不同企业在规模、税务状况及变更复杂度上存在显著差异&a…

2026/10/7 5:00:17 阅读更多 →

最新新闻

JavaWeb学生信息管理系统课程设计全解析:从表结构到答辩技巧

JavaWeb学生信息管理系统课程设计全解析:从表结构到答辩技巧

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 1:38:05 阅读更多 →
权值线段树与离散化:动态中位数的工程实现

权值线段树与离散化:动态中位数的工程实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 1:38:05 阅读更多 →
初识Bootstrap:栅格系统、组件与工具类实战笔记

初识Bootstrap:栅格系统、组件与工具类实战笔记

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 1:38:05 阅读更多 →
嵌入式系统中代号字符串的逆向分析与工程治理

嵌入式系统中代号字符串的逆向分析与工程治理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 1:38:05 阅读更多 →
HEVC FPGA解码器RTL工程:CABAC与IDCT模块验证指南

HEVC FPGA解码器RTL工程:CABAC与IDCT模块验证指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 1:38:05 阅读更多 →
KNN图像识别入门:从PCA降维到手写数字分类实战

KNN图像识别入门:从PCA降维到手写数字分类实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 1:37:04 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →