level 7
如何在VB中实现按ctrl+A后,全选文本框中的文字
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = 1 Then
Text1.SelStart = 0
Text1.SelLength = Len(Text1.Text)
End If
End Sub
或者用这个
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
If Shift = 2 And (KeyCode = Asc("a") Or KeyCode = Asc("A")) Then
Text1.SelStart = 0
Text1.SelLength = Len(Text1.Text)
End If
End Sub
但如果窗体上有N个命名都不一样的文本框,有没办法做到所有文本框都一次性赋予CTRL+A的能力?
2022年03月10日 07点03分
1
level 15
好像只能每个文本框分别写代码,我也想知道有没有更简单的办法
另外注意,KeyCode和KeyAscii不一样,字母键的KeyCode对应的是大写字母的ASCII码,而小写字母的ASCII码跟小键盘区和功能键区(F1、F2等)的KeyCode是对应的,比如小写a的ASCII码97对应的是小键盘数字1的KeyCode,所以你那个KeyDown的代码按Ctrl和小键盘的1也会全选
2022年03月10日 08点03分
3
@klimaa 是用的GetClassInfoW+CallWindowProcW的方式吧?
2025年03月19日 03点03分
6楼的模块完美搞定我的需求了
2022年03月10日 09点03分
@yjryym 好评,看到你楼上的解释了,原来文本框还有这种说道
2022年03月11日 06点03分
level 13
可以将N个文本框名字改成同名(控件数组),这样所有文本框都会调用同一个事件用事件Index参数区分每一个
2022年03月10日 08点03分
4
数组不方便,文本框的命名很多种,6楼的模块完美搞定我的需求了
2022年03月10日 09点03分
level 1
楼上那个代码 我有点没看懂 两个文本框 怎么用 如果焦点光标在文本框1 按下ctrl+a 只有文本框1的内容被选中 文本框2一点反应都没有
2022年03月10日 10点03分
7
你如果知道Win系统的“消息机制”,就不会有什么疑问了。因为在“活动窗口”上按下Ctrl+A时,它只向有焦点的那个文本框发送“选定文本”的消息(选定范围是“从0到‘无穷大’ ”
![[滑稽]](/static/emoticons/u6ed1u7a3d.png)
),于是就会“全选”了。
2022年03月10日 14点03分
正常不就是这样吗,哪有ctrla影响别的文本框的,只对当前选中的有效就行了
2022年03月10日 23点03分
level 7
'模块代码,名字modTextBox.bas
Attribute VB_Name = "modTextBox"
'原作者:VB吧隨風缒夢
Option Explicit
Private Declare Function GetFocus Lib "user32" () As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
'全选
Public Sub SelectAll()
Dim hWndChild As Long
Dim strClassName As String
hWndChild = GetFocus() '得到当前有焦点的窗口句柄
strClassName = Space$(100)
Call GetClassName(hWndChild, strClassName, 100) '得到控件类名
If InStr(strClassName, "TextBox") Then '匹配控件类名(编译后类名会加上RT6)
Call SendMessage(hWndChild, &HB1, 0, ByVal -1&)
End If
End Sub
'窗体代码中加上下面这些代码就可以了
Private Sub Form_Load()
Me.KeyPreview = True
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyA And Shift = vbCtrlMask Then Call modTextBox.SelectAll
End Sub
2022年12月30日 02点12分
11
level 6
把窗体的keypreview设定为true
在窗体的keydown或keyup事件中,发现按下ctrl+a时,遍历本窗体所有控件,如果控件类型是textbox则对其全选
2025年03月09日 19点03分
14
为什么要遍历?有多个textbox时,就狗熊掰棒子了。
2025年03月11日 07点03分
如果真的用这个方法,有个属性叫ActiveControl
2025年03月11日 14点03分
@初音✨七奈 学到了 Private Sub Timer1_Timer() Text3 = Me.ActiveControl End Sub ctrl a 都不用 文本框本身不是能双击全选吗 非要 ctrl a ma?
2025年03月11日 15点03分
@初音✨七奈 为什么会掌握这么多很少用到的细节?怀疑过你是教VB的老师,后来又觉得不像。
2025年03月12日 00点03分
level 1
14楼 初音的方法好
Private Sub Timer1_Timer()
Text3 = Me.ActiveControl
End Sub
2025年03月11日 16点03分
15
level 1
14楼 初音的方法好
Private Sub Timer1_Timer()
Text3 = Me.ActiveControl
End Sub
2025年03月11日 16点03分
16
level 6
text1.select-start=0
.select-length=999
2025年09月12日 04点09分
17