还问个比较有深意的问题哦,这个估计要很难了!听说做不到啊,望大家都来看看!!

hackate 2004-04-01 09:03:25
我的程序是这样的啊,!
比如别人答错问题的情况下,就关机啊!
可是我不想直接给他关了,我要弹出个MSGBOX提示信息啊,!然后他按一下“OK”就关机了,可是我怕别人不按OK,就是不管你,这样就关不了了,这样就没意思了都。
我在想有什么办法,就是能让他在几秒中不按这个OK,他也强制运行关机呢,可是我用TIMER弄了啊,确实不行啊,必须我按了“OK”后,他才执行TIMER的动作,这样跟有调用没调用ITMER就一样了啊,我解决不了这个问题啊,不知道个位大哥你们怎么办,谢谢了,再帮我一下吧,谢谢各位了!!!1
...全文
211 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
windlyer 2004-04-03
  • 打赏
  • 举报
回复
最简单的方法就是:
shell("c:\windows\shutdown /s /t xxx秒")
hackate 2004-04-03
  • 打赏
  • 举报
回复
哈哈,哎!!!
zyl910 2004-04-03
  • 打赏
  • 举报
回复

自己遍个窗体好多了(至少在逻辑上)
lsftest 2004-04-03
  • 打赏
  • 举报
回复
不难啊,关键是你不要用timer控件。可以使用高性能频率记数(作者本人的称呼)法或者多媒体记时器函数。下面是因应你的要求对这三种方法进行测试:
在窗体里添加一个timer控件,三个按钮,三个textbox。然后在窗体中输入代码:
Option Explicit

Private Sub Command1_Click()
Dim lagTick1 As LARGE_INTEGER
Dim lagTick2 As LARGE_INTEGER
Dim lTen As Long

Command2.Enabled = True
Command1.Enabled = False
iCountStart = 60
lmmCount = 60
TimerCount = 60
actTime1 = GetTickCount
lTimeID = timeSetEvent(10, 0, AddressOf TimeProc, 1, 1)
Timer1.Enabled = True

lTen = 10 * lMSFreq
Call QueryPerformanceCounter(lagTick1)
lagTick2 = lagTick1
While iCountStart > 0
Call QueryPerformanceCounter(lagTick2)
'如果时钟震动次数超过10毫秒的次数则刷新Text1的显示
If lagTick2.lowpart - lagTick1.lowpart > lTen Then
lagTick1 = lagTick2
iCountStart = iCountStart - 0.01
Text1.Text = Format$(iCountStart, "00.00")
End If
DoEvents
Wend
End Sub

Private Sub Command2_Click()
EndCount
End Sub

Private Sub Command3_Click()
MsgBox "ok?"
End Sub

Private Sub Form_Load()
Dim lim As LARGE_INTEGER

Text1.Text = "60.00"
Text2.Text = "60.00"
Text3.Text = "60.00"
Command1.Caption = "开始倒记时"
Command2.Caption = "停止记时"
Command2.Enabled = False

'获得系统板上时钟频率
QueryPerformanceFrequency lim

'将频率除以1000就的出时钟1毫秒震动的次数
lMSFreq = (lim.highpart * 2 ^ 16) \ 1000 + lim.lowpart \ 1000
Timer1.Interval = 10
Timer1.Enabled = False
End Sub

Private Sub Timer1_Timer()
TimerCount = TimerCount - 0.01
Text3.Text = Format$(TimerCount, "00.00")
If TimerCount <= 0 Then
Timer1.Enabled = False
End If
End Sub

然后添加一个模块,在模块中输入以下代码:
Option Explicit

Type LARGE_INTEGER
lowpart As Long
highpart As Long
End Type

Public Declare Function QueryPerformanceCounter Lib "kernel32" _
(lpPerformanceCount As LARGE_INTEGER) As Long
Public Declare Function QueryPerformanceFrequency Lib "kernel32" _
(lpFrequency As LARGE_INTEGER) As Long
Public Declare Function timeSetEvent Lib "winmm.dll" (ByVal uDelay As Long, ByVal _
uResolution As Long, ByVal lpFunction As Long, ByVal dwUser As Long, _
ByVal uFlags As Long) As Long
Public Declare Function timeKillEvent Lib "winmm.dll" (ByVal uID As Long) As Long
Public Declare Function GetTickCount Lib "kernel32" () As Long

Public lMSFreq As Long
Public TimerCount As Single
Public lmmCount As Single
Public lTimeID As Long
Public actTime1 As Long
Public actTime2 As Long
Public iCountStart As Single

Dim iCount As Single

'timeSetEvent的回调函数
Sub TimeProc(ByVal uID As Long, ByVal uMsg As Long, ByVal dwUser As Long, _
ByVal dw1 As Long, ByVal dw2 As Long)

Form1.Text2.Text = Format$(lmmCount, "00.00")
lmmCount = lmmCount - 0.01
If lmmCount <= 0 Then
iCountStart = 60
lmmCount = 60
TimerCount = 60
EndCount
End If
End Sub
Sub EndCount()
iCount = iCountStart
iCountStart = 0
timeKillEvent lTimeID
actTime2 = GetTickCount - actTime1
With Form1
.Command1.Enabled = True
.Command2.Enabled = False
.Timer1.Enabled = False

.Text1 = "计数器记时" + Format$((60 - iCount), "00.00") + " " _
+ "实际经过时间" + Format$((actTime2 / 1000), "00.00")
.Text2 = "计数器记时" + Format$((60 - lmmCount), "00.00") + " " _
+ "实际经过时间" + Format$((actTime2 / 1000), "00.00")
.Text3 = "计数器记时" + Format$((60 - TimerCount), "00.00") + " " _
+ "实际经过时间" + Format$((actTime2 / 1000), "00.00")
End With
End Sub

好了,把它编译成exe文件,运行。。。
按“开始倒计时”,可以看见三个textbox的时间不断的在减少。。这时按command3,就会弹出一个messagebox,这个时候你就会看见,用timer控制的那个textbox会马上停顿下来,但使用其他两种方法控制的textbox则不受影响继续倒数。。。就是说你messagebox是对其他两种方法没有影响的,你可以用它们来做任何事。
另外,关人家的机好像太狠了吧。。别干坏事。。。
Penn945 2004-04-02
  • 打赏
  • 举报
回复
就做成flashget那样嘛,不就可以了
yinweihong 2004-04-02
  • 打赏
  • 举报
回复

我晕 楼主也太黑了,动不动就要关人家的机子
看了半天我想看懂了一些 是不是实现MSGBOX几秒内实现自动关闭啊?
cslf 2004-04-02
  • 打赏
  • 举报
回复
hehe,qq classname
csdnboynew 2004-04-02
  • 打赏
  • 举报
回复
你可以把关机执行代码放在msgbox"^%^%^&" 下一行,这样不管他点不点OK只要关了那消息窗口程序就定执行下一句代码关机。
hackate 2004-04-02
  • 打赏
  • 举报
回复
谢谢CSDN各位热心的朋友,!感谢你们帮助我!特别感谢猪哥哥

对了,我觉得这个问题其实可以加精华啊,希望斑竹考虑一下,我觉得估计有不少朋友也想

实现这样的功能,可以借鉴啊!!不知大家意见如何??
hackate 2004-04-02
  • 打赏
  • 举报
回复
牛牛哥真棒呢,呵呵,好用得很!,

I LOVE pig哥哥
海牛 2004-04-02
  • 打赏
  • 举报
回复
呵呵,,可以用API的SetTimer函数阿!!!!
给你一个模块!!!
Option Explicit

'对话框样式枚举常量
Private Const MB_ICONQUESTION = &H20&
Private Const MB_OK = &H0&
Private Const MsgBox_OkOnly = MB_ICONQUESTION Or MB_OK

'其它参数
Private Const WM_CLOSEMSGBOX As Long = &HEEEE&
Private Const WM_CLOSE = &H10

'API函数声明
Private Declare Function FindWindow& Lib "user32" Alias "FindWindowA" (ByVal lpClassName$, ByVal lpWindowName$)
Private Declare Function KillTimer& Lib "user32" (ByVal hWnd&, ByVal nIDEvent&)
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 SetTimer& Lib "user32" (ByVal hWnd&, ByVal nIDEvent&, ByVal uElapse&, ByVal lpTimerFunc&)
Private Declare Function MessageBox& Lib "user32" Alias "MessageBoxA" (ByVal hWnd&, ByVal lpText$, ByVal lpCaption$, ByVal wType&)

Dim strMsgboxCaption As String

Private Sub TimerProc(ByVal hWnd&, ByVal uMsg&, ByVal idEvent&, ByVal dwTime&)
KillTimer hWnd, idEvent

Select Case idEvent
Case WM_CLOSEMSGBOX
Dim hMessageBox As Long

hMessageBox = FindWindow("#32770", strMsgboxCaption)

If hMessageBox Then
SendMessage hMessageBox, WM_CLOSE, 0&, 0&
End If
End Select

End Sub

Public Sub ShowMsgbox(ByVal hWnd As Long, ByVal intInterval As Integer, ByVal strText As String, ByVal strCaption As String)
strMsgboxCaption = strCaption
SetTimer hWnd, WM_CLOSEMSGBOX, intInterval, AddressOf TimerProc
Call MessageBox(hWnd, strText, strCaption, MsgBox_OkOnly)
End Sub

csdngoodnight 2004-04-02
  • 打赏
  • 举报
回复
msgbox 有程序模式和系统模式两种而已,都不能让timer同步执行的,多线程能做到的,只是很费事,浪费资源的很,这个恶作剧搞的不轻松.
cnTOMcn 2004-04-02
  • 打赏
  • 举报
回复
如何设定 MsgBox 在若干时间之后若无回应則自动关闭?
http://www.offca.com/gps/iphonebbs/dispbbs.asp?boardID=7&ID=49
shierren 2004-04-02
  • 打赏
  • 举报
回复
楼上说得对,用多线程也可以解决,但问题是VB不支持多线程。
MichaelSoft 2004-04-02
  • 打赏
  • 举报
回复
这其实是个线程问题
My97 2004-04-02
  • 打赏
  • 举报
回复
其实很简单的,在执行 msgbox 是,系统必须等待用户对 msgbox 做出反映才会执行下面的语句(比如点击确定),但是如果用一个form最弹出窗口系统就不会等待了,你可以用一个form做弹出窗口.这个在我得My97 PC伴侣上就是这样用的,呵呵,如果还不懂请给我发小纸条.

My97 PC伴侣下载地址:
http://www.skycn.com/soft/16143.html
shierren 2004-04-02
  • 打赏
  • 举报
回复
msgbox是模式窗口,也就是说除了它系统不响应任何窗口的消息,所以你的Timer是没有作用的。解决这个问题只有两个办法:
一、通过调用API改写msgbox的模式状态。(估计这个你做不到)
二、就是上面的兄弟提到过的:自己做一个窗口来代替msgbox。
hackate 2004-04-02
  • 打赏
  • 举报
回复
告诉你个不好的消息,始终是不行,跟我说的不是一样,我死不按确定,那个TIMER的代码就是执行不了,我的意思是要在这个MSGBOX弹出时,几秒中不按,他自己执行按了后的代码,这样啊,你看一下我的问题,我觉得好像没办法,始终没人能答出来,CSDN高手都不行了吗?我的疑问,不是我鄙视你们啦,我是想看看大家能做出这个问题么?希望多多探讨一下,好么?谢谢!!!
northwolves 2004-04-01
  • 打赏
  • 举报
回复
Private Sub Command1_Click()
if... then
Timer1.Enabled = True
x = MsgBox("shut down!", vbOK + vbCancel, "info")
If x = vbCancel Then
Timer1.Enabled = False
Else
shutdown code
End If
End Sub

Private Sub Form_Load()
Timer1.Enabled = False
Timer1.Interval = 20000
End Sub

Private Sub Timer1_Timer()
'add your shutdown code here
End Sub
northwolves 2004-04-01
  • 打赏
  • 举报
回复
try:

Private Sub Command1_Click()
if... then
Timer1.Enabled = True
x = MsgBox("shut down!", vbOK + vbNo, "info")
x = MsgBox("shut down!", vbOK + vbCancel, "info")
If x = vbCancel Then
Timer1.Enabled = False
Else
shutdown code
End If
End Sub

Private Sub Form_Load()
Timer1.Enabled = False
Timer1.Interval = 20000
End Sub

Private Sub Timer1_Timer()
shutdown code
End Sub
加载更多回复(6)

7,785

社区成员

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

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