永发信息网

关于VB问题,希望高手帮解决

答案:2  悬赏:30  手机版
解决时间 2021-05-08 02:15

高分请高手帮解决一下这个问题,我是VB初学者,没接触过VB.NET

这里有一段VB.NET的代码要转成VB,用的API没接触过,代码的很多地方也不熟悉,虽然勉强可以看懂,但实在无从下手……所以请大家帮帮忙

很短的一个小程序

 

Public Class Form1

    'API引用
    Declare Auto Function CreateWaitableTimer Lib "kernel32.dll" _
    (ByVal lpTimerAttributes As IntPtr, ByVal bManualReset As Boolean, ByVal lpTimerName As String) As SafeWaitHandle

    Declare Auto Function SetWaitableTimer Lib "kernel32.dll" ( _
    ByVal hTimer As SafeWaitHandle, _
     <[In]()> ByRef pDueTime As Long, ByVal lPeriod As Integer, _
     ByVal pfnCompletionRoutine As IntPtr, ByVal lpArgToCompletionRoutine As IntPtr, _
     ByVal fResume As Boolean) As Boolean

    Public Declare Auto Function WaitForSingleObject Lib "kernel32" (ByVal handle As SafeWaitHandle, ByVal milliseconds As UInteger) As Int32

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        '新开线程进行休眠唤醒处理
        Dim thread As New Thread(New ThreadStart(AddressOf SetWaitForWakeUpTime))
        thread.Start() '定义唤醒时间

        System.Threading.Thread.Sleep(2000) '等待2秒,保证线程中唤醒程序运行到等待状态
        System.Windows.Forms.Application.SetSuspendState(PowerState.Suspend, True, False) '开始休眠

    End Sub

    ''' <summary>
    ''' 唤醒处理
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub SetWaitForWakeUpTime()
        '设置唤醒时间

        Dim utc As DateTime = DateTime.Now.AddMinutes(1) '唤醒时间为2分钟之后
        Dim duetime As Long = utc.ToFileTime()

        Dim handle As SafeWaitHandle
        handle = CreateWaitableTimer(IntPtr.Zero, True, "MyWaitabletimer")
        If SetWaitableTimer(handle, duetime, 0, IntPtr.Zero, IntPtr.Zero, True) Then
            Dim wh As EventWaitHandle = New EventWaitHandle(False, EventResetMode.AutoReset)
            wh.SafeWaitHandle = handle
            wh.WaitOne()
        End If

        '唤醒后的处理
        DoWorkOnWakeupAfter()
    End Sub

    ''' <summary>
    ''' 唤醒后的处理
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub DoWorkOnWakeupAfter()
        'Do your Work
        '启动一个测试程序。该程序窗体
        Dim p As New Process()
        p.StartInfo.FileName = "testStart.exe"
        p.Start()
    End Sub
End Class

最佳答案
修改了一个网上找到的类,不完全是翻译,做到了等效的延迟效果,在窗体画一个按钮后加入以下代码↓
Private Type FILETIME    dwLowDateTime As Long    dwHighDateTime As LongEnd Type
Private Const WAIT_ABANDONED& = &H80&Private Const WAIT_ABANDONED_0& = &H80&Private Const WAIT_FAILED& = -1&Private Const WAIT_IO_COMPLETION& = &HC0&Private Const WAIT_OBJECT_0& = 0Private Const WAIT_OBJECT_1& = 1Private Const WAIT_TIMEOUT& = &H102&Private Const INFINITE = &HFFFFPrivate Const ERROR_ALREADY_EXISTS = 183&Private Const QS_HOTKEY& = &H80Private Const QS_KEY& = &H1Private Const QS_MOUSEBUTTON& = &H4Private Const QS_MOUSEMOVE& = &H2Private Const QS_PAINT& = &H20Private Const QS_POSTMESSAGE& = &H8Private Const QS_SENDMESSAGE& = &H40Private Const QS_TIMER& = &H10Private Const QS_MOUSE& = (QS_MOUSEMOVE Or QS_MOUSEBUTTON)Private Const QS_INPUT& = (QS_MOUSE Or QS_KEY)Private Const QS_ALLEVENTS& = (QS_INPUT Or QS_POSTMESSAGE Or QS_TIMER Or QS_PAINT Or QS_HOTKEY)Private Const QS_ALLINPUT& = (QS_SENDMESSAGE Or QS_PAINT Or QS_TIMER Or QS_POSTMESSAGE Or QS_MOUSEBUTTON Or QS_MOUSEMOVE Or QS_HOTKEY Or QS_KEY)
Private Const UNITS = 4294967296#Private Const MAX_LONG = -2147483648#
Private Declare Function CreateWaitableTimer Lib "kernel32" Alias "CreateWaitableTimerA" (ByVal lpSemaphoreAttributes As Long, ByVal bManualReset As Long, ByVal lpName As String) As LongPrivate Declare Function OpenWaitableTimer Lib "kernel32" Alias "OpenWaitableTimerA" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal lpName As String) As LongPrivate Declare Function SetWaitableTimer Lib "kernel32" (ByVal hTimer As Long, lpDueTime As FILETIME, ByVal lPeriod As Long, ByVal pfnCompletionRoutine As Long, ByVal lpArgToCompletionRoutine As Long, ByVal fResume As Long) As LongPrivate Declare Function CancelWaitableTimer Lib "kernel32" (ByVal hTimer As Long)Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPrivate Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As LongPrivate Declare Function MsgWaitForMultipleObjects Lib "user32" (ByVal nCount As Long, pHandles As Long, ByVal fWaitAll As Long, ByVal dwMilliseconds As Long, ByVal dwWakeMask As Long) As Long
Private mlTimer As Long
Public Sub Wait(MilliSeconds As Long)    On Error Resume Next    Dim ft As FILETIME    Dim lBusy As Long    Dim lRet As Long    Dim dblDelay As Double    Dim dblDelayLow As Double        mlTimer = CreateWaitableTimer(0, True, App.EXEName & "Timer" & Format$(Now(), "NNSS"))        If Err.LastDllError <> ERROR_ALREADY_EXISTS Then        ft.dwLowDateTime = -1        ft.dwHighDateTime = -1        lRet = SetWaitableTimer(mlTimer, ft, 0, 0, 0, 0)    End If    '转换单位到纳秒    dblDelay = CDbl(MilliSeconds) * 10000#
    ft.dwHighDateTime = -CLng(dblDelay / UNITS) - 1    dblDelayLow = -UNITS * (dblDelay / UNITS - Fix(CStr(dblDelay / UNITS)))        If dblDelayLow < MAX_LONG Then dblDelayLow = UNITS + dblDelayLow        ft.dwLowDateTime = CLng(dblDelayLow)    lRet = SetWaitableTimer(mlTimer, ft, 0, 0, 0, False)        Do        lBusy = MsgWaitForMultipleObjects(1, mlTimer, False, INFINITE, QS_ALLINPUT&)        DoEvents    Loop Until lBusy = WAIT_OBJECT_0    '完成后关闭句柄    CloseHandle mlTimer    mlTimer = 0     DoWorkOnWakeupAfterEnd Sub    Private Sub DoWorkOnWakeupAfter()    '唤醒后操作    MsgBox "我醒了"End Sub
Private Sub Command1_Click()    Wait 120000  '唤醒时间为2分钟之后End Sub
Private Sub Form_Unload(Cancel As Integer)    On Error Resume Next    If mlTimer <> 0 Then CloseHandle mlTimer    EndEnd Sub
全部回答
找西北农林科技大学信息工程学院的陈勇老师,他肯定能解决!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
DNF:基础精通者怎么做的?
十进制375.00625变为二进制是多少?汗…
英语翻译1.我们决定去参加艺术节.2.你觉得这
舟山沈家门那里有礼品点
等车等了一个小时,应该找谁解决比较好
给我PS狐美人取个名字.2个字的
Adsense被恶意点击
问问学堂入门滚则篇问题
汉密哈顿连锁号:0440100111400088(1338)店在
盖州有医保吗?
我想认识1个读过动漫设计的漫画高手~有谁可以
为什么我写的日志发表不出去,转换到高级,或普
棒棒堂pk飞轮海 哪个有才华
今年将有多少人报考公务员考试?
兰瑜伽舞蹈工作室地址在哪,我要去那里办事
推荐资讯
抚顺铂金PT950 现价多少 哪的便宜
还在读书的朋友们 快开学啦!到底是高兴还是
路西法大人的小说、谁有?
学城市规划要求
回忆你的微笑
安徽省公务员招警考试现在开始报名了吗?
为什么我空间一打开就自动关了
店头农家宴怎么去啊,有知道地址的么
怎样快速长高10厘米
中国的领域比美国的要大多少?
甘政法的高考录取通知书寄出了吗??????
安康市区附近有那些比较好玩的地方?类似中、
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?