如何用Python抓取已打开的Windows CMD终端(conhost.exe)文本?
抓取已运行CMD终端(conhost.exe)文本的Python方案
方法1:通过Windows控制台API读取缓冲区
这种方式直接访问CMD的输出缓冲区,无需干扰终端窗口状态,稳定性更高。
- 先安装依赖库:
pip install pywin32
- 核心代码示例:
import win32gui import win32console import win32api import win32con def find_conhost_window(window_title): # 根据窗口标题找到目标conhost窗口句柄 def callback(handle, extra): if win32gui.GetWindowText(handle) == window_title: extra.append(handle) return True handles = [] win32gui.EnumWindows(callback, handles) return handles[0] if handles else None def read_console_output(console_handle): # 获取控制台缓冲区信息 buffer_info = win32console.GetConsoleScreenBufferInfo(console_handle) buffer_size = buffer_info['Size'] # 读取缓冲区内容 chars = win32console.ReadConsoleOutputCharacter(console_handle, buffer_size.X * buffer_size.Y, 0) # 整理成多行文本 lines = [chars[i:i+buffer_size.X].rstrip('\x00') for i in range(0, len(chars), buffer_size.X)] return '\n'.join(filter(None, lines)) # 使用示例:替换为你的conhost窗口标题 target_title = "你的CMD窗口标题" window_handle = find_conhost_window(target_title) if window_handle: # 获取窗口关联的控制台句柄 console_handle = win32api.GetWindowThreadProcessId(window_handle)[1] console_handle = win32console.OpenConsole(console_handle) output_text = read_console_output(console_handle) print(output_text) else: print("未找到目标终端窗口")
注意:需要确保你的Python进程有足够权限访问目标终端进程,部分情况下可能需要以管理员身份运行。
方法2:模拟剪贴板复制(简易场景)
如果对稳定性要求不高,可通过模拟键盘快捷键全选并复制终端内容,再读取剪贴板。
- 安装依赖:
pip install pywin32 pygetwindow
- 核心代码示例:
import pygetwindow as gw import win32api import win32con import win32clipboard import time def copy_terminal_text(window_title): # 找到目标窗口并激活 try: win = gw.getWindowsWithTitle(window_title)[0] win.activate() time.sleep(0.1) # 等待窗口激活 except IndexError: print("未找到目标窗口") return None # 模拟Ctrl+A全选 win32api.keybd_event(win32con.VK_CONTROL, 0, 0, 0) win32api.keybd_event(ord('A'), 0, 0, 0) win32api.keybd_event(ord('A'), 0, win32con.KEYEVENTF_KEYUP, 0) win32api.keybd_event(win32con.VK_CONTROL, 0, win32con.KEYEVENTF_KEYUP, 0) time.sleep(0.1) # 模拟Ctrl+C复制 win32api.keybd_event(win32con.VK_CONTROL, 0, 0, 0) win32api.keybd_event(ord('C'), 0, 0, 0) win32api.keybd_event(ord('C'), 0, win32con.KEYEVENTF_KEYUP, 0) win32api.keybd_event(win32con.VK_CONTROL, 0, win32con.KEYEVENTF_KEYUP, 0) time.sleep(0.1) # 读取剪贴板内容 win32clipboard.OpenClipboard() text = win32clipboard.GetClipboardData(win32con.CF_TEXT).decode('gbk') win32clipboard.CloseClipboard() return text # 使用示例 target_title = "你的CMD窗口标题" terminal_text = copy_terminal_text(target_title) if terminal_text: print(terminal_text)
缺点:需要终端窗口处于前台,可能干扰用户操作,且若终端有输入焦点限制可能失效。
内容的提问来源于stack exchange,提问作者Kurt Costa Peters
相关产品推荐
相关产品推荐

