回 帖 发 新 帖 刷新版面

主题:气死看星星这一类软件。

看“星星”的软件大家都知道,就是先获取窗口句柄,再用GetWindowText或者SendMessage之类的东东得到里面的实际内容。
  实际上如果不用键盘钩子,那么通过检测程序窗口是否存在,再枚举程序窗口中的子窗口(控件),得到其实际内容,也能截取到密码。我以前写的一个试验性的截取传奇密码和所选择的服务器的程序就是这样做的。
  可我不想让这样的问题发生在我的程序身上。好像很久以前曾看见有人直接这样写代码:
Private Sub Text1_KeyPress(KeyAscii As Integer)
Static Pws As String
Pws = Pws & Chr(KeyAscii)
KeyAscii = Asc("*")
End Sub
'Pws就是实际输入的内容。
我晕死,除非输入密码的人只会从头到尾的输,不修改,不删除,否则就是错误。

于是我写了下面一段,好像是长了点点。不过你在输入密码的时候无论怎样编辑,PwS这个变量里的字符串都不会出错。另外,如果中输入中文,我用"※"来代替"*"

'本示例需要一个名为TexPW的TextBox控件。 _
以下代码直接复制到窗体里面。
Dim PwS As String

Private Sub TexPW_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case 46
    If TexPW.SelLength > 0 Then
        PwS = Left(PwS, TexPW.SelStart) & Mid(PwS, TexPW.SelStart + TexPW.SelLength + 1)
    Else
        PwS = Left(PwS, TexPW.SelStart) & Mid(PwS, TexPW.SelStart + 2)
    End If
End Select
End Sub

Private Sub TexPW_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case Is < 0
    PwS = Left(PwS, TexPW.SelStart) & Chr(KeyAscii) & Mid(PwS, TexPW.SelStart + TexPW.SelLength + 1)
    KeyAscii = -24071
Case 8
    If TexPW.SelLength > 0 Then
        PwS = Left(PwS, TexPW.SelStart) & Mid(PwS, TexPW.SelStart + TexPW.SelLength + 1)
    ElseIf TexPW.SelStart <> 0 Then
        PwS = Left(PwS, TexPW.SelStart - 1) & Mid(PwS, TexPW.SelStart + TexPW.SelLength + 1)
    End If
Case 13
Case Else
    PwS = Left(PwS, TexPW.SelStart) & Chr(KeyAscii) & Mid(PwS, TexPW.SelStart + TexPW.SelLength + 1)
    KeyAscii = 42
End Select
End Sub


回复列表 (共2个回复)

沙发

好,顶!
不过加上keydown事件调试通不过。只要keypress事件就能行。

板凳

抱歉,据我再次测试,这个程序在某些时候会出问题。
所谓的某些时候就是指:我在一个普通文本框中迅速地按键,然后突然用鼠标点击经过这个程序处理过的文本框时,让它获得了焦点,这时,变量中就会记录下获得焦点之后的输入,但是,文本框中没有显示。
我想,可能是文本框获得焦点后就可以获取KeyPress和KeyDown事件,但是在一段时间内它不会对输入作出响应。
于是,我修改程序,害我增加了两个辅助变量。

修正版如下:

Dim Pws As String, Keya As Integer, Keyl As Integer

Private Sub TexPW_Change()
Select Case Keya
Case 8, 46
    If Keyl = 0 Then
        Pws = Left(Pws, TexPW.SelStart) & Mid(Pws, TexPW.SelStart + 2)
    Else
        Pws = Left(Pws, TexPW.SelStart) & Mid(Pws, TexPW.SelStart + Keyl + 1)
    End If
Case Else
    Pws = Left(Pws, TexPW.SelStart - 1) & Chr(Keya) & Mid(Pws, TexPW.SelStart + Keyl)
End Select
End Sub

Private Sub TexPW_KeyDown(KeyCode As Integer, Shift As Integer)
Keya = KeyCode: Keyl = TexPW.SelLength
End Sub

Private Sub TexPW_KeyPress(KeyAscii As Integer)
Keya = KeyAscii: Keyl = TexPW.SelLength
Select Case KeyAscii
Case Is < 0:    KeyAscii = -24071
Case 8
Case 13:    KeyAscii = 0
Case Else:    KeyAscii = 42
End Select
End Sub

我来回复

您尚未登录,请登录后再回复。点此登录或注册