|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
关于如何稳定地清除VBE的"立即窗口", 搜索过无数资料.首先, 大部分找到的答案是:
1. Send Ctrl+G 定位到该窗口, 再Ctrl+A, 再删除, 这种风险很大, 容易误删代码窗口.
2. 先用Debug.Print循环几十次空白行, 来达到清空的目的.
以上, 都不是满意的答案.
最完美的办法, 应该是取得hwnd后, 直接用WM_SETTEXT, 变成输出的文本.
但测试下来. 它只改变了窗口标题. 却没能改变窗口内的内容.
退而求次, 定位"立即窗口" 后用Ctrl+A删除后, 再输出Debug.Print
但发现, 由于按键有延时效果. 会把自身都删除了.
求论坛高手 有什么更好的办法解决呢?
- Option Explicit
- Private Declare PtrSafe Function FindWindowA Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
- 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
- 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
- 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
- Private Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As LongPtr)
- Private Const WM_ACTIVATE As Long = &H6
- Private Const KEYEVENTF_KEYUP = &H2
- Private Const VK_CONTROL = &H11
- Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
- Private Declare PtrSafe Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
- Private Declare PtrSafe Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long
- Private Declare PtrSafe Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
- Private Declare PtrSafe Function IsWindowVisible Lib "user32" (ByVal hWnd As Long) As Boolean
- 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
- 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_GETTEXT As Integer = &HD
- Private Const WM_GETTEXTLENGTH As Integer = &HE
- Private Const WM_SETTEXT As Integer = &HC
- Sub test()
- Call dp("w")
- End Sub
- Sub dp(ByVal s As String)
- Dim hwndVBE As LongPtr
- Dim hwndImmediate As LongPtr
-
- hwndVBE = FindWindowA("wndclass_desked_gsk", vbNullString)
- 'hwndImmediate = FindWindowExA(hwndVBE, ByVal 0&, "VbaWindow", "Immediate") ' English caption
- hwndImmediate = FindWindowExA(hwndVBE, ByVal 0&, "VbaWindow", "立即窗口") ' Chinese caption
- 'If hwndImmediate = 0 Then hwndImmediate = FindWindowExA(hwndVBE, ByVal 0&, "VbaWindow", "Direct") ' Dutch caption
- Debug.Print hwndImmediate, s
- If hwndImmediate > 0 Then
- PostMessageA hwndImmediate, WM_ACTIVATE, 1, 0&
- keybd_event VK_CONTROL, 0, 0, 0
- keybd_event vbKeyA, 0, 0, 0
- keybd_event vbKeyA, 0, KEYEVENTF_KEYUP, 0
- keybd_event VK_CONTROL, 0, KEYEVENTF_KEYUP, 0
-
- keybd_event vbKeyDelete, 0, 0, 0
- keybd_event vbKeyDelete, 0, KEYEVENTF_KEYUP, 0
- 'Debug.Print s '测试由于按键延时, 会把自身删除.
- End If
- SendMessage hwndImmediate, WM_SETTEXT, 0, ByVal s
- End Sub
复制代码
|
|