一次抓“小偷”的经过(找出偷走当前活动窗口的小偷)
最近在使用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/7/24 20:53:11 阅读更多 →
Efficient Streaming Language Models with Attention Sinks

Efficient Streaming Language Models with Attention Sinks

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

2026/7/24 20:53:11 阅读更多 →
肇庆东莞惠州公司变更地址法人流程对比与注意事项

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

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

2026/7/24 20:53:11 阅读更多 →

最新新闻

3分钟快速解锁:终极免费QQ音乐解密转换器qmc-decoder使用指南

3分钟快速解锁:终极免费QQ音乐解密转换器qmc-decoder使用指南

3分钟快速解锁:终极免费QQ音乐解密转换器qmc-decoder使用指南 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾遇到过这样的困扰?在QQ音乐精…

2026/7/24 21:01:14 阅读更多 →
达梦数据库10046事件使用

达梦数据库10046事件使用

目前看没什么用 ALTER SESSION SET EVENTS 10046 trace name context forever, level 1; select tablespace_name from dba_tablespaces; ALTER SESSION SET EVENTS 10046 trace name context off;select sessid; show parameter trace_path看看输出到哪个文件了内容如下&#…

2026/7/24 21:01:14 阅读更多 →
Keyboard Chatter Blocker:终极免费解决方案,彻底告别机械键盘连击问题

Keyboard Chatter Blocker:终极免费解决方案,彻底告别机械键盘连击问题

Keyboard Chatter Blocker:终极免费解决方案,彻底告别机械键盘连击问题 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocke…

2026/7/24 21:01:14 阅读更多 →
边缘节点配置“断片”惨案:Spring Boot 弱网离线同步求生指南

边缘节点配置“断片”惨案:Spring Boot 弱网离线同步求生指南

边缘节点配置“断片”惨案:Spring Boot 弱网离线同步求生指南 你把 Spring Boot 应用部署到了成千上万个边缘节点上——工厂车间的工控机、智能快递柜、加油站的嵌入式网关。起初,你复用云端的 Spring Cloud Config Server,以为配置同步不过是…

2026/7/24 21:01:14 阅读更多 →
如何在3分钟内彻底搞定Figma中文界面:设计师的终极汉化指南

如何在3分钟内彻底搞定Figma中文界面:设计师的终极汉化指南

如何在3分钟内彻底搞定Figma中文界面:设计师的终极汉化指南 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma的英文界面而头疼吗?专业术语看不懂&…

2026/7/24 21:01:14 阅读更多 →
计算机毕业设计之基于SpringBoot的健身俱乐部系统

计算机毕业设计之基于SpringBoot的健身俱乐部系统

摘 要在健康意识日益提升的当下,健身需求迅猛增长,传统健身俱乐部管理模式效率低、服务体验差等问题凸显。为顺应数字化发展趋势,满足俱乐部高效运营和会员优质服务的需求,基于Spring Boot开发健身俱乐部系统应运而生。该系统能整…

2026/7/24 21:00:14 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻