Python实现鼠标点击获取窗口进程信息
最近遇到挺无解的一个问题:电脑上莫名其妙出现一个白色小方块,点击没有反应,关也关不掉,想知道它和哪个软件有关还是显卡出了问题,也找不到思路,就想着要不获取一下它的进程号看看。
于是写了一个Python脚本,可以通过鼠标点击快速获取任意窗口的详细信息,包括窗口标题、进程PID和程序路径。特别适合需要快速定位窗口来源或排查异常进程的场景。
使用方法
- 运行脚本后,屏幕会提示:
点击任意窗口开始检测 (按Ctrl+C退出)...
- 将鼠标移动到目标窗口上方并点击
- 控制台立即显示类似以下信息:
窗口标题: 无标题 - 记事本
进程PID: 1234
程序路径: C:\Windows\System32\notepad.exe
实现原理
-
核心组件 :
pynput
:监听全局鼠标点击事件pywin32
:获取窗口句柄和进程IDpsutil
:查询进程详细信息
-
技术流程 :
- 鼠标点击时捕获坐标位置
- 通过
WindowFromPoint
获取对应窗口句柄 - 使用
GetWindowThreadProcessId
提取进程ID - 通过
psutil
查询进程可执行文件路径 - 最后输出窗口标题和进程信息
安装依赖
pip install pynput pywin32 psutil
注意事项
- 需要Windows系统运行
- 获取系统级窗口(如任务栏)可能显示路径为
Unknown
- 某些受保护进程可能需要管理员权限运行脚本
- 点击速度过快可能导致坐标捕获偏差,建议点击后稍作停顿
完整代码
import win32gui
import win32process
import psutil
import signal
import sys
from pynput import mouse
def signal_handler(sig, frame):
print("\n程序已退出")
sys.exit(0)
def get_window_info(x, y):
hwnd = win32gui.WindowFromPoint((x, y))
_, pid = win32process.GetWindowThreadProcessId(hwnd)
try:
process = psutil.Process(pid)
exe_path = process.exe()
except psutil.NoSuchProcess:
exe_path = "Unknown"
title = win32gui.GetWindowText(hwnd)
return pid, exe_path, title
def on_click(x, y, button, pressed):
if pressed:
pid, exe, title = get_window_info(x, y)
print(f"窗口标题: {title}")
print(f"进程PID: {pid}")
print(f"程序路径: {exe}\n")
# 注册信号处理
signal.signal(signal.SIGINT, signal_handler)
with mouse.Listener(on_click=on_click) as listener:
print("点击任意窗口开始检测 (按Ctrl+C退出)...")
try:
listener.join()
except KeyboardInterrupt:
pass
于是破案:PowerToys!