VB中使用postmessage无法模拟鼠标弹起

目的,我想用VB做一个小程序,能自动实现按电脑中自带 计算器 中的按键进行计算
先找计算器的句柄,然后又找到按钮的句柄,然后使用
然后计算出lp的值=y坐标*65536+x 坐标值

postmessage 按钮句柄,WM_LBUTTONDOWN,MK_LBUTTON,lp
sleep 500
postmessage 按钮句柄,WM_LBUTTONup,MK_LBUTTON,lp
再执行的时候出现了问题,我发现计算器的按钮是被按下了,但是没有弹起来,不知道是什么原因,因此没有完成一次单击操作....
而我又用VB做自己做了一个程序,上面一个按钮,然后我用刚才那段代码去按这个按钮,结果就成功了....
希望哪位大侠帮忙试一下,用postmessage 模拟单击一次 XP 自带的 计算器中的按钮,在这儿里我先谢过大家了. 如果实验正确了,我追加100分.

希望楼主能帮教我一下,如何获取其它程序中按钮的句柄!
我模拟鼠标都先声明mouse_event这个函数,这函数对系统当前鼠标没影响,很方便!
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, ByVal dwExtraInfo As Integer)
Public Const MOUSEEVENTF_LEFTDOWN = &H2 '模拟鼠标左键按下
Public Const MOUSEEVENTF_LEFTUP = &H4 '模拟鼠标左键释放
Public Const MOUSEEVENTF_MIDDLEDOWN = &H20 '模拟鼠标中间键按下
Public Const MOUSEEVENTF_MIDDLEUP = &H40 '模拟鼠标中间键释放
Public Const MOUSEEVENTF_RIGHTDOWN = &H8 '模拟鼠标右键按下
Public Const MOUSEEVENTF_RIGHTUP = &H10 '模拟鼠标右键释放
Public Const MOUSEEVENTF_MOVE = &H1 '模拟鼠标指针移动
Private Const MOUSEEVENTF_ABSOLUTE = &H8000 '决定鼠标移动时使用的是绝对坐标还是相对坐标

以上是声明所必须的!

dwFlags -------- integer,下述标志的一个组合
MOUSEEVENTF_ABSOLUTE
dx和dy指定鼠标坐标系统中的一个绝对位置。在鼠标坐标系统中,屏幕在水平和垂直方向上均匀分割成65535×65535个单元 -
MOUSEEVENTF_MOVE 移动鼠标
MOUSEEVENTF_LEFTDOWN 模拟鼠标左键按下
MOUSEEVENTF_LEFTUP 模拟鼠标左键抬起
MOUSEEVENTF_RIGHTDOWN 模拟鼠标右键按下
MOUSEEVENTF_RIGHTUP 模拟鼠标右键按下
MOUSEEVENTF_MIDDLEDOWN 模拟鼠标中键按下
MOUSEEVENTF_MIDDLEUP 模拟鼠标中键按下
dx ---integer,根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定水平方向的绝对位置或相对运动
dy ---- integer,根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定垂直方向的绝对位置或相对运动
cButtons ------integer,未使用
dwExtraInfo ----integer,通常未用的一个值。用GetMessageExtraInfo函数可取得这个值。可用的值取决于特定的驱动程序
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-10-13
模拟按键最好用键盘模拟,因为鼠标经常在用,会出错。建议你用下面语句完成你的任务。
SendMessage 按钮句柄, WM_KEYDOWN, vbKeySpace, 0&
Sleep 500
SendMessage 按钮句柄, WM_KEYUP, vbKeySpace, 0&

(Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101
)

VB中使用postmessage无法模拟鼠标弹起
MOUSEEVENTF_LEFTUP 模拟鼠标左键抬起 MOUSEEVENTF_RIGHTDOWN 模拟鼠标右键按下 MOUSEEVENTF_RIGHTUP 模拟鼠标右键按下 MOUSEEVENTF_MIDDLEDOWN 模拟鼠标中键按下 MOUSEEVENTF_MIDDLEUP 模拟鼠标中键按下 dx ---integer,根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定水平方向的绝对位置或相对运动 dy --...

vb postmessage 模拟鼠标不能执行
Private Sub Timer1_Timer()Dim a As Long, b As Long a = GetForegroundWindow'这个获得的是桌面背景的句柄,而并非你指定的窗口句柄 b = FindWindowEx(a, 0, vbNullString, "确定")'你找的是桌面上的确定按钮,肯定找不到,然后你后面所有的操作就都失败了 SetForegroundWindow a PostMessage ...

VB 模拟按键,POSTMESSAGE为什么不会弹起
Private Const WM_KEYDOWN = &H100 Private Const WM_KEYUP = &H101 '如果你是模拟键盘按键最好指出特定的按键常量,如下面的 按回车键 PostMessage hwnd, WM_KEYDOWN, VK_RETURN, 0 PostMessage hwnd, WM_KEYUP, VK_RETURN, 0 '如果你是模拟类似鼠标的点击,那就用下面的代码 PostMessage h...

这段vb代码不能实现模拟鼠标点击。请大侠帮忙看看哪里的问题_百度知 ...
既然知道鼠标位置,用这个函数直接得到句柄:Private Declare Function WindowFromPoint Lib "user32" Alias "WindowFromPoint" (ByVal xPoint As Long, ByVal yPoint As Long) As Long 用:lngP = PostMessage(lngButton_1_Hwnd, WM_LBUTTONDOWN, &H0, &H0) '按下鼠标左键 lngP = PostMessage...

用vb 做鼠标模拟,必须用postmessage,不能用mouse event
用vb 做鼠标模拟,必须用postmessage,不能用mouse event 50 全屏模式下运行的传奇世界,我想用鼠标模拟点击一下坐标235,86,然后再点击一下534,102。全局快捷键就用p.vkCode=107各路大侠,拜托了,写出代码来,我把所有分都送上。... 全屏模式下运行的传奇世界,我想用鼠标模拟点击一下坐标235, 86,然后再点击一...

VB 用SendMessage或PostMessage如何实现鼠标移动?
系统调用直接移动鼠标不是通过 WM_MOUSEMOVE WM_MOUSEMOVE 是鼠标移动以后发出的 应该用 Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long Dim x as Long Dim y as Long x = 0 y = 0 SetCursorPos x, y ...

VB向已知窗口句柄的窗口postmessage失败了,为什么的??
PostMessage实际上最终是调用的win32k.sys里的NtUserPostMessage,一般的游戏不会让你轻易地模拟按键,都HOOK了NtUserPostMessage这个函数(Shadow SSDT HOOK),会对函数参数进行过滤,防止你模拟按键,除非你恢复它的钩子(HOOK),否则是不行的。另外,如果要恢复ShadowSSDT HOOK,用VB是行不通的(大多数...

VB postmessage 鼠标单击位置
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long '这个是设置鼠标的位置!Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) '延时 Const MOUSEEVENTF_LEFTDOWN = &H2 '模拟鼠标左键按下消息 Const MOUSEEVENTF_LE...

这段vb代码为什么不能实现模拟鼠标点击
要换算为窗口里面的坐标,使用全屏坐标点击的位置可能出界了。

VB中如何虚拟按下鼠标左键
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Dim anctlejiang As Long '这句写到通用里 Private Sub Command1_Click()PostMessage 65674, 100, 17, 0 '这个是按下CTLE键 anctlejiang = 1 Sleep 1000 '延迟1秒 PostMessage 65674, 101, 17, 0 '弹起CTLE键 a...

相似回答
大家正在搜