模块中输入: Option ExplicitPublic Const SYNCHRONIZE = &H100000 Public Const INFINITE = &HFFFFFFFF Public Const WAIT_TIMEOUT = &H102&Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long 调用例子:Option ExplicitPrivate Sub Command1_Click() Dim pId As Long, pHnd As Long pId = Shell("Notepad", vbNormalFocus) pHnd = OpenProcess(SYNCHRONIZE, 0, pId) If pHnd <> 0 Then WaitForSingleObject pHnd, INFINITE CloseHandle pHnd End If End Sub楼主最好考虑清楚再用这种方法,因为这种方法会让p1在等待p2结束期间完全不做任何事(不接受键盘鼠标输入、不处理窗口的描绘工作,甚至不接收任何消息),结果会让用户觉得p1好象死掉一样
用 MsgWaitForMultipleObjects 的话可以响应消息。
Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long p1内代码 WinExec p2,0 '执行外部程序 SaveSetting "句并文件", "句并", "文件", text1.hwnd '将句柄保存起来p2内代码 aa = GetSetting("句并文件", "句并1", "文件", "") '从注册表中取出窗体句柄 SendMessage aa, &HC2, 16, "Timer" p1内代码 当text1.text接收到数据 EnableWindow p1.hwnd, 1完成后 EnableWindow p1.hwnd, 0 [email protected]
用Shell执行的外部程序执行成功后和调用Shell的程序基本没有任何关系,除了你能拿到它的hInstance.其实你在程序(P1)里调用Shell执行了P2,和你让P1运行着,然后手动执行P2没啥区别.如果P1和P2都是你自己写的,可以让两个程序通过一些方法进行通信,比如说P2启动后通知P1不要响应用户操作;P2退出时再通知P1.如果P2不是你写的...那就没辙了~
Option ExplicitPublic Const SYNCHRONIZE = &H100000
Public Const INFINITE = &HFFFFFFFF
Public Const WAIT_TIMEOUT = &H102&Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
调用例子:Option ExplicitPrivate Sub Command1_Click()
Dim pId As Long, pHnd As Long pId = Shell("Notepad", vbNormalFocus)
pHnd = OpenProcess(SYNCHRONIZE, 0, pId)
If pHnd <> 0 Then
WaitForSingleObject pHnd, INFINITE
CloseHandle pHnd
End If
End Sub楼主最好考虑清楚再用这种方法,因为这种方法会让p1在等待p2结束期间完全不做任何事(不接受键盘鼠标输入、不处理窗口的描绘工作,甚至不接收任何消息),结果会让用户觉得p1好象死掉一样
p1内代码
WinExec p2,0 '执行外部程序
SaveSetting "句并文件", "句并", "文件", text1.hwnd '将句柄保存起来p2内代码
aa = GetSetting("句并文件", "句并1", "文件", "") '从注册表中取出窗体句柄
SendMessage aa, &HC2, 16, "Timer"
p1内代码
当text1.text接收到数据
EnableWindow p1.hwnd, 1完成后
EnableWindow p1.hwnd, 0
[email protected]