开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 192|回复: 6
收起左侧

[其它求助] python程序,获取他控制台窗口的文字(不要ocr)

[复制链接]
结帖率:0% (0/2)
发表于 2025-8-15 17:12:22 | 显示全部楼层 |阅读模式   湖北省仙桃市
100精币
匿名管道试过了,可以获取,但是程序无法运行了,希望能从外部获取,后台的方式,不要ocr和全选复制的的方法 1.jpg


补充内容 (2025-8-15 17:22):
要用易语言获取python程序的控制台的文字。


回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值
结帖率:50% (1/2)

签到天数: 20 天

发表于 2025-8-15 17:19:15 | 显示全部楼层   河北省张家口市
  
import win32gui
import win32con
import win32api
import ctypes
import ctypes.wintypes
def get_cmd_window_text ():
"""获取CMD窗口的文本内容"""
# 查找CMD窗口
cmd_title = "C:\Windows\system32\cmd.exe"
hwnd = win32gui.FindWindow (None, cmd_title)

if not hwnd:
print ("未找到CMD窗口")
return None

# 确保窗口可见
win32gui.ShowWindow (hwnd, win32con.SW_SHOW)

# 获取窗口客户区矩形
rect = win32gui.GetClientRect (hwnd)
width = rect[2] - rect[0]
height = rect[3] - rect[1]

# 创建内存DC和位图
hdc = win32gui.GetDC (hwnd)
mem_dc = win32gui.CreateCompatibleDC (hdc)
bitmap = win32gui.CreateCompatibleBitmap (hdc, width, height)
win32gui.SelectObject (mem_dc, bitmap)

# 复制窗口内容到内存DC
win32gui.BitBlt (mem_dc, 0, 0, width, height, hdc, 0, 0, win32con.SRCCOPY)

# 释放DC
win32gui.ReleaseDC (hwnd, hdc)

# 这里我们无法直接从位图获取文本,需要使用OCR或者其他方法
# 下面是另一种方法:发送WM_GETTEXT消息获取窗口标题栏文本
# 注意:这只能获取标题栏文本,不能获取窗口内的命令输出

# 获取窗口标题文本长度
text_len = win32gui.SendMessage (hwnd, win32con.WM_GETTEXTLENGTH, 0, 0) + 1

# 分配缓冲区
buffer = ctypes.create_unicode_buffer (text_len)

# 获取窗口文本
win32gui.SendMessage (hwnd, win32con.WM_GETTEXT, text_len, buffer)

# 清理资源
win32gui.DeleteObject (bitmap)
win32gui.DeleteDC (mem_dc)

return buffer.value
def get_cmd_output (command):
"""执行命令并获取输出(另一种获取CMD内容的方式)"""
import subprocess
try:
# 执行命令并捕获输出
result = subprocess.run (
command,
shell=True,
check=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
return result.stdout
except subprocess.CalledProcessError as e:
return f"命令执行错误: {e.stderr}"
if __name__ == "__main__":
# 方法1: 获取CMD窗口标题文本(有限制)
cmd_text = get_cmd_window_text ()
if cmd_text:
print ("CMD窗口标题文本:")
print (cmd_text)

# 方法2: 执行命令并获取输出(更可靠的方式)
print ("\n执行命令 ' dir' 的输出:")
dir_output = get_cmd_output ("dir")
print (dir_output)


回复

使用道具 举报

结帖率:0% (0/2)

签到天数: 4 天

 楼主| 发表于 2025-8-15 17:21:47 | 显示全部楼层   湖北省仙桃市
huayuanderen 发表于 2025-8-15 17:19
[e=0]import win32gui
    import win32con
    import win32api

想要易语言的,你这个看不懂
回复

使用道具 举报

结帖率:100% (16/16)

签到天数: 23 天

发表于 2025-8-15 17:55:33 | 显示全部楼层   广东省广州市
用管道,我获取C++窗口程序这个方法没问题 PY没测试过
回复

使用道具 举报

结帖率:0% (0/2)

签到天数: 4 天

 楼主| 发表于 2025-8-15 17:59:25 | 显示全部楼层   湖北省仙桃市
丶TiGa 发表于 2025-8-15 17:55
用管道,我获取C++窗口程序这个方法没问题 PY没测试过

匿名管道试过了会导致程序无法正常运行
论坛找到了hook的方法,但是不会写
回复

使用道具 举报

结帖率:93% (224/242)

签到天数: 19 天

发表于 2025-8-15 20:32:51 | 显示全部楼层   黑龙江省伊春市
python的直接反编译就行很简单的
回复

使用道具 举报

结帖率:100% (16/16)

签到天数: 23 天

发表于 2025-8-16 10:36:00 | 显示全部楼层   广东省广州市
qingyou005 发表于 2025-8-15 17:59
匿名管道试过了会导致程序无法正常运行
论坛找到了hook的方法,但是不会写 ...

管道创建子进程 怎么还有HOOK的事

.版本 2

.子程序 创建子进程, 逻辑型
.参数 文件名, 文本型
.局部变量 输入读, 整数型
.局部变量 输入写, 整数型
.局部变量 输出读, 整数型
.局部变量 输出写, 整数型
.局部变量 sa, SECURITY_ATTRIBUTES
.局部变量 si, STARTUPINFO

' 如果以前创建过管道,关闭它
.如果真 (进程成功)
    DLL命令结束进程 (进程信息.进程句柄, 0)
    DLL命令关闭内核对象 (输入管道)
    DLL命令关闭内核对象 (输出管道)
    进程成功 = 假
.如果真结束
' 管道建立
sa.结构大小 = 12
sa.bInheritHandle = 1  ' 允许子进程继承句柄
sa.lpSecurityDescriptor = 0
DLL命令创建匿名管道 (输入读, 输入写, sa, 0)
DLL命令创建匿名管道 (输出读, 输出写, sa, 0)
' 创建子进程
si.结构大小 = 68  ' sizeof(STARTUPINFO)
si.dwFlags = #STARTF_USESTDHANDLES
si.hStdInput = 输入读
si.hStdOutput = 输出写
si.hStdError = 输出写
.如果真 (DLL命令创建进程 (0, 文件名, 0, 0, 1, 8, 0, 0, si, 进程信息) = 0)
    DLL命令关闭内核对象 (输入读)
    DLL命令关闭内核对象 (输入写)
    DLL命令关闭内核对象 (输出读)
    DLL命令关闭内核对象 (输出写)
    返回 (假)
.如果真结束
DLL命令关闭内核对象 (输入读)
DLL命令关闭内核对象 (输出写)
输入管道 = 输入写
输出管道 = 输出读
进程成功 = 真
返回 (真)


.版本 2

.子程序 _启动工具_周期事件, , , CMD命令回调
.局部变量 文本, 文本型
.局部变量 长度, 整数型
.局部变量 l, 整数型

.如果真 (进程成功)
    DLL命令预览管道数据 (输出管道, 0, 0, 0, 长度, 0)
    .如果真 (长度 > 0)
        文本 = 取空白文本 (1024)
        DLL命令读对象数据 (输出管道, 文本, 1023, 长度, 0)
    .如果真结束
    DLL命令取进程退出代码 (进程信息.进程句柄, 长度)
    ' 进程退出
    .如果真 (长度 ≠ #STILL_ACTIVE)
        DLL命令关闭内核对象 (输入管道)
        DLL命令关闭内核对象 (输出管道)
        进程成功 = 假
    .如果真结束

.如果真结束

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表