200 likes | 485 Views
Visual Basic 程式設計. 講師:戴志華 hana@ arbor.ee.ntu.edu.tw 國立台灣大學電機工程研究所. 第十八章 呼叫 Windows API. Windows API. 一堆以C語言寫成的函式庫 , 功能強大 , 應有盡有 Windows 作業系統的一部份 透過 API 與 O.S 溝通. 應用程式. Application Programming Interface. O.S. Hardware. Where is Windows API. 在作業系統的動態連結程式庫 (*.DLL) EX:
E N D
Visual Basic 程式設計 講師:戴志華 hana@arbor.ee.ntu.edu.tw 國立台灣大學電機工程研究所
Windows API • 一堆以C語言寫成的函式庫, 功能強大, 應有盡有 • Windows作業系統的一部份 • 透過API與O.S 溝通
應用程式 Application Programming Interface O.S Hardware
Where is Windows API • 在作業系統的動態連結程式庫 (*.DLL) • EX: Gdi32.dll 圖形周邊設備介面 API Netapi32.dll 32位元網路 API Winmm.dll Windows多媒體 API
宣告 API 函式 • Declare Function VB函式 Lib “DLL名” [Alias “API函式名”] (參數列) As 傳回值型態 • Declare Sub VB函式 Lib “DLL名” [Alias “API函式名”] (參數列)
宣告 API 函式(cont’d) • Declare Function HideCaret Lib “user32” Alias “HideCaret” (ByVal hwnd as Long) As Long Dim x as Integer x=HideCaret(text1.hwnd)
宣告 API 函式(cont’d) • 使用API檢視員 • 檔案/載入文字檔, 選取WIN32API.TXT • (加快)將文字檔轉換成資料庫格式 • API 類型宣告(Declares) 型態(Types) 常數(Constants)
範例一:取消關閉視窗功能 • GetSystemMenu • DeleteMenu
範例一:取消關閉視窗功能(cont’d) • Public Declare Function GetSystemMenu Lib "user32" Alias "GetSystemMenu" (ByVal hwnd As Long, ByVal bRevert As Long) As Long • Public Declare Function DeleteMenu Lib "user32" Alias "DeleteMenu" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
範例一:取消關閉視窗功能(cont’d) • Private Const MF_BYCOMMAND = &H0& • Public Const MF_BYPOSITION = &H400& Private Const SC_MAXIMIZE = &HF030 Private Const SC_RESTORE = &HF120Private Const SC_SIZE = &HF000Private Const SC_MOVE = &HF010Private Const SC_MINIMIZE = &HF020Private Const SC_CLOSE = &HF060
範例一:取消關閉視窗功能(cont’d) • Dim hMenu As Long, Success As Long hMenu = GetSystemMenu(Me.hWnd, 0) '禁止還原按鈕Success = DeleteMenu(hMenu, SC_RESTORE, MF_BYCOMMAND) '禁止改變大小Success = DeleteMenu(hMenu, SC_SIZE, MF_BYCOMMAND) '禁止最大化Success = DeleteMenu(hMenu, SC_MAXIMIZE, MF_BYCOMMAND) '禁止最小化Success = DeleteMenu(hMenu, SC_MINIMIZE, MF_BYCOMMAND) '禁止關閉Success = DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND) '禁止移動Success = DeleteMenu(hMenu, SC_MOVE, MF_BYCOMMAND)
範例二:圖形介面功能表 • 利用API檢視員加入GetMenu, GetSubMenu, GetMenuItemId, SetMenuItemBitMaps, MF_BITMAP, and MF_BYPOSITION
範例二:圖形介面功能表(cont’d) • Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long • Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long • Private Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long • Private Declare Function SetMenuItemBitmaps Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal hBitmapUnchecked As Long, ByVal hBitmapChecked As Long) As Long • Private Const MF_BITMAP = &H4& • Private Const MF_BYPOSITION = &H400&
範例二:圖形介面功能表(cont’d) • Dim hMenu, hSubMenu, MenuId As Long • Dim Pic(3) As Picture • Private Sub Form_Load() • Set Pic(0) = LoadPicture(App.Path & "\01.bmp") • Set Pic(1) = LoadPicture(App.Path & "\02.bmp") • hMenu = GetMenu(Me.hwnd) • hSubMenu = GetSubMenu(hMenu, 0) • SetMenuItemBitmaps hSubMenu, 2, MF_BYPOSITION, Pic(0).Handle, 0 • SetMenuItemBitmaps hSubMenu, 3, MF_BYPOSITION, Pic(0).Handle, Pic(1).Handle • End Sub
範例二:圖形介面功能表 • Private Sub mm3_Click() • mm3.Checked = True • End Sub
範例三:得知已開機時間 • GetTickCount • Private Declare Function GetTickCount Lib "kernel32" () As Long • Private Sub Command1_Click() • MymSec = GetTickCount() • MyDay = MymSec \ 86400000 • MyHour = MymSec \ 3600000 Mod 24 • MyMin = MymSec \ 60000 Mod 60 • MySec = MymSec \ 1000 Mod 60 • MsgBox "已經開機:" & MyDay & "天 " & MyHour & "小時 " & MyMin & "分 " & MySec & "秒" • End Sub
範例四:清除資源回收桶 • SHEmptyRecycleBinA • Declare Function SHEmptyRecycleBin Lib "shell32.dll" Alias "SHEmptyRecycleBinA" (ByVal hWnd As Long, ByVal pszRootPath As String, ByVal flags As Long) As Long • SHEmptyRecycleBin 0, vbNullstring, 0 • SHEmptyRecycleBin 0, "E:\", 0
範例四:清除資源回收桶(cont’d) • Flags • 1:不要清除的對話框 • 2:不顯示刪除進行對畫框 • 4:不發出資源回收統刪除事件的聲音。