VB.NET怎么判断当前登录的QQ号(新版QQNT9版本)2024-9-19更新
以下VB.NET代码之前支持QQNT版本, 前几天QQ更新到QQ9版本后获取不到了,哪位表哥有空帮忙优化改善一下,谢谢Imports System.Runtime.InteropServices
Imports System.Text
Imports System.Text.RegularExpressions
Imports System.Windows.Forms
Public Class Class1
<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
Public Shared Function GetClassName(hWnd As IntPtr, lpClassName As StringBuilder, nMaxCount As Integer) As Integer
End Function
<DllImport("user32.dll")>
Private Shared Function IsWindowVisible(hWnd As IntPtr) As Boolean
End Function
<DllImport("user32.dll")>
Private Shared Function IsWindow(hWnd As IntPtr) As Boolean
End Function
Public Shared Function FindAndProcessWindows() As List(Of String)
Dim result As New List(Of String)()
Dim hWnd As IntPtr
Dim className As New StringBuilder(64)
Dim qqclassName As String
For i As Integer = 65535 To 42000000
hWnd = CType(i, IntPtr)
If IsWindow(hWnd) AndAlso Not IsWindowVisible(hWnd) Then
className.Length = 0
If GetClassName(hWnd, className, className.Capacity) <> 0 Then
qqclassName = className.ToString()
If qqclassName.StartsWith("NTQQOpenSdk") OrElse qqclassName.StartsWith("OPENSDK_SHARE2QQ_QQ_WINCLASS") Then
Dim match = Regex.Match(qqclassName, "_(\d+)$")
If match.Success Then
Dim result1 As String = match.Groups(1).Value
result.Add(result1)
End If
End If
End If
End If
Next
Return result
End Function
End Class
在你的VB.NET代码中,似乎是根据窗口类名查找QQ窗口并提取特定信息之间出了问题。这可能是由于QQ的更新导致窗口类名发生了变化,或者是QQ使用了新的窗口管理机制。以下是一些优化建议和改进代码的示例:
更新查找窗口的范围:QQ的窗口句柄可能不在标准范围内,因此应考虑扩展搜索范围。
增加窗口类名的灵活性:使用更灵活的匹配方法来检测窗口类名,以支持QQ的版本更新可能引起的类名变化。
使用调试输出:可以考虑添加一些调试信息来确保你能够追踪到哪些窗口被找到。
以下是改进后的代码示例:
vb.netImports
Public Shared Function GetClassName(hWnd As IntPtr, lpClassName As StringBuilder, nMaxCount As Integer) As Integer End Function <DllImport("user32.dll")>
Private Shared Function IsWindowVisible(hWnd As IntPtr) As Boolean End Function <DllImport("user32.dll")>
Private Shared Function IsWindow(hWnd As IntPtr) As Boolean End Function Public Shared Function FindAndProcessWindows() As List(Of String)
Dim result As New List(Of String)()
Dim hWnd As IntPtr Dim className As New StringBuilder(256) ' 增加缓冲区大小,适应更长的类名 Dim qqclassName As String For i As Integer =0 To65535 ' 有时窗口句柄从0开始 hWnd = CType(i, IntPtr)
If IsWindow(hWnd) AndAlso Not IsWindowVisible(hWnd) Then className.Length =0 If GetClassName(hWnd, className, className.Capacity) <>0 Then qqclassName = className.ToString()
'采用更灵活的方式检测类名 If qqclassName.Contains("NTQQOpenSdk") OrElse qqclassName.Contains("OPENSDK") Then Dim match = Regex.Match(qqclassName, "_(\d+)$")
If match.Success Then Dim result1 As String = match.Groups(1).Value result.Add(result1)
End If End If End If End If Next Return result End FunctionEnd Class```
###需要注意的改动:
1. **类名缓冲区大小**:将`className`的缓冲区大小增加到256,以适应可能更长的窗口类名。
2. **匹配条件灵活性**:将`StartsWith`改为`Contains`,以便在类名的任何位置寻找匹配,这样即使类名前缀发生变化也能有效匹配。
3. **搜索范围调整**:考虑从0到65535的全范围,确保找到所有可能的窗口。
### 调试建议:
- 考虑在循环中添加日志输出,例如使用`Console.WriteLine(qqclassName)`来查看当前获取的类名,从而帮助确认变化。
- 如果可以,尝试获取QQ窗口的新类名,并根据实际情况调整字符串匹配的逻辑。请根据你的具体情况测试这些改动,并根据QQ新版本的实际行为进行进一步的修正。
蔡坤明 发表于 2024-10-30 18:15
在你的VB.NET代码中,似乎是根据窗口类名查找QQ窗口并提取特定信息之间出了问题。这可能是由于QQ的更新导致 ...
非常感谢大佬分享! 不客气的 {:5_116:}好好学习
页:
[1]