ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 303|回复: 4

WinAPI 操作win控制台cmd相关

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-7-28 23:23 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 lss001 于 2024-7-30 21:59 编辑

Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare PtrSafe Function GetSystemMenu Lib "user32" ( _
    ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare PtrSafe Function GetSubMenu Lib "user32" ( _
    ByVal hMenu As Long, ByVal nPos As Long) As Long
'Private Declare ptrsafe Function GetMenuItemCount Lib "user32" ( _
    ByVal hMenu As Long) As Long
Private Declare PtrSafe Function GetMenuItemID Lib "user32" ( _
    ByVal hMenu As Long, ByVal nPos As Long) As Long
'Private Declare ptrsafe Function GetMenuString Lib "user32" Alias "GetMenuStringA" _
   (ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString As String, _
   ByVal nMaxCount As Long, ByVal wFlag As Long) As Long
Private Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" _
    (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_SYSCOMMAND = &H112, WM_CLOSE = &H10, WM_SETTEXT = &HC


Sub cmdfs() 'winapi操作CMD
     Dim hwnd&, hMenu&, hSubMenu&, SelectAllID&, CopyID&, PasteID&, closeMenu&

     Shell "cmd.exe", vbMinimizedFocus                      '打开CMD程序
     Application.Wait Now + TimeSerial(0, 0, 2)             '延时响应打开CMD程序
     hwnd = FindWindow("ConsoleWindowClass", vbNullString)  '获取cmd窗口句柄
     hMenu = GetSystemMenu(hwnd, False)                     '获取cmd窗口系统菜单的句柄
     hSubMenu = GetSubMenu(hMenu, 7)                        '获取"编辑"控件的句柄

     Set hf = CreateObject("htmlfile")                      '或xmlfile
     Set clip = hf.parentwindow.clipboarddata               'htmlfile剪贴板
     sText = "cd C:\Users\Administrator\Documents"          '设置cmd命令
     clip.Setdata "Text", CStr(sText)                       '设置剪贴板数据

     PasteID = GetMenuItemID(hSubMenu, 2)                   '获取"粘贴"项的ID
     SendMessage hwnd, WM_SYSCOMMAND, PasteID, ByVal 0      '向cmd窗口发送粘贴命令
     PostMessage hwnd, &H101, &HD, ByVal 0&                               '向cmd窗口发送回车键<Enter>
     Application.Wait Now + TimeSerial(0, 0, 2)

     SelectAllID = GetMenuItemID(hSubMenu, 3)               '获取"全选"项的ID
     SendMessage hwnd, WM_SYSCOMMAND, SelectAllID, ByVal 0  '向cmd窗口发送全选命令

     CopyID = GetMenuItemID(hSubMenu, 1)                    '获取"复制"项的ID
     SendMessage hwnd, WM_SYSCOMMAND, CopyID, ByVal 0       '向cmd窗口发送复制命令

     closeMenu = GetSubMenu(hMenu, 6)                       '获取"关闭" 控件的句柄
     SendMessage hwnd, WM_CLOSE, closeMenu, ByVal 0         '向cmd窗口发送关闭命令

     Sheet1.Range("a1").Select
     Sheet1.Paste                                           '粘贴到A1单元格
     Set hf = Nothing                                       '释放剪贴板对象
     Set clip = Nothing
End Sub


评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-7-29 21:37 | 显示全部楼层
太漂亮了,完美;老师,能不能加一句,防止过早关闭了控制台窗口,导致回显不完整

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-29 21:39 来自手机 | 显示全部楼层
伶俐的毛豆 发表于 2024-7-29 21:37
太漂亮了,完美;老师,能不能加一句,防止过早关闭了控制台窗口,导致回显不完整

以下是代码是关闭,把以下代都删除即可
closeMenu = GetSubMenu(hMenu, 6)                       '获取"关闭" 控件的句柄
     SendMessage hwnd, WM_CLOSE, closeMenu, ByVal 0         '向cmd窗口发送关闭命令

TA的精华主题

TA的得分主题

发表于 2024-7-29 21:51 | 显示全部楼层
lss001 发表于 2024-7-29 21:39
以下是代码是关闭,把以下代都删除即可
closeMenu = GetSubMenu(hMenu, 6)                       '获取 ...

比如我dir 一个2000多个文件的目录,可能要1分多钟才能执行完,这时候,即使不执行关闭控制台的命令,由于过早的copy,回显也是不完整的...

有不有办法,检测最后一个命令(比如最后我运行exit)被执行了,才开始全选,copy,再close窗口呢

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-30 06:34 来自手机 | 显示全部楼层
本帖最后由 lss001 于 2024-7-30 06:40 编辑
伶俐的毛豆 发表于 2024-7-29 21:51
比如我dir 一个2000多个文件的目录,可能要1分多钟才能执行完,这时候,即使不执行关闭控制台的命令,由 ...


把最后的延时2秒→
Application.Wait Now + TimeSerial(0, 0, 2)
加大些改为2分钟→
t = Timer
Do While Timer < t + 120
     vba.DoEvents
Loop
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 07:25 , Processed in 0.041443 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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