我們編寫程序時,有時會遇到在一個程序中調(diào)用并控制另一個程序執(zhí)行的情況,在一些編程語言中實現(xiàn)起來較為繁瑣,但如果用VB編寫時,則可輕松實現(xiàn)。下面我就以在程序中調(diào)用“計算器”為例,總結了以下幾種方法:
一、以異步方式來執(zhí)行其他程序
Shell 函數(shù)是以異步方式來調(diào)用其他程序的。也就是說,用Shell啟動的程序可能還沒有完成執(zhí)行過程,就已經(jīng)執(zhí)行到 Shell 函數(shù)之后的語句。
語法:Shell(pathname[,windowstyle])
說明:pathname:必要參數(shù)。Variant (String),要執(zhí)行的程序名,以及任何必需的參數(shù)或命令行變量,可能還包括目錄或文件夾,以及驅動器。
例如:RetVal = Shell(″C:WINDOWSCALC.EXE″, 1) ′ 調(diào)用計算器。
二、以同步方式來執(zhí)行其他程序
有時候,我們需要讓VB在執(zhí)行完外部程序后再執(zhí)行下一語句,這就需要使用API函數(shù)。
我們可通過OpenProcess和CloseHandle函數(shù)來檢測調(diào)用軟件的運行情況。這兩個函數(shù)的聲明如下:
Declare Function OpenProcess Lib ″kernel32″ Alias ″OpenProcess″ (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Declare Function CloseHandle Lib ″kernel32″ Alias ″CloseHandle″ (ByVal hObject As Long) As Long
建立下面函數(shù),用以判斷程序是否在運行,如果是,則在運行時返回True。
Function IsRunning(ByVal ProgramID) As Boolean ′傳入進程標識ID
Dim hProgram As Long ′被檢測的程序進程句柄
hProgram=OpenProcess(0,False,ProgramID)
If Not hProgram=0 Then
IsRunning=True
Else
IsRunning=False
End If
CloseHandle hProgram
End Function
例如要調(diào)用計算器(CALC.EXE)并等到它運行完成后再執(zhí)行下一語句,可以使用以下代碼:
Dim RetVal
MsgBox ″開始運行″
RetVal = Shell(″C:WINDOWSCALC.EXE″, 1)
While IsRunning(RetVal)
DoEvents
Wend
MsgBox ″結束運行″
三、關閉正在運行中的其他軟件
如果要在程序中關閉正在運行中的其他程序,可以先使用FindWindow函數(shù)找出相應的程序句柄,然后調(diào)用PostMessage函數(shù)關閉該程序即可。
這兩個函數(shù)的聲明如下:
Declare Function FindWindow Lib ″user32″ Alias ″FindWindowA″ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function PostMessage Lib ″user32″ Alias ″PostMessageA″ (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
例如要檢測“計算器”程序是否正在運行,如果是則關閉它,可以使用如下代碼來實現(xiàn):
Dim winHwnd As Long
Dim RetVal As Long
winHwnd=FindWindow(vbNullString,″計算器″)
If winHwnd〈〉0 Then
RetVal=PostMessage(winHwnd,&H10,0&,0&)
If RetVal=0 Then
MsgBox ″關閉計算器出錯!″
End If
Else
MsgBox ″計算器程序沒有運行。″
End If