找到QQ发送框的句柄,然后用Sendmessage发送消息

解决方案 »

  1.   

    用下面的API 及函数可以实现你的要求:
    findwindow
    findwindowex
    sendmessage
                -------- 以上 API 用于查找QQ窗口句柄并可发消息给它
    bringwindowtotop
    setforegroundwindow
                -------- 用于击活QQ窗口便于下面SENDKEYS函数工作 ^-^ 
    sendkeys "%S"
                -------- 模拟按键,让QQ自动发消息。
      

  2.   

    谢谢各位,但我不知道怎么获得QQ下面的那个TEXTBOX的句柄。还有类名是什么回事搞不清,不知道要看哪些书才知道。
      

  3.   

    我知道需要你发一封到我的信箱。
    [email protected]
      

  4.   

    用findwindowex函数,把父窗口句柄设为,用findwindow函数找到的,classname用"EDIT"
      

  5.   

    '一个窗体,一个timer,一个textbox,一个菜单,两个子菜单项
    '用Ctrl+鼠标右键弹出菜单,
    '全部源代码如下
    Option ExplicitPrivate Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As IntegerPrivate Sub addtxt_Click()
    SendKeys Text1.Text
    SendKeys " ^{ENTER}"
    End SubPrivate Sub mnuExit_Click()
    Unload Me
    End SubPrivate Sub Timer1_Timer()
    If GetAsyncKeyState(17) And GetAsyncKeyState(2) Then
        PopupMenu aaa
    End If
    End Sub
      

  6.   

    在QQ的发送对话框里按Ctrl+右键
      

  7.   

    楼上错的太多,
    SendKeys Text1.Text是什么呀?
    PopupMenu aaa又是什么?
      

  8.   

    本人也觉得wjq(b_wind)的有道理,但是classname设为edit好象不对,查不出。
    我现在就是不知道类名是怎么一回事,不知道我要找的QQ对话框中的类名是
    什么,要知道我想可以用findwindowex函数得到句柄。
      

  9.   

    ''''''''''''''''''
    完全代码:需要一个command1,2个textbox(text1,text2),1个Timer1
    '''''''''''''''''''Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    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 SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    Private Const EM_GETLINECOUNT = &HBA
    Private Const WM_GETTEXT = &HD
    Private Const WM_SETTEXT = &HC
    Private Const WM_GETTEXTLENGTH = &HE
    Dim hd As Long, chd As Long
    Private Sub Command1_Click()
    Dim tt$
    BringWindowToTop hd
    SetForegroundWindow hd
    tt = Text1.Text
    SendMessage chd, WM_SETTEXT, 0, ByVal tt
    SendKeys "%S"
    End SubPrivate Sub Timer1_Timer()
    hd = FindWindow(vbNullString, "发送消息")
    If hd <> 0 Then
    chd = FindWindowEx(hd, 0, "EDIT", vbNullString)
    If SendMessage(chd, EM_GETLINECOUNT, 0, 0) <> 0 Then Me.Caption = "QQ SendBox hWnd = " & CStr(chd)
    Text1.Enabled = True: Command1.Enabled = True
    Text2.Text = GetText(chd)
    Else
    Me.Caption = "Can't find QQ SendBox"
    Text1.Enabled = False: Command1.Enabled = False
    Text2.Text = ""
    End If
    End Sub
    Public Function GetText(ByVal hWndNow As Long) As String '获取文本的子程序
    On Error Resume Next
    Dim bArr() As Byte, bArr2() As Byte
    hLength = SendMessage(hWndNow, WM_GETTEXTLENGTH, 0, 0)
    If hLength > 0 Then
    ReDim bArr(hLength + 1) As Byte, bArr2(hLength - 1) As Byte
    Call CopyMemory(bArr(0), hLength, 2)
    Call SendMessage(hWndNow, WM_GETTEXT, hLength + 1, bArr(0))
    Call CopyMemory(bArr2(0), bArr(0), hLength)
    GetText = StrConv(bArr2, vbUnicode)
    Else
    GetText = ""
    End If
    End Function
      

  10.   

    回复人: Do_Better(程序人生) (2001-12-31 0:22:59)  得0分 
    楼上错的太多,
    SendKeys Text1.Text是什么呀?
    PopupMenu aaa又是什么?  
    你可以自己猜啊,
    你说的都不是错误啊。
    我只是用最简单的方法做一个程序,
    虽然不是很好用。
    但是我调试好了。
      

  11.   

    受益非浅。顺便请教一下,学api,看什么书好?