ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 请教一个折腾了我无数次未果的问题. SendMessage清除Debug.Print的立即窗口

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-2-26 19:06 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
关于如何稳定地清除VBE的"立即窗口", 搜索过无数资料.首先, 大部分找到的答案是:
1.  Send Ctrl+G  定位到该窗口, 再Ctrl+A,  再删除,   这种风险很大,  容易误删代码窗口.

2.  先用Debug.Print循环几十次空白行, 来达到清空的目的.

以上, 都不是满意的答案.
最完美的办法, 应该是取得hwnd后,  直接用WM_SETTEXT,  变成输出的文本.

但测试下来.  它只改变了窗口标题. 却没能改变窗口内的内容.

退而求次,  定位"立即窗口" 后用Ctrl+A删除后, 再输出Debug.Print
但发现, 由于按键有延时效果. 会把自身都删除了.

求论坛高手  有什么更好的办法解决呢?

  1. Option Explicit

  2. Private Declare PtrSafe Function FindWindowA Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
  3. Private Declare PtrSafe Function FindWindowExA Lib "user32" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr
  4. Private Declare PtrSafe Function PostMessageA Lib "user32" (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As Long
  5. Private Declare PtrSafe Function SendMessageA Lib "user32" (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As Long
  6. Private Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As LongPtr)

  7. Private Const WM_ACTIVATE As Long = &H6
  8. Private Const KEYEVENTF_KEYUP = &H2
  9. Private Const VK_CONTROL = &H11

  10. Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  11. Private Declare PtrSafe Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
  12. Private Declare PtrSafe Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long
  13. Private Declare PtrSafe Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
  14. Private Declare PtrSafe Function IsWindowVisible Lib "user32" (ByVal hWnd As Long) As Boolean
  15. Private Declare PtrSafe Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hWndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long
  16. 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

  17. Private Const WM_GETTEXT As Integer = &HD
  18. Private Const WM_GETTEXTLENGTH As Integer = &HE
  19. Private Const WM_SETTEXT As Integer = &HC

  20. Sub test()
  21.    Call dp("w")
  22. End Sub
  23. Sub dp(ByVal s As String)
  24.     Dim hwndVBE As LongPtr
  25.     Dim hwndImmediate As LongPtr
  26.    
  27.     hwndVBE = FindWindowA("wndclass_desked_gsk", vbNullString)
  28.     'hwndImmediate = FindWindowExA(hwndVBE, ByVal 0&, "VbaWindow", "Immediate") ' English caption
  29.     hwndImmediate = FindWindowExA(hwndVBE, ByVal 0&, "VbaWindow", "立即窗口") ' Chinese caption
  30.     'If hwndImmediate = 0 Then hwndImmediate = FindWindowExA(hwndVBE, ByVal 0&, "VbaWindow", "Direct") ' Dutch caption
  31.         Debug.Print hwndImmediate, s
  32.     If hwndImmediate > 0 Then
  33.         PostMessageA hwndImmediate, WM_ACTIVATE, 1, 0&
  34.         keybd_event VK_CONTROL, 0, 0, 0
  35.         keybd_event vbKeyA, 0, 0, 0
  36.         keybd_event vbKeyA, 0, KEYEVENTF_KEYUP, 0
  37.         keybd_event VK_CONTROL, 0, KEYEVENTF_KEYUP, 0
  38.         
  39.         keybd_event vbKeyDelete, 0, 0, 0
  40.         keybd_event vbKeyDelete, 0, KEYEVENTF_KEYUP, 0
  41.         'Debug.Print s    '测试由于按键延时, 会把自身删除.
  42.     End If
  43.     SendMessage hwndImmediate, WM_SETTEXT, 0, ByVal s
  44. End Sub
复制代码


测试.rar

23.99 KB, 下载次数: 8

TA的精华主题

TA的得分主题

发表于 2021-2-27 11:44 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 lss001 于 2021-3-3 22:36 编辑

        keybd_event vbKeyDelete, 0, KEYEVENTF_KEYUP, 0
        Stop'暂停
        Debug.Print s    '测试由于按键延时, 会把自身删除.

Sub ClearImmediate()

    x = "excel" '打印文本x
    SendKeys "^g" & x & ""
    SendKeys "^g^a{del}" '删除旧文本
    y = "vba" '打印文本y
    SendKeys "^g" & y & ""
   
End Sub




TA的精华主题

TA的得分主题

 楼主| 发表于 2021-2-27 16:20 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lss001 发表于 2021-2-27 11:44
keybd_event vbKeyDelete, 0, KEYEVENTF_KEYUP, 0
        DoEvents '转让控制权,以便让操作系统 ...

我就是吃过一次亏, Ctrl+A 误删了代码.
再也不敢去试这种方式了.

TA的精华主题

TA的得分主题

发表于 2021-2-27 19:33 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-3-2 12:35 | 显示全部楼层
lss001 发表于 2021-2-27 11:44
keybd_event vbKeyDelete, 0, KEYEVENTF_KEYUP, 0
        DoEvents '转让控制权,以便让操作系统 ...

测试发现,
VBA.DoEvents '转让控制权  
效果就和Debug.Print是一样的.  并不能删除原来的 Debug.Print

TA的精华主题

TA的得分主题

发表于 2021-3-4 14:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
cgx5871 发表于 2021-3-2 12:35
测试发现,
VBA.DoEvents '转让控制权  
效果就和Debug.Print是一样的.  并不能删除原来的 Debug.Print

可参考2楼更新。。。。。。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-27 01:35 , Processed in 0.031735 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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