当你需要等待由Shell启动的应用程序运行完毕时, 便会发现Shell语句只管调用,之后就撒手不管了,于 是我们不得不动用一下API函数了。当然我们可以用 API来完成全部的工作,但是如果那样的话,我们将要 面临CreateProcess这个非常复杂的函数,光写下它 和相关结构类型的宣告就超出一页纸了。别误会,我说这些的目的只是为了让大家体会到下面我们将要做 的是多么简单的事。
创新互联服务项目包括同江网站建设、同江网站制作、同江网页制作以及同江网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,同江网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到同江省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
只需按以下步骤step by step,便OK了。
1.新建一个项目,在窗体上放一个command1,再 添加一个Module。
2. 在Module中写入如下代码:
Option Explicit
以下声明了OpenProcess,GetExitCodeProcess 和Closeandle 三个API函数
Public Declare Function OpenProcess Lib"ker nel32"(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long)As Long
Public Declare Function GetExitcodeProcess Lib “kernel32”(ByVal hProcess As Long, 1pExitcode As Long) As Long
Public Declare Function Closellandle Lib "Ker nel32”(ByVal hobject As Long) As Long
Publi Const PROCESS_QUERY_INFORMATION= &H400
Public Const STATUS_PENDING = &H103&
3.打开窗体的代码窗口,写入如下代码:
Option Explicit
Private Sub RunShell(cmdline As String) 这个自定义过程完成了所有工作
Dim hProcess As Long
Dim ProcessId As Long
Dim exitCode As Long
ProcessId = Shell(cmdline,1)'此处利用了 Shell当函数使用时返回的任务标识
hProcess=OpenProcess(PROCESS_QUERY_INFOR MATION,False,ProcessId)
Do
Ca11 GetExitCodeProcess(hProcess,exitcode)
DoEvents
Loop While exitCode = STATUS_PENDING
Call CloseHandle(hProcess)
MsgBox cmdline & "已经关闭。"
End Sub
Private Sub Command1_Click()
RunShell ”notepad.exe”
End Sub
4.按F5运行,单击Command1运行计事本,关闭 计事本将弹出对话框“notepad.exe 已经关闭。”
注意:由于本程序是用一个Do..Loop循环来侦测 进程的结束,所以那句DoEvents是绝不能少的,不然 你就只能用Ctrl+Break来退出了。
set sockf=WScript.CreateObject("MSWinsock.Winsock","sockp_")
Sub sockp_DataArrival(ByVal bytesTotal)
sockf.GetData da,VbString
End Sub
vbs 写 vb.net 要写呢 求神指点
vbs 创建象 事件
ockp_DataArrival 事件达 触发 求神修改
详细查看了你的问题,完全不需要使用线程sleep的方法。
在这边,我要给你引入一个概念。就是Form窗体的两个方法。
Form.Show()和Form.ShowDialog()
第一个Show方法运行后,你的主程序还是会进行,你的代码还是会继续进行下去。此时,窗体还是弹出的。
第二个ShowDialog方法运行后,此时,弹出的一个窗体,你不将其关闭,那么,主程序就会一直等待这个窗体关闭后,才执行后面的代码。
所以,你只需要使用showdialog这个方法,即可达到你想要的结果。
那么,如何才能让弹出的窗体不改变呢?很简单
你可以找到窗体的formcloseing事件,在这个事件中,有一个参数:e
这个e有一个属性,就是e.handle,表示是否处理过这个事件了。
这个时候,如果你不想让窗体关闭,你可以写:
e.handle=true,那么表示已经处理过窗体关闭的事件了。
注:有些情况,可能是:e.cancel=true
Public Sub Delay(Second As Bouble)
Dim tempTime As DateTime = DateTime.Now
While (tempTime.AddSeconds(second).CompareTo(DateTime.Now) 0)
Application.DoEvents()
End While
End Sub
放在模块里,使用时 Delay(1) 即可。