用程序完成自動撥號
發(fā)表時間:2023-08-20 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]用程序?qū)崿F(xiàn)自動撥號 屠恩海(SunHai) 開發(fā)工具:Microsoft Visual Studio .NET 2003 操作系統(tǒng):Windows XP ...
用程序?qū)崿F(xiàn)自動撥號
屠恩海(SunHai)
開發(fā)工具:Microsoft Visual Studio .NET 2003
操作系統(tǒng):Windows XP
在編寫網(wǎng)絡(luò)程序時很可能用到自動撥號。比如,郵件群發(fā)軟件用自動斷線和撥號實現(xiàn)本機IP地址的更換。
要實現(xiàn)自動撥號,分兩步:
從注冊表讀取本機撥號鏈接名稱;
自動撥號!
調(diào)用API函數(shù)從注冊表讀取本機撥號鏈接名
以前,我調(diào)用API函數(shù)從注冊表中讀取本機撥號鏈接名稱。
在Module中用如下代碼:
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Integer, ByVal lpSubKey As String, ByRef phkResult As Integer) As Integer
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Integer) As Integer
Private Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As Integer, ByVal dwIndex As Integer, ByVal lpName As String, ByVal cbName As Integer) As Integer
Const HKEY_CURRENT_USER As Integer = &H80000001
Const ERROR_NO_MORE_ITEMS As Short = 259
Const ERROR_SUCCESS As Short = 0
Dim hKey As Integer
Dim i As Integer
Dim astr As String = New String("", 256)
If RegOpenKey(HKEY_CURRENT_USER, "RemoteAccess\Profile", hKey) = ERROR_SUCCESS Then
While RegEnumKey(hKey, i, astr, 256) = ERROR_SUCCESS
MsgBox(astr) '鏈接名稱
i += 1
End While
RegCloseKey(hKey)
End If
用RegistryKey 類讀取鏈接名
RegistryKey 類表示 Windows 注冊表中的項級節(jié)點。此類是注冊表封裝。
本文主要用到:
RegistryKey.OpenSubKey 方法:用指定的寫訪問權(quán)限檢索指定的子項。
以只讀方式檢索子項。
[Visual Basic] Overloads Public Function OpenSubKey(String) As RegistryKey
RegistryKey.GetSubKeyNames 方法: 檢索包含所有子項名稱的字符串數(shù)組。
Public Function GetSubKeyNames() As String ()
用RegistryKey讀取鏈接名可以說是非常簡單:
Dim rk As RegistryKey = _
Registry.CurrentUser.OpenSubKey("RemoteAccess\Profile", True)
' Get the data from a specified item in the key.
Dim s As String() = rk.GetSubKeyNames()
For num As Integer = 0 To s.Length - 1
MsgBox(s.GetValue(num)) '這就是鏈接名
Next
用Shell實現(xiàn)自動撥號
讀取鏈接名后,自動撥號就非常簡單了!
打開“控制面板”,“網(wǎng)絡(luò)連接”,連接“屬性”,“選項”,去掉“提示名稱、密碼和證書等(P)”前面的對勾。
shell("rasphone.exe -d" & linksName, AppWinStyle.Hide, True, -1)
啟動“命令提示符”,鍵入 rasphone,回車,就彈出“撥號網(wǎng)絡(luò)對話框”。
如果鍵入 rasphone -h,回車,彈出“撥號網(wǎng)絡(luò)命令行”,列出rasphone的用法,比如,
rasphone -d 表示彈出彈號項目對話框。
rasphone -lx 在撥號快捷方式上執(zhí)行命令'x'
Shell函數(shù)說明:
AppWinStyle.Hide是sheell的參數(shù),表示隱藏窗口并將焦點傳到該窗口。
True表示等待撥號完成。
-1表示Shell直到程序完成才返回。
也可以這樣:
shell("rasdial.exe " & linksName, AppWinStyle.Hide, True, -1)
關(guān)于各種命令參數(shù),在OS的“幫助和支持”搜索“命令行”即可查到有關(guān)說明。命令行結(jié)合Shell函數(shù)可實現(xiàn)極多功能,你可試一試。
Shell 函數(shù)使用說明:
Public Function Shell ( _ ByVal Pathname As String, _
Optional ByVal Style As AppWinStyle = AppWinStyle.MinimizedFocus, _
Optional ByVal Wait As Boolean = False, _
Optional ByVal Timeout As Integer = -1 _
) As Integer
Shell 函數(shù)的返回值取決于 Pathname 中指定的程序在 Shell 返回時是否仍在執(zhí)行。如果將 Wait 設(shè)置為 True 并且程序在超時過期前結(jié)束, Shell 返回零。如果超時過期或者省略 Wait 或?qū)⑺O(shè)置為 False ,則 Shell 返回程序的進程 ID。進程 ID 是標識正在運行的程序的唯一數(shù)字。
如果 Shell 函數(shù)無法啟動指定的程序,則出現(xiàn) System.IO.FileNotFoundException 錯誤。例如,當試圖從使用 System.Windows.Forms 的應(yīng)用程序運行 16 位程序(如 command.com )時,可能會發(fā)生這種情況。解決辦法是運行將調(diào)用所需的 16 位程序的 32 位程序。如果是 command.com ,則可以將運行 cmd.exe 作為另一種選擇。
默認情況下, Shell 函數(shù)異步運行程序。這意味著用 Shell 函數(shù)啟動的程序在 Shell 函數(shù)后面的語句執(zhí)行前可能沒有結(jié)束執(zhí)行。如果想等待程序結(jié)束后再繼續(xù),請將 Wait 設(shè)置為 True 。
整個路徑和文件規(guī)范應(yīng)該始終用引號引起來,如以下示例所示:
ID = Shell ("""C:\Program Files\MyFile.exe"" -a -q", , True, 100000)
字符串內(nèi)每對相鄰的雙引號 ( "" ) 被解釋為字符串中的一個雙引號字符。因此,前面的示例表示 Shell 函數(shù)的下列字符串:
"C:\Program Files\MyFile.exe" -a -q
如果路徑?jīng)]有用引號引起來,Windows 就會在 C:\ 目錄中查找名為 Program.exe 的文件,而不是在 C:\Program Files 目錄中查找 MyFile.exe 文件。
安全說明 如果路徑和文件規(guī)范沒有用引號引起來,那么當文件名或路徑節(jié)點包含空格時,就會出現(xiàn)安全風險。在上面的示例中,路徑節(jié)點 \Program Files 包含一個空格。如果規(guī)范不在引號中,并且名為 Program.exe 的程序(例如通過非法的破壞)安裝在 C:\ 中,Windows 就會執(zhí)行 Program.exe 程序而不是 MyFile.exe 。