如何编程发送消息到另外一个程序。
举例说明一下。
有一个程序需要点击他的一个的按钮后会弹出一个对话框。
我如何用编程的方法,并且不需要移动我的鼠标在这个程序上单击,
仅仅是靠发送消息来达到我的目的呢?
我自己试编了一个程序,但是不成功。程序如下: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
举例说明一下。
有一个程序需要点击他的一个的按钮后会弹出一个对话框。
我如何用编程的方法,并且不需要移动我的鼠标在这个程序上单击,
仅仅是靠发送消息来达到我的目的呢?
我自己试编了一个程序,但是不成功。程序如下: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
http://tech.sina.com.cn/c/2001-12-26/8120.html
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即可。
我发送的这个消息是一个程序的某个区域
这个区域是没有HWND可言的。
这才是难点所在。
比如说我想在一个FORM的中间的地方单击鼠标。但这个地方是没有句柄可言的。
并且只是靠编程的方法实现,不能移动我的鼠标去点击
也不是编程MOVE鼠标去点击。
我的鼠标就跟这个FORM没关系
我的鼠标可以做任何事情。
但那个程序的那个区域还是可以收到我鼠标单击的消息并且执行
有希望编得出来吗?
好像很有点难度。
但是我的那个地方没有HWND。
只是某个区域。
那该怎么做呢?
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
没有HWND可言的。
我应该怎么通过发送鼠标点击的消息给这个无HWND的小人呢?
还有这个程序蔽屏了MOUSE事件。
mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
像这种MOUSE事件对这个程序无效。
BM_CLICK有效.
但是怎么发送到这个小人上呢??
说的用全局钩子我没听明白是什么意思?
我不是要捕捉消息.
是要发送消息..
我想发送消息给这个小人.
用鼠标全局钩子能做到??
我不太明白?
钩子只能HOOK到你发送给程序的消息..
但是好像不能发送消息给程序吧..
而且不是发送消息给一个按钮.
是一个程序上的某一区域.
这区域没HWND可言.
麻烦你能请清楚点吗?
能帮我解决这个问题我愿意付钱.
100元左右..
是真的.
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
新建一个窗体,窗体上加一个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
你要点的按钮.SetFocus'使按钮得到焦点
SendKeys "{ENTER}"'按钮上模拟键盘按回车键打完收工 ~写的比较简单.不知道和不和你用~~呵呵
比如你要点击一个窗体的x=645,y=600(此坐标是Form_MouseMove直接得到的坐标)的位置,此时你知道窗体的Hwnd则可以:
SendMessage Hwnd, WM_LBUTTONDOWN, MK_LBUTTON,byval 2621483
试了: XunBaian(蓝水晶的方法后才发现不是图片框。
还是不行。
随便举一个。
俄罗斯方块都玩过吧。
假如说我要得到它掉下来的方块的HWND
或者给某个掉下来的方块发送什么消息啊的
那不是肯定不行的了。。
应该是有办法的。
将要用鼠标控制的窗体带到最前端
Setcursorpos设置鼠标位置再mouse_event
作者:佚名
设计思路:
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
我以前也是为了这个工具条上的小人动过不少脑筋,可是就是得不到小人的句柄~~找去找来,只有一个主窗体的句柄32770,在这个窗体上查找子控件竟然没有~,唉~~~最后还是放弃了,呵呵~用鼠标点到是可以的,最后为了美圆而努力吧~~~要是有什么好办法告诉我一声~~!!!