如何编程发送消息到另外一个程序。
举例说明一下。
有一个程序需要点击他的一个的按钮后会弹出一个对话框。
我如何用编程的方法,并且不需要移动我的鼠标在这个程序上单击,
仅仅是靠发送消息来达到我的目的呢?
我自己试编了一个程序,但是不成功。程序如下:SendMessage HWND, WM_MOUSEMOVE, 0, 0
SendMessage HWND, WM_MOUSEACTIVATE, HWND, 33619970(WM_LMOUSEDOWN)
SendMessage HWND, WM_SETCURSOR, HWND, 33619970
SendMessage HWND, WM_SETCURSOR, HWND, 33554434(WM_MOUSEMOVE)
SendMessage HWND, WM_SETCURSOR, HWND, 33685505
SendMessage HWND, WM_NCLBUTTONDOWN, HWND, 10092692
SendMessage HWND, WM_SETCURSOR, HWND, 33619970
'SendMessage HWND, WM_NCLBUTTONDOWN, HWND, 2490674SendMessage HWND, WM_LBUTTONUP, HWND, 2490674

解决方案 »

  1.   

    用Sendkeys函数!具体用法请参照:
    http://tech.sina.com.cn/c/2001-12-26/8120.html
      

  2.   

    Option Explicit
    Private Const BM_CLICK = &HF5
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Sub Command1_Click()
    MsgBox "点击了Command1"
    End SubPrivate Sub Command2_Click()
        Call SendMessage(Command1.hwnd, BM_CLICK, 0, 0)
    End Sub如果想要点击其他程序的按钮,将Command2_Click事件中的Command1.hwnd换成想要点击按钮的hwnd即可。
      

  3.   

    不懂,可不可以说一声,用winscok控件
      

  4.   

    我好像没有完全说清楚我的问题所在。
    我发送的这个消息是一个程序的某个区域
    这个区域是没有HWND可言的。
    这才是难点所在。
    比如说我想在一个FORM的中间的地方单击鼠标。但这个地方是没有句柄可言的。
    并且只是靠编程的方法实现,不能移动我的鼠标去点击
    也不是编程MOVE鼠标去点击。
    我的鼠标就跟这个FORM没关系
    我的鼠标可以做任何事情。
    但那个程序的那个区域还是可以收到我鼠标单击的消息并且执行
    有希望编得出来吗?
    好像很有点难度。
      

  5.   

    加班的老人的方法我知道。。
    但是我的那个地方没有HWND。
    只是某个区域。
    那该怎么做呢?
      

  6.   

    是一个什么小人的软件啊?没太明白但它绝对是可以接收某个消息的。比如说MOUSEUP或者MOUSEDOWN,不然怎么处理一些WINDOWS的消息,比如说鼠标点击,总归是消息控制的。
      

  7.   

    用鼠标全局钩子很容易啊,收到鼠标点击的消自后即对该按钮发消息即可。
    SetWindowsHookEx
    CallNextHookEx
    UnhookWindowsHookExHOOK用法实例如下:标准模块:
    Option Explicit
    Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, _
                                                                                     ByVal lpfn As Long, _
                                                                                     ByVal hmod As Long, _
                                                                                     ByVal dwThreadId As Long) As Long'idHook代表是何种Hook,有以下几种
    Public Const WH_CALLWNDPROC = 4
    Public Const WH_CALLWNDPROCRET = 12
    Public Const WH_CBT = 5
    Public Const WH_DEBUG = 9
    Public Const WH_FOREGROUNDIDLE = 11
    Public Const WH_GETMESSAGE = 3
    Public Const WH_HARDWARE = 8
    Public Const WH_JOURNALPLAYBACK = 1
    Public Const WH_JOURNALRECORD = 0
    Public Const WH_KEYBOARD = 2
    Public Const WH_MOUSE = 7
    Public Const WH_MSGFILTER = (-1)
    Public Const WH_SHELL = 10
    Public Const WH_SYSMSGFILTER = 6
    Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _
                                                          ByVal ncode As Long, _
                                                          ByVal wParam As Long, _
                                                          lParam As Any) As LongPublic Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
     
    Public hHook As Long
     
     Public Sub UnHookKBD()
       ' If hnexthookproc <> 0 Then
           UnhookWindowsHookEx hHook
           hHook = 0
       ' End If
     End Sub Public Function EnableKBDHook()
       If hHook <> 0 Then
          Exit Function
       End If
       
       hHook = SetWindowsHookEx(WH_MOUSE, _
                                 AddressOf MyKBHFunc, _
                                 App.hInstance, _
                                 App.ThreadID)
     End Function Public Function MyKBHFunc(ByVal iCode As Long, _
                               ByVal wParam As Long, _
                               ByVal lParam As Long) As Long
       MyKBHFunc = 0 '表示要处理这个讯息   
       Debug.Print "iCode=" & iCode, "wParam=" & wParam & " " & Chr(wParam), "lParam=" & lParam
       
       Call CallNextHookEx(hHook, iCode, wParam, lParam) '传给下一个Hook
       
     End Function
    窗体:
    Option ExplicitPrivate Sub Command1_Click()
       EnableKBDHook
    End SubPrivate Sub Form_Load()
       EnableKBDHook
    End SubPrivate Sub Form_Unload(Cancel As Integer)
       UnHookKBD
    End Sub
      

  8.   

    这个小人只是一个图片。
    没有HWND可言的。
    我应该怎么通过发送鼠标点击的消息给这个无HWND的小人呢?
    还有这个程序蔽屏了MOUSE事件。
    mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
    像这种MOUSE事件对这个程序无效。
    BM_CLICK有效.
    但是怎么发送到这个小人上呢??
      

  9.   

    XunBaian(蓝水晶) 
    说的用全局钩子我没听明白是什么意思?
    我不是要捕捉消息.
    是要发送消息..
    我想发送消息给这个小人.
    用鼠标全局钩子能做到??
    我不太明白?
    钩子只能HOOK到你发送给程序的消息..
    但是好像不能发送消息给程序吧..
    而且不是发送消息给一个按钮.
    是一个程序上的某一区域.
    这区域没HWND可言.
    麻烦你能请清楚点吗?
    能帮我解决这个问题我愿意付钱.
    100元左右..
    是真的.
      

  10.   

    我也没什么好方法,但取得鼠标位置图像的句柄倒是不难:
    Private Type POINTAPI
       x As Long
       y As Long
    End TypePrivate Declare Function WindowFromPointXY Lib "user32" Alias "WindowFromPoint" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Dim pt As POINTAPI
    Dim hWnd As Long
    Call GetCursorPos(pt)
    hWnd = WindowFromPointXY(pt.x, pt.y)
    MsgBox "鼠标位置的句柄为:" & hWnd
      

  11.   

    做了一个取得任何程序鼠标位置控件的hWnd的实例,你参考一下吧,也许能帮到你:
    新建一个窗体,窗体上加一个Picture1和一个Command1
    在Picture1上按下鼠标,拖到屏幕的任何位置,在窗体的标题栏将显示鼠标当前位置控件的hWndOption ExplicitPrivate Declare Function SetCapture Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function ReleaseCapture Lib "user32" () As Long
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Private Declare Function WindowFromPointXY Lib "user32" Alias "WindowFromPoint" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
    Private Type POINTAPI
       x As Long
       y As Long
    End TypePrivate m_hWnd As Long
    Private m_Picking As BooleanPrivate Sub Command1_Click()
       If m_hWnd Then
          Clipboard.Clear
          Clipboard.SetText "Hello from VB5!", vbCFText
          Call SetForegroundWindow(m_hWnd)
          SendKeys "^v", True
       End If
    End SubPrivate Sub Form_Load()
       Picture1.Picture = Picture1.DragIcon
       Me.MouseIcon = Picture1.DragIcon
    End SubPrivate Sub Picture1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
       Me.MousePointer = vbCustom
       Set Picture1.Picture = Nothing
       m_Picking = True
       Call SetCapture(Picture1.hwnd)
    End SubPrivate Sub Picture1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
       Static pt As POINTAPI
       Static hwnd As Long
       If m_Picking Then
          Call GetCursorPos(pt)
          hwnd = WindowFromPointXY(pt.x, pt.y)
          If hwnd <> m_hWnd Then
             m_hWnd = hwnd
             Me.Caption = Hex(m_hWnd)
          End If
       End If
    End SubPrivate Sub Picture1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
       m_Picking = False
       Picture1.Picture = Picture1.DragIcon
       Me.MousePointer = vbDefault
       Call ReleaseCapture
       MsgBox "You picked hWnd: " & Hex(m_hWnd)
    End Sub
      

  12.   

    如果你是使用winsock控件的话,你可以在winsock控件的DataArrival事件里,加入 
    你要点的按钮.SetFocus'使按钮得到焦点
    SendKeys "{ENTER}"'按钮上模拟键盘按回车键打完收工 ~写的比较简单.不知道和不和你用~~呵呵
      

  13.   

    楼主,如果你是要点击一个窗体的某个位置,有窗体的句柄那就很简单。
    比如你要点击一个窗体的x=645,y=600(此坐标是Form_MouseMove直接得到的坐标)的位置,此时你知道窗体的Hwnd则可以:
    SendMessage Hwnd, WM_LBUTTONDOWN, MK_LBUTTON,byval 2621483
      

  14.   

    我晕。。
    试了: XunBaian(蓝水晶的方法后才发现不是图片框。
    还是不行。
      

  15.   

    我上面的代码可以取得屏幕上任何应用程序中的任何重级(Label,Image为轻级)控件的hWnd如果无法取得“小人”的hWnd,我看你只有死心了!  :(
      

  16.   

    : rainivy(Rain) 的方法也不行。
      

  17.   

    我举个例子好吗?
    随便举一个。
    俄罗斯方块都玩过吧。
    假如说我要得到它掉下来的方块的HWND
    或者给某个掉下来的方块发送什么消息啊的
    那不是肯定不行的了。。
    应该是有办法的。
      

  18.   

    还有,用keybd_event函数可以模拟键盘的操作!用mouse_event可以模拟鼠标的操作!用GetCursorPos可以得到鼠标的当前坐标
      

  19.   

    呵呵,发送WM_NCLBUTTONDOWN和WM_LBUTTONUP消息即可需要注意的就是:对应消息的lparam参数(自己看msdn)及坐标的转换(用ClientToScreen和ScreenToClient这两个函数)
      

  20.   

    //呵呵,发送WM_NCLBUTTONDOWN和WM_LBUTTONUP消息即可汗。应为WM_LBUTTONDOWN和WM_LBUTTONUP
      

  21.   

    郁闷,你可以先
    将要用鼠标控制的窗体带到最前端
    Setcursorpos设置鼠标位置再mouse_event
      

  22.   

    QQ 尾巴演示代码 
     
    作者:佚名 
    设计思路:
    1》找到当前用户正在运行的窗口中发送QQ消息的窗口
    2》自动发送设定好的消息
    3》循环控制使用
    设计代码:
    Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) 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 Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As LongPrivate Const GW_HWNDFIRST = 0
    Private Const GW_HWNDLAST = 1
    Private Const GW_HWNDNEXT = 2
    Private Const GW_HWNDPREV = 3
    Private Const GW_OWNER = 4Private Const NILL = 0&
    Private Const WM_SYSCOMMAND = &H112
    Private Const SC_CLOSE = &HF060&Function GetWin() As String
       Dim NhWnd As Long
       Dim Length, WinTitle$
       Dim OkWin As String
       
       NhWnd = GetWindow(hwnd, GW_HWNDFIRST)
       
       While NhWnd <> 0
           Length = GetWindowTextLength(NhWnd)
           WinTitle$ = Space$(Length + 1)
           Length = GetWindowText(NhWnd, WinTitle$, Length + 1)
           
           If InStr(LCase(WinTitle$), "发送消息") > 0 Or InStr(LCase(WinTitle$), "聊天中") > 0 Then
               OkWin = OkWin & "\\" & NhWnd
           End If
        
           NhWnd = GetWindow(NhWnd, GW_HWNDNEXT)
       Wend
       
       GetWin = OkWin
    End Function
    Sub SendInfo(ByVal Info As String)
       Dim OkWin, hCount
       OkWin = GetWin()
       'MsgBox OkWin
       If Len(OkWin) > 0 Then
           OkWin = Split(OkWin, "\\")
           For hCount = 0 To UBound(OkWin)
               If Len(OkWin(hCount)) > 0 Then
                   'MsgBox OkWin(hCount)
                   'MsgBox GetWinName(OkWin(hCount))
                   AppActivate GetWinName(OkWin(hCount))
                   SendKeys Info
                   SendKeys "%(s)"
               End If
           Next
       End If
    End SubFunction GetWinName(ByVal WinID As Long) As String
       If WinID < 1 Then Exit Function
       Dim Length, WinTitle$
       Length = GetWindowTextLength(WinID)
       WinTitle$ = Space$(Length + 1)
       Length = GetWindowText(WinID, WinTitle$, Length + 1)
       GetWinName = WinTitle$
    End FunctionPrivate Sub Form_Load()
       Me.Hide
       Me.Move -100, -100, 0, 0
    End SubPrivate Sub Timer1_Timer()
       Call SendInfo("/mn 你看看我的大作发表了 /ka 看看怎么样 /hx ,记得回帖哦! /mg  /wen")
    End Sub
     
      

  23.   

    呵呵~~同意  myjian(小马) 的观点~ 
        我以前也是为了这个工具条上的小人动过不少脑筋,可是就是得不到小人的句柄~~找去找来,只有一个主窗体的句柄32770,在这个窗体上查找子控件竟然没有~,唉~~~最后还是放弃了,呵呵~用鼠标点到是可以的,最后为了美圆而努力吧~~~要是有什么好办法告诉我一声~~!!!