WYF605466 发表于 2024-10-29 14:14

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

蔡坤明 发表于 2024-10-29 14:14

在你的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-11-4 10:39

蔡坤明 发表于 2024-10-30 18:15
在你的VB.NET代码中,似乎是根据窗口类名查找QQ窗口并提取特定信息之间出了问题。这可能是由于QQ的更新导致 ...

非常感谢大佬分享!

蔡坤明 发表于 2024-11-4 13:29

不客气的

蔡坤明 发表于 2024-11-25 01:15

{:5_116:}好好学习
页: [1]
查看完整版本: VB.NET怎么判断当前登录的QQ号(新版QQNT9版本)2024-9-19更新