vb中如何实现自动点击 用msgbox时弹出的对话框中的确定或取消按钮?

laozhuang 2000-11-14 05:35:00
VB高手:

我想实现自动点击用VB msgbox 函数时弹出的对话框中的确定或取消按钮。
主要目的是;
当程序运行到一个设定时刻时,启动定时器,开始计时,同时调用msgbox函数
弹出对话框,当设定的计时时间超过规定的时间时,自动点击取消按钮,
使程序继续向下执行。
...全文
5963 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
laozhuang 2000-11-16
  • 打赏
  • 举报
回复
谢谢大家!!!现在总算可以了,我按照wxj_lake提供的网站中的方法去做,一切搞定!
由于我给的分数太只有50分,所以不够,请大家见谅!各分一点,不好意思。因为在另一个
贴子中我给出了100分的分数,大家可以上另一个贴子中去抢分!
laozhuang 2000-11-16
  • 打赏
  • 举报
回复
等我试可以了一定给大家加分!我正在试wxj_lake的方法!
laozhuang 2000-11-16
  • 打赏
  • 举报
回复
谢谢大家的热心帮助!
谢谢wxj_lake!
wxj_lake 2000-11-15
  • 打赏
  • 举报
回复
察看www.archtide.com
详细地址:
http://210.75.132.33/lakes/detail.asp?id=134

定制 MessageBox 的式样
laozhuang 2000-11-15
  • 打赏
  • 举报
回复
to shyguy:
怎么做?能给我例子吗?
shyguy 2000-11-15
  • 打赏
  • 举报
回复
你可以用api做一个定时显示的messageBox窗口
laozhuang 2000-11-15
  • 打赏
  • 举报
回复
首先感谢大家的支持与帮助,但没有回答我想要的实质问题。
我想把源程序给大家看,大家直接在我的程序中进行修改,好不好?

'模块中的代码
' =======================================================================

'声明必要的 API 例程:
Public Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As Long) As Long

Public Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

Public Declare Function GetCursorPos Lib "user32" _
(lpPoint As POINTAPI) As Long

Public Declare Function SetCursorPos Lib "user32" _
(ByVal X As Long, ByVal Y As Long) As Long

Public Declare Function ClientToScreen Lib "user32" _
(ByVal hwnd As Long, lpPoint As POINTAPI) As Long

Public Declare Function GetTickCount Lib "c:\windows\system\kernel32.dll " () _
As Long

Public Declare Function GetLastActivePopup Lib "user32" _
(ByVal hwndOwnder As Long) As Long

Public Declare Function GetActiveWindow Lib "user32" () As Long

Public Declare Function GetDlgCtrlID Lib "user32" _
(ByVal hwnd As Long) As Long

Public Declare Function GetFocus Lib "user32" () As Long

Public Declare Function GetNextDlgGroupItem Lib "user32" _
(ByVal hDlg As Long, ByVal hCtl As Long, ByVal bPrevious As Long) As Long

Public Declare Function GetNextDlgTabItem Lib "user32" _
(ByVal hDlg As Long, ByVal hCtl As Long, ByVal bPrevious As Long) As Long


Public Const WM_USER = 1024
Public Const END_H10 = &H10

'/*********************************************************************/
Public Type POINTAPI
X As Long
Y As Long
End Type

Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public ButtonPos As POINTAPI



'窗体中的代码
Dim l_Autoclick_Begin As Variant
Private Const EMPTY_TIME = "0:00:00"
Private Sub Command1_Click()
Dim lRt_msg As VbMsgBoxResult
l_Autoclick_Begin = EMPTY_TIME
l_Autoclick_Begin = Format(Now(), "yyyy-mm-dd hh:mm:ss")
Label2.Caption = l_Autoclick_Begin

'如果按下了按钮,则不再进行计时监测
Timer1.Enabled = True

'动态显示时间
Timer2.Enabled = True

DoEvents
'不知为何,在msgbox 对话框弹出的时候,label2上的时钟就不走了
'因为整个应用程序都被挂起来了,只有等msgbox 的按钮被按下后,应用程序才继续
'往下走-------这该如何解决呢????
lRt_msg = MsgBox("时间是否超过了设定时间?", vbOKCancel + vbExclamation + vbDefaultButton2, _
"警告信息")

'如果按下了按钮,则不再进行计时监测
Timer1.Enabled = False

'主要是为了得到返回值,根据返回值是vbok或vbcancel 进行相应处理
DoEvents
If lRt_msg = vbOK Then
MsgBox "进行处理!"
Else
If lRt_msg = vbCancel Then
MsgBox "取消处理!"
End If
End If
End Sub

Private Sub Form_Load()

Dim tmp As Long

With Command1
ButtonPos.X = (.Left + .Width / 2) / Screen.TwipsPerPixelX
ButtonPos.Y = (.Top + .Height / 2) / Screen.TwipsPerPixelY
End With
tmp = ClientToScreen(Me.hwnd, ButtonPos)
Label4.Caption = Format(Now, "yyyy-mm-dd hh:mm:ss")
End Sub
Private Sub mnuClickButton_Click()
'以下是对已知窗体和已知按钮控件的句柄进行自动电击
Const MoveStep As Integer = 50
Dim CursorPos As POINTAPI
Dim DistX As Double, DistY As Double
Dim tmp As Long
Dim i As Integer
Dim PosX As Integer, PosY As Integer
Dim TickCount As Long
tmp = GetCursorPos(CursorPos)
DistX = ButtonPos.X - CursorPos.X
DistY = ButtonPos.Y - CursorPos.Y
For i = 1 To MoveStep
PosX = CursorPos.X + DistX * i / MoveStep
PosY = CursorPos.Y + DistY * i / MoveStep
tmp = SetCursorPos(PosX, PosY)
Next i
tmp = SendMessage(Command1.hwnd, WM_LBUTTONDOWN, 0, 0)
TickCount = GetTickCount()
While GetTickCount() - TickCount < 200
tmp = DoEvents()
Wend
tmp = SendMessage(Command1.hwnd, WM_LBUTTONUP, 0, 0)
End Sub

'/*********************************************************************/

Private Sub Timer1_Timer()
Const MoveStep As Integer = 50
Dim lhwnd As Long
Dim lhwnd2 As Long
Dim tmp As Long
Dim TickCount As Long
Dim CursorPos As POINTAPI
Dim DistX As Double, DistY As Double
Dim i As Integer
Dim PosX As Integer, PosY As Integer


Timer1.Enabled = False

If (Abs(DateDiff("s", l_Autoclick_Begin, Now()) > 60)) Then

'下面这一句是为了得到msgbox对话框的句柄
lhwnd = GetActiveWindow()
'lhwnd = GetLastActivePopup(0)
'下面这一句是为了得到msgbox对话框中默认的vbcancel按钮的句柄
lhwnd2 = GetFocus()

'获得msgbox对话框中的取消按钮在屏幕中的位置????怎么获得???
'以下好象是错的
' ButtonPos.X = (lhwnd2.Left + lhwnd2.Width / 2) / Screen.TwipsPerPixelX
' ButtonPos.Y = (lhwnd2.Top + lhwnd2.Height / 2) / Screen.TwipsPerPixelY
' tmp = ClientToScreen(lhwnd, ButtonPos)

'鼠标移动到msgbox对话框中的取消按钮在屏幕中的位置
' tmp = GetCursorPos(CursorPos)
' DistX = ButtonPos.X - CursorPos.X
' DistY = ButtonPos.Y - CursorPos.Y
' For i = 1 To MoveStep
' PosX = CursorPos.X + DistX * i / MoveStep
' PosY = CursorPos.Y + DistY * i / MoveStep
' tmp = SetCursorPos(PosX, PosY)
' Next i

'下面这一句发送鼠标左键按下命令down
tmp = SendMessage(lhwnd2, WM_LBUTTONDOWN, 0, 0)
TickCount = GetTickCount()
While GetTickCount() - TickCount < 200
tmp = DoEvents()
Wend
'下面这一句发送鼠标左键弹起命令up
tmp = SendMessage(lhwnd2, WM_LBUTTONUP, 0, 0)

End If
End Sub

Private Sub Timer2_Timer()
Label4.Caption = Format(Now, "yyyy-mm-dd hh:mm:ss")
End Sub
laozhuang 2000-11-15
  • 打赏
  • 举报
回复
首先感谢大家的支持与帮助,但没有回答我想要的实质问题。
我想把源程序给大家看,大家直接在我的工程中进行修改,好不好?
请把email:给我,我发给你们!
To happyherro:
你误解了我的意思。
To wxj_lake:
我也知道用这两个函数,先获得msgbox对话框的句柄,再用SendMessage发送关闭命令.
但是,如何获得按钮的句柄?请给我一个程序例子,好吗?先谢谢了!!!
请给我发email:fj9lihu@sina.com
To Nicrosoft :
能给我发一个例子吗?谢谢!!!
请给我发email:fj9lihu@sina.com


prefix 2000-11-15
  • 打赏
  • 举报
回复
当msgbox弹出是timer不走这时正常的,如果你form.show 1 弹出了个窗口也会这样,因为在同个线程中会中止等待msgbox完毕。
Nicrosoft 2000-11-15
  • 打赏
  • 举报
回复
VB自含的SendKeys函数可以发送模拟键盘按键。

小弟做的Sunny FreeWizard解除弹出对话框类共享软件限制的时候就是这样实现的。
Nicrosoft 2000-11-15
  • 打赏
  • 举报
回复
你可以查查MSDN啊,里面有SendKeys函数的用法的
Wonny 2000-11-14
  • 打赏
  • 举报
回复
自己做一个对话框不行吗?一样可以加上确定和取消按钮。
wxj_lake 2000-11-14
  • 打赏
  • 举报
回复
查找
FindWindow
SendMessage
两个API的用法
happyherro 2000-11-14
  • 打赏
  • 举报
回复
基本过程如下:
private Timer1.timer()
if Time()<TimeYouWant then
msgbox(.....)'调用MSGBOX函数,其参数设置为具有“确定”及“取消”两个按钮。
else
msgbox(....)'参数设置为只用取消按钮。
end if
end sub

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧