如何获取MSN的发送按钮和消息框的句柄?

解决方案 »

  1.   

    QQ尾巴病毒的发送原理分析 
     
    近来QQ尾巴病毒大肆发作,我也是经常收到网友们发到来的带尾巴的消息,于是,好奇心一来,我也来研究研究此病毒的发作原理。首先,我不知道QQ尾巴病毒真正的原理,我只是猜测并且自己写了一个类似的程序来实现它。 
    QQ尾巴的发作情况:当用户打开一个QQ消息发送窗口时,病毒会自动往消息文本框里输入文本,然后不等用户反应过来就发出去了。 程序实现:首先要找到QQ消息发送窗口的句柄以及消息文本框与“发送”按钮的窗口句柄。 一、 如何找到QQ消息发送窗口句柄: QQ消息发送窗口有两种,一种是消息模式,在这种情况下,窗口标题含有“发送消息”字样;一种是聊天模式,窗口标题含有“聊天中”字样; 通过枚举窗口就可找到相应的句柄: // 取得QQ的发送消息窗口 function GetQQWnd: HWND; var hCurrentWindow: HWnd; WndText:String; begin hCurrentWindow := GetWindow(Application.Handle, GW_HWNDFIRST); while hCurrentWindow <> 0 do begin WndText:=GetWndText(hCurrentWindow); if (Pos('聊天中',WndText)>0) or (Pos('发送消息',WndText)>0) then begin Result:=hCurrentWindow; Exit; end; hCurrentWindow := GetWindow(hCurrentWindow, GW_HWNDNEXT); end; Result:=0; end; 二、 如何找到“发送”按钮窗口句柄: 找到了QQ的发送消息窗口后,就可以进一步查找“发送”按钮句柄了,如窗口句柄为qqWnd,则可以用一个循环,查找文本中含有“发送”字样的窗口,经过试验发现,“发送”按钮恰恰是窗体的第一个子窗口,这样,可以用 btnWnd:=GetDlgItem(qqWnd,1); // 发送按钮 来获得“发送”按钮的句柄。 三、 如何找到消息文本框窗口句柄: 消息文本框并不好找,不过你可以先在消息文本框中输入几个字母,如“abcd”,这样我们就可以用上述方法来查找了,不过通过实验后,发现消息文本框并不是QQ窗口的直接子窗口,而是其中一个子窗口的子窗口,通过实验,可以用 txtWnd:=GetWindow(GetDlgItem(qqWnd,0),GW_CHILD); // 文本框 来获得。 四、 如何获得原消息文本框的文本: 要获取原消息文本框的文本,只需要一个API函数就行了,如下: // 获得窗口文本 function GetWndText(hWnd: HWND): String; Var Ret:LongInt; mText:PChar; Buf:Integer; begin Ret:=SendMessage(hWnd,WM_GETTEXTLENGTH,0,0)+1; GetMem(mText,Ret); try Buf:=LongInt(mText); SendMessage(hWnd,WM_GETTEXT,Ret,Buf); Result:=StrPas(mText); finally FreeMem(mText,Ret); end; end; 五、 如何住原消息文本框里追加文本: 与取文本相反 // 发送文本到窗口 procedure SetWndText(hWnd: HWND; Text: String); Var Ret:LongInt; mText:PChar; Buf:Integer; begin GetMem(mText,Length(Text)); StrCopy(mText,PChar(Text)); try Buf:=LongInt(mText); SendMessage(hWnd,WM_SETTEXT,0,Buf); finally FreeMem(mText,Length(Text)); end; end; 六、 如果让“发送”按钮自动点击: 一切都准备好了,现在要开始发送了,为了让消息自动发送,我们可以模拟“发送”按钮被点击了。 SendMessage(btnWnd,WM_LBUTTONDOWN,MK_LBUTTON,0); SendMessage(btnWnd,WM_LBUTTONUP,0,0); 通过模拟一个鼠标在“开始”按钮上的按下与放开,就实现了点击发送功能。
      

  2.   

    正如培培所说
    msn窗口中的控件都是轻量级的,没有hwnd你可以用spy工具看看
    至于qq,你可以试试tWnd = FindWindow("#32770", vbNullString) 
    cWnd = FindWindowEx(tWnd, 0&, "Button", vbNullString)
    SendMessage tWnd, WM_COMMAND, cWnd, ByVal 0&
      

  3.   

    下面的代码无效啊,找不到
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Dim aWnd As Long: Dim bWnd As Long: Dim cWnd As Long: Dim txtWnd As Long
    Private Sub Form_Load()
    aWnd = FindWindow(vbnullstring, Trim(txtName.Text) + " - 对话")
    MsgBox FindWindowEx(aWnd, 0&, "Button", vbNullString)
    End
    End Sub另外SPY++怎么查啊?
      

  4.   

    打开spy++,单击工具栏中的第5个图标,然后拖动那个像瞄准器似的东西到你要获得句柄的窗口上就可以了。
    往MSN的窗口上拖时会发现只有整个窗口有句柄。   :(
      

  5.   

    我这里有一个简化版的spy
    很方便的
      

  6.   

    ' 这是一个模块单击开始按钮的例子。Option ExplicitPrivate Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPrivate Const BM_CLICK = &HF5Private Sub Command1_Click()
        Dim hStartButton As Long
        Dim hTaskBar As Long
        hTaskBar = FindWindow("Shell_TrayWnd", vbNullString)
        hStartButton = FindWindowEx(hTaskBar, 0&, "Button", "开始")
        SendMessage hStartButton, BM_CLICK, 0, 0
    End Sub
      

  7.   

    我做过一个软件叫“窗口间谍”,是个简化版的spy,但是中文的,呵呵。
      

  8.   

    TO goodname008(卢培培,充电中......) 
    用你的那个软件获取的效果和SPY++一样,但是仍然没有获取到我要的
      

  9.   

    肯定一样,因为原理是一样的。微软把整个窗口做成了一个组件,所以消息是由整个窗口接收的。
    你用spy++监视一下整个窗口,就会发现在文本框中打字时窗口会依次收到WM_KEYDOWN、WM_CHAR和WM_KEYUP消息。
    所以你可以直接向窗口发送以上三个消息,VK_RETURN自然就是回车了。
      

  10.   

    那如何取得发送按钮的位置坐标?什么API
      

  11.   

    除了hzhd2000(星空)的方法,还有没有其他的
      

  12.   

    1.学 goodname008(卢培培,充电中......) 所说,向该窗口发消息
    2.模拟键盘Alt+S
      

  13.   

    不行的,没有发送按钮时不能用ALT+S
      

  14.   

    也许参考一下msn messenger的sdk会有收获
      

  15.   

    使用QQ当然就要使用到网络,网络中的联系都是由封包的发送和接受来实现的,也就是说你使用QQ发送一条信息的时候,网络就会发送一个封包给服务器,如果你能够在任何时候截获到这个封包,然后修改它,就可以神不知,鬼不觉的发送QQ尾巴了,而且别人也不知道他所发送的消息已经被修改过了,呵呵,我觉得QQ尾巴是这样来实现的
      

  16.   

    建议参考一下 msn 的 SDK,我记得网上有论坛专门讨论msn开发的。
      

  17.   

    做个指定HANDLE窗口的消息的snipper?
      

  18.   

    CSDN上不是有MSN群发器的源代码吗?
    找到了下载学习一下就应该会了。交流MSN:[email protected]