vb能不能获取QQ2011的聊天窗口句柄
答案:5 悬赏:10
解决时间 2021-04-21 17:17
- 提问者网友:生亦何欢
- 2021-04-21 00:22
我要做的就是 向QQ2011聊天窗口发送文本 或者模拟按键(后台,不要SendKeys) SendMessage ,Postmessage都行
我记得好像有一个QQ群发器就做到了,向每个QQ窗口发送消息。
好像是要写内存,如果vb不行,那有那种编程语音可以。
最佳答案
- 二级知识专家网友:留下所有热言
- 2021-04-21 01:15
嘿嘿`` 这种程序你想用VB写?真是自讨苦吃~~ 还是用C++吧:)
获取QQ窗口句柄可以调用API函数FindWindow来枚举窗口、原型如下:
HWND FindWindow(LPCSTR lpClassName, // 这里是窗口类名
LPCSTR lpWindowName); // 这里是窗口标题
如果函数执行成功,就返回HWND类型的窗口句柄。
你需要先用Spy++或者是Spy4Win之类的工具获取QQ聊天窗口的窗口类,然后调用FindWindow,把窗口类名赋值给pClassName参数;鉴于QQ聊天窗口的标题不是固定的,所以给lpWindowName参数传入空值NULL即可。然后函数的返回值就是聊天窗口的句柄了。
至于下一个问题——模拟按键、我推荐你用PostMessage而不是SendMessage。原因很简单,前者是异步,后者是同步的。如果用SendMessage,执行完之后才会返回调用代码。PostMessage效率更高。
还有一点需要注意,因为我没亲自实验、说的只是思路而已。
腾讯的程序员也不是白痴,很有可能对聊天窗口做了特殊处理,比如Hook了FindWindow函数,就得不到窗口句柄了。但也可也用Native API~ 总之要灵活应变。祝你好运!
获取QQ窗口句柄可以调用API函数FindWindow来枚举窗口、原型如下:
HWND FindWindow(LPCSTR lpClassName, // 这里是窗口类名
LPCSTR lpWindowName); // 这里是窗口标题
如果函数执行成功,就返回HWND类型的窗口句柄。
你需要先用Spy++或者是Spy4Win之类的工具获取QQ聊天窗口的窗口类,然后调用FindWindow,把窗口类名赋值给pClassName参数;鉴于QQ聊天窗口的标题不是固定的,所以给lpWindowName参数传入空值NULL即可。然后函数的返回值就是聊天窗口的句柄了。
至于下一个问题——模拟按键、我推荐你用PostMessage而不是SendMessage。原因很简单,前者是异步,后者是同步的。如果用SendMessage,执行完之后才会返回调用代码。PostMessage效率更高。
还有一点需要注意,因为我没亲自实验、说的只是思路而已。
腾讯的程序员也不是白痴,很有可能对聊天窗口做了特殊处理,比如Hook了FindWindow函数,就得不到窗口句柄了。但也可也用Native API~ 总之要灵活应变。祝你好运!
全部回答
- 1楼网友:啵啵桃汀
- 2021-04-21 06:06
C++肯定可以
- 2楼网友:甜野猫
- 2021-04-21 04:58
LS俩SB,难道VB不能用API么?只是获取QQ窗体的句柄谁都可以,但是要枚举该窗体上控件的句柄就难了。目前Spy++无法获取QQ聊天窗口的输入框的句柄,好像那些控件是GDI+的。。。
- 3楼网友:萌萌哒小可爱
- 2021-04-21 03:18
腾讯可能用HOOK了。。。 用spy++都获取不了聊天窗口句柄,发送文本那更是。。。。。
- 4楼网友:邪性洒脱
- 2021-04-21 02:21
我也在写轰炸机....通过网页调临时聊天窗口 然后SENDKEY ...感觉有点不给力
vb 调用API可以获取QQ聊天窗口的句柄...只不过句柄是昵称 如果改了备注的话就是备注...
'------------------窗口置顶部分声明
Option Explicit
Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
'------------------窗口置顶部分声明结束
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function GetWindowText Lib "user32" _
Alias "GetWindowTextA" (ByVal hwnd As Long, _
ByVal lpString As String, ByVal cch As Long) As Long
Private Sub Form_Load()
Timer1.Interval = 100
Label1.AutoSize = True
SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE '置顶
End Sub
Private Sub Timer1_Timer()
Static CurrentHwnd As Long
Dim ForegroundWindowHwnd As Long
Dim sText As String * 255
ForegroundWindowHwnd = GetForegroundWindow
If ForegroundWindowHwnd = CurrentHwnd Then Exit Sub
CurrentHwnd = ForegroundWindowHwnd
If CurrentHwnd <> hwnd Then
Label1.Caption = Left$(sText, GetWindowText(CurrentHwnd, sText, 255))
Else
Label1.Caption = Form1.Caption
End If
End Sub
上面的代码是 把句柄显示在Lable1上..感觉不把QQ号跟 昵称一一对应的话也没什么用...如果能通过程序把好友的QQ号跟昵称建立一个数据库的话那样写起来就简单多了.....
以前QQ版本的句柄是 ***与***交谈中 通过语句判断的话还是很好写的
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯