VB 版 (精华区)
发信人: bloom (├┝┞┟┠┢┣), 信区: VB
标 题: VB API教程(王国荣版)(二)(转载)
发信站: 哈工大紫丁香 (2000年09月07日18:42:48 星期四), 转信
【 以下文字转载自 cnTemp 讨论区 】
【 原文由 bloom 所发表 】
发信人: Love1976 (狄飞惊), 信区: VisualBasic
发信站: BBS 水木清华站 (Thu Apr 6 04:20:12 2000)
发信人: coolknight (酷骑士~找工作中), 信区: VB
标 题: VB 與 Windows API 講座(二) -
发信站: 武汉白云黄鹤站 (Tue Nov 9 20:03:16 1999), 站内信件
VB 與 Windows API 講座(二) -
螢幕抓取與螢幕保護程式
------------------------------------------------------------------------
----
----
王國榮
「VB 沒有提供這樣的功能, 必須呼叫 Windows API」, 當筆者這樣回答讀者之
後,有
些讀者會要求筆者介紹 Windows API 方面的書籍, 尤其是中文書, 但實際上,
目前市
面上只看到一本原文書(ZD Press 出版的 Visual Basic 5.0 Programming
Guide to W
in32 API), 中文書則未見過, 為什麼沒有 Windows API 方面的中文書呢?道理
很簡
單, Windows API 對 VB 的學習者而言, 猶如山峰之顛, 能夠一路爬上來的人
原本就
十分有限,而越往山頂, 人煙越稀少, 因此這樣的書寫出來, 銷售成績必然慘
不忍睹
, 也許有些讀者會覺得本土的作者實在很混,只願意寫簡單的書, 但撰寫深入的
書籍
, 費時費力費神而銷售成績又不好, 最終結果是這種不混的作者混不下去,當過
讀者
而現在又是作者的筆者, 對於此一現象有時也頗感無奈。
不管怎樣, 筆者現在已經開始介紹 Windows API 了, 也許真的不想混了,但混
與不混
不是筆者開啟本系列講座最擔心的事情, 筆者所擔心的是這樣的主題對讀者來說
會不會
太枯燥?會不會太艱澀?會不會像筆者當初研讀 Windows API 時, 越研讀心中的
疑問
越多, 就好像進入無底黑洞一樣?
為了避免以上的結果, 在內容的介紹上, 筆者會傾向於即學即用的 API, 短期
內儘量
為了避免以上的結果, 在內容的介紹上, 筆者會傾向於即學即用的 API, 短期
內儘量
避免深入 Windows 無底黑洞地帶, 而會先到那些有花有草地方。
本期筆者想引領您去的地方是:螢幕抓取程式與螢幕保護程式。
------------------------------------------------------------------------
----
----
螢幕抓取程式簡介
------------------------------------------------------------------------
----
----
如果不寫程式, 抓取螢幕圖像的方法是:按下 Print Screen 鍵, 然後開啟
Windows
的小畫家, 接著選取小畫家功能表的「編輯/貼上」, 即可將螢幕圖像複製到小
畫家
的繪圖區域中。
如果寫程式呢?稍後筆者就會介紹, 介紹以前, 建議您先進入筆者的網站下載筆
者所
撰寫的螢幕抓取程式(CopyScr.vbp),一來可瞭解程式的基本運作模式, 二來不必
自己
輸入程式, 此一程式執行後,選取功能表的「我抓我抓我抓抓」, 即可將螢幕的
圖像
複製進來。
圖-1「螢幕抓取程式」
------------------------------------------------------------------------
----
----
螢幕保護程式簡介
------------------------------------------------------------------------
----
----
保護螢幕最簡單的方法就是不用時關掉它, 但有這種好習慣的人實在不多,所以
有人寫
程式偵測滑鼠與鍵盤的輸入, 如果有一段時間沒有滑鼠或鍵盤的輸入,便將電腦
視為沒
程式偵測滑鼠與鍵盤的輸入, 如果有一段時間沒有滑鼠或鍵盤的輸入,便將電腦
視為沒
有人在使用, 而把螢幕顯示成黑色, 用以保護螢幕, 後來又有人覺得黑色太難
看了,
就加了一點動畫, 慢慢地動畫越來越多也越有趣, 結果反倒成為螢幕保護程式不
可或
缺的功能,而不再以保護螢幕為主了。
如何撰寫螢幕保護程式當然也是本期的重點, 同樣的, 介紹以前, 請進入筆者
的網站
下載筆者所撰寫的螢幕保護程式(saver.vbp),此一程式預設的等待時間是 0.5 分
鐘,
如果您等待 30 秒不操作鍵盤與滑鼠,程式便會進入螢幕保護狀態, 您也可以設
定等
待的時間, 如圖-2, 或者直接按下「立刻測試」鈕以檢視螢幕保護程式的動畫。
(特別
注意:請務必以程式右上角的關閉鈕結束程式,不要以 VB 的結束鈕來結束程式,
否則
…, 玩看看, 就知道會有什麼後果)
圖-2 「螢幕保護程式」的設定畫面
瞭解螢幕抓取程式及螢幕保護程式的基本運作模式, 接下來讓筆者來說明相關的
工作概
念。
------------------------------------------------------------------------
----
----
Windows 的繪圖觀念
------------------------------------------------------------------------
----
----
VB 用來繪圖的方法有 Line(畫線及矩形)、Circle(畫圓)、PSet(畫點)、
PaintPicture
(描繪圖片)…等,這些方法有一共通特點 ─ 只能描繪在表單(Form)視窗的「顯示
區域
」(Windows 稱之為 client rectangle), 想跨越顯示區域而把文字或圖形描繪在
視窗
標題區、功能表區、螢幕任意區域…,想都別想, 而以螢幕保護程式為例, 則必
須在
螢幕任意位置繪圖。想在螢幕任意位置繪圖,我們必須先瞭解 Windows 的繪圖觀
念
螢幕任意位置繪圖。想在螢幕任意位置繪圖,我們必須先瞭解 Windows 的繪圖觀
念
繪圖之前, 先取 hDC
------------------------------------------------------------------------
----
----
所有 Windows 的繪圖, 都必須先取得 hDC, 然後以 hDC 呼叫繪圖的 API。
hDC 是 h
andle of DC(Device Context) 的縮寫, 有關 handle 的觀念筆者上一期已經有
所說明
,本期不再重述, 至於 DC 呢?Windows 規定任何程式繪圖之前都必須先配置一
塊繪圖
專用的系統資源(通常是記憶體),這繪圖專用的系統資源就是 DC 啦。DC 與其他
系統資
源一樣, 會有一個唯一的 handle 值, 此一 handle 值便是 hDC。
VB 程式呼叫 Line、Circle、Pset、PaintPicture…等方法時, 表面上好像與 DC
無關
, 但實際上它們都會預先配置好 DC, 然後透過 DC 來繪圖, 您可以查閱表單及
Pic
tureBox 物件的說明文件, 結果可以發現它們都含有 hDC 屬性, 此一屬性即為
表單及
PictureBox 物件用來呼叫 Windows 繪圖函數的 DC handle。
BitBlt:圖像描繪函數
------------------------------------------------------------------------
----
----
二話不說, 讓我們直接觀察一個利用 DC 來繪圖的 API 函數 ─ BitBlt,
BitBlt 的
作用與 PaintPicture 有點類似, 假設表單上含有一 PictureBox, 而此一
PictureB
ox 的 Picture 屬性亦設定有圖片, 若使用 VB 的繪圖功能, 則將
PictureBox 的圖
片繪製在 Form1 的方法是:
Form1.PaintPicture Picture1.Picture, 0, 0
如果使用 BitBlt 函數則是:
ret = BitBlt(Form1.hDC, 0, 0, Picture1.Width, Picture1.Height,
Picture1.hDC,
ret = BitBlt(Form1.hDC, 0, 0, Picture1.Width, Picture1.Height,
Picture1.hDC,
0, 0, SRCCOPY)
作用是把 Picture1 的圖像複製到 Form1, 使用此一函數時, 請特別注意參數四
(如以
上敘述之 Picture1.Width)及參數五(如以上敘述之 Picture1.Height), 這兩個
參數分
別表示長與寬,但單位是「像素」(pixel), 所以執行以上敘述之前, 必須先把
表單的
ScaleMode 屬性都設定成 "3 - 像素" 才可以, 此一 BitBlt 函數之使用實例請
參閱
筆者所完成的 BitBlt.vbp(包含在下載之檔案中)。
螢幕 hDC 的取得與釋回
------------------------------------------------------------------------
----
----
表單及 PictureBox 物件的 DC 是 VB 預先幫我們準備好的, 在螢幕抓取及保護
程式中
,我們則必須呼叫 Windows API 取得螢幕的 DC, 如此方可讀取螢幕的圖像, 以
及複
製圖像到螢幕上。取得螢幕 DC 的函數是 GetDC, 呼叫之敘述如下:
Dim hDC As Long
hDC = GetDC(0)
傳回值 hDC 即等於螢幕的 hDC。在此筆者順便要說明 Windows 另一個重要的觀念
:系
統資源不用時應釋回,所以在我們取得螢幕 DC, 並且完成繪圖之後, 別忘了將
DC 釋
回, 此時呼叫的 API 是:
' hDC 是先前 GetDC(0) 的傳回值
ret = ReleaseDC(0, hDC)
將螢幕圖像複製到 VB 物件中
------------------------------------------------------------------------
----
----
----
介紹 BitBlt 及 GetDC 兩個 API 函數之後, 螢幕抓取程式幾乎是呼之欲出了,
例如使
用以下的敘述可以將螢幕圖像複製到表單物件上:
Dim hDC As Long
hDC = GetDC(0)
ret = BitBlt (Form1.hDC, 0, 0, 螢幕寬, 螢幕高, hDC, 0, 0, SRCCOPY)
ret = ReleaseDC(0, hDC)
不過請注意「螢幕寬」及「螢幕高」兩個參數, 這兩個參數的長度單位是「像素
」,以
640×480 的螢幕為例, 應該指定成 640 及 480, 但問題是別人使用的螢幕可
能不是
640×480, 所以我們應該利用 Screen 物件的 Width 及 Height 屬性讀取螢幕
的寬與
高(註:此時讀取之寬與高是以 Twips 為單位), 然後再利用以下公式求取螢幕以
pix
el 為單位的寬與高:
pixel單位之螢幕寬 = Screen.Width \ Screen.TwipsPerPixelX
pixel單位之螢幕高 = Screen.Height \ Screen.TwipsPerPixelY
將螢幕圖像複製到表單上面的完整程式, 請參閱筆者所完成的 ScrForm.vbp(包含
在下
載之檔案中)。
------------------------------------------------------------------------
----
----
螢幕抓取程式之製作
------------------------------------------------------------------------
----
----
接著請以筆者所完成的 CopyScr.vbp 來例, 讓我們來瞭解螢幕抓取程式還有哪些
地方
該注意。
該注意。
AutoRedraw(自動重繪)屬性的使用
------------------------------------------------------------------------
----
----
首先筆者想請您做個實驗:執行 ScrForm.vbp 程式, 並且複製螢幕圖像到表單上
,接
著以其他視窗蓋住此一表單, 然後再移開, 結果表單上曾經被蓋住的區域其圖像
都會
消失。
解決以上問題常用的方法是將表單的 AutoRedraw(自動重繪)屬性設定為 True,當
我們
將表單的 AutoRedraw 屬性設定為 True 之後, 將來表單若有區域被覆蓋住而又
回到螢
幕前端,則表單都會自動重繪被覆蓋的區域, 使得表單能夠展現原有的圖像。
利用 AutoRedraw 屬性來解決以上的問題看起來十分簡單, 但它有個嚴重的缺點
:當我
們將表單的 AutoRedraw 屬性設定為 True 之後, 表單將會記錄每一個繪圖的動
作,
而當繪圖動作越來越多時,所使用的記憶體將會逐漸增加, 自動重繪的時間也會
越來越
長。為了改善以上的缺點,筆者的作法如下:
Form名.AutoRedraw = True ' 設定自動重繪
...
... 連續性的繪圖動作
...
Set Form名.Picture = Form名.Image ' 將表單的圖像設定成常駐性的圖片
Form名.AutoRedraw = False ' 取消自動重繪
由於 Picture 屬性中的圖片是常駐的, 因此當我們將表單的 Image 屬性(等於表
單上
的圖像)設定給它,便可以將 AutoRedraw 屬性設定為 False, 以避免不必要的重
繪動
作。
作。
以上程式使用了 AutoRedraw、Image、及 Picture 屬性, 這些屬性除了適用於表
單物
件之外,也適用於 PictureBox 物件, 而實際上, 筆者所撰寫的 CopyScr.vbp
並不是
把螢幕複製到表單上,而是複製到 PictureBox 物件之中。
瀏覽圖片的操作介面
------------------------------------------------------------------------
----
----
除了將螢幕圖像複製到 PictureBox 之外, 另一個問題則是螢幕總是比表單的顯
示區域
來得大,以致被複製到 PictureBox 的圖像會超出表單的顯示區域, 為了讓使用
者可以
看到螢幕的全貌,我們必須在表單上佈置捲動軸, 並提供瀏覽的操作介面。
有關大圖片瀏覽程式, 常見的作法是把顯示圖片的 PictureBox 佈置在另一個
Pictur
eBox 裡面, 然後再利用捲動軸調整內部 PictureBox 相對於外部 PictureBox 的
位置
, 而達到瀏覽圖片的目的, 如圖-3。
圖-3 圖片瀏覽程式所需之控制元件及其佈置
至於相關程式則請參考 CopyScr.frm 的 SetPicture 副程式、VScroll1_Change、
及 H
Scroll1_Change 事件程序。
圖片的存檔
------------------------------------------------------------------------
----
----
最後就是圖片的存檔了, VB 提供的存檔敘述是 SavePicture, 呼叫格式如下:
SavePicture 圖片, 檔案名稱
SavePicture 圖片, 檔案名稱
其中「圖片」參數可以是物件的 Picture 屬性或利用 LoadPicture 所載入的
Picture
物件, 以本程式為例, 則指定成 PictureBox 的 Picture 屬性。
------------------------------------------------------------------------
----
----
螢幕保護程式的製作
------------------------------------------------------------------------
----
----
筆者所撰寫的螢幕保護程式, 是將螢幕切割成 M×N 個方塊, 然後在螢幕保護程
式啟
動時,隨機變換任意兩個方塊, 此時所需執行的動作是:
(1) 將 (M1, N1) 座標的方塊複製到一暫存區。
(2) 將 (M2, N2) 座標的方塊複製到 (M1, N1) 座標。
(3) 將暫存區的方塊複製到 (M2, N2) 座標。
假設每一方塊的邊長等於 80, 則所需執行的 BitBlt 敘述如下:
' hDCMem 為暫存區之 hDC
' hDCScreen 為螢幕之 hDC
ret = BitBlt(hDCMem, 0, 0, 80, 80, hDCScreen, M1 * 80, N1 * 80,
SRCCOPY)
ret = BitBlt(hDCScreen, M1 * 80, N1 * 80, 80, 80, hDCScreen, M2 * 80, M2
* 8
0, SRCCOPY)
ret = BitBlt(hDCScreen, M2 * 80, M2 * 80, 80, 80, hDCMem, 0, 0,
SRCCOPY)
暫存區 DC 的取得與釋回
暫存區 DC 的取得與釋回
------------------------------------------------------------------------
----
----
在以上程式中, hDCScreen 是利用 GetDC(0) 取得, 而 hDCMem(暫存區的 DC)則
必須
利用 CreateCompatibleDC 函數來取得, 如下:
Dim hDCMem As Long
hDCMem = CreateCompatibleDC(hDCScreen)
此一函數的作用是建立相容性 DC, 由於傳入的是 hDCScreen(螢幕的 hDC),所以
建立
出來的 hDCMem 將與螢幕相容(主要是色盤之顏色數目相同)。
暫存區 DC 不再使用時應將其釋回, 此時呼叫之 API 是 DeleteDC, 如下:(釋
回螢幕
DC 的函數是 ReleaseDC, 兩者不可以混合使用)
ret = DeleteDC(hDCMem)
CreateCompatibleBitmap:為 DC 建立點陣圖
------------------------------------------------------------------------
----
----
取得 hDCMem 之後, 利用 BitBlt 應該就可以將 hDCScreen 的圖像複製到暫存區
DC
中, 但實際上不然, BitBlt 只對含有「點陣圖」(Bitmap)的 DC 有作用,而經
由 Cr
eateCompatibleDC 所建立的暫存區 DC 一開始是不含點陣圖的, 所以呼叫
BitBlt 函
數並沒有作用, 為了讓 BitBlt 能夠複製圖像到暫存區 DC, 以及從暫存區 DC
讀取圖
像, 我們必須為暫存區 DC 建立點陣圖, 此時呼叫之 API 如下:
Dim hBitmap As Long
hBitmap = CreateCompatibleBitmap(hDCScreen, 寬, 高) ' 建立點陣圖
hBitmap = CreateCompatibleBitmap(hDCScreen, 寬, 高) ' 建立點陣圖
ret = SelectObject(hDCMem, hBitmap) ' 將點陣圖設定給 hDCMem
請特別注意傳入 CreateCompatibleBitmap 的 hDC 是螢幕的 hDC, 不是暫存區的
hDC
, 其作用是建立與螢幕相容的點陣圖(顏色數目與螢幕相同的點陣圖), 而接下來
必須
呼叫 SelectObject 讓此一點陣圖的 handle(hBitmap) 附屬於 hDCMem, 也就是
讓暫存
區 DC 含有點陣圖, 如此一來 hDCMem 方可用於 BitBlt 函數。
點陣圖的釋回
------------------------------------------------------------------------
----
----
不使用點陣圖時, 可呼叫 DeleteObject(hBitmap) 將其釋回, 但請注意附屬於
DC 的
點陣圖是不可以釋回的, 除非 DC 也已經被釋回系統, 例如:
' hBitmap 附屬於 hDCMem
ret = DeleteDC(hDCMem) ' 先釋回 DC
ret = DeleteObject(hBitmap) ' 再釋回點陣圖
螢幕保護程式之動畫
------------------------------------------------------------------------
----
----
使用以上所介紹的 API 函數, 總算可以達到隨機變換螢幕任意兩個方塊的目的了
,請
看筆者所完成的副程式:(此一副程式放置 saver.vbp 專案的 saver.bas 檔案中
,也包
含在下載的檔案中)
含在下載的檔案中)
Sub Saver()
Dim M1 As Long, M2 As Long, N1 As Long, N2 As Long, ret As Long
Dim hDCMem As Long, hDCScreen As Long, hBitmap As Long
Dim sx As Integer, sy As Integer
sx = Screen.Width \ Screen.TwipsPerPixelX ' 以 pixel 為單位之螢幕寬
sy = Screen.Height \ Screen.TwipsPerPixelY ' 以 pixel 為單位之螢幕高
hDCScreen = GetDC(0) ' 取得螢幕 DC
hDCMem = CreateCompatibleDC(hDCScreen) ' 建立暫存區 DC
hBitmap = CreateCompatibleBitmap(hDCScreen, BSize, BSize) ' 建立點陣圖
ret = SelectObject(hDCMem, hBitmap) ' 將點陣圖設定給暫存區 DC
M1 = CInt(Rnd * sx \ BSize)
N1 = CInt(Rnd * sy \ BSize) ' (M1, N1) 為方塊一
M2 = CInt(Rnd * sx \ BSize)
N2 = CInt(Rnd * sy \ BSize) ' (M2, N2) 為方塊二
' 方塊一與方塊二互換
ret = BitBlt(hDCMem, 0, 0, BSize, BSize, hDCScreen, M1 * BSize, N1 *
BSize,
SRCCOPY)
ret = BitBlt(hDCScreen, M1 * BSize, N1 * BSize, BSize, BSize, hDCScreen,
M2
* BSize, N2 * BSize, SRCCOPY)
ret = BitBlt(hDCScreen, M2 * BSize, N2 * BSize, BSize, BSize, hDCMem, 0,
0,
SRCCOPY)
SRCCOPY)
ret = ReleaseDC(0, hDCScreen) ' 釋回螢幕 DC
ret = DeleteDC(hDCMem) ' 釋回暫存區 DC
ret = DeleteObject(hBitmap) ' 釋回點陣圖, 一定要放在 DeleteDC 之後
End Sub
有了 Saver 副程式, 再配合連續的變換動作, 這就是筆者所製作的螢幕保護程
式動畫
。
鍵盤及滑鼠的偵測
------------------------------------------------------------------------
----
----
當螢幕保護程式進入動畫時, 程式必須偵測使用者是否有操作鍵盤或滑鼠,如果
有,
則終止動畫, 並且將螢幕還原, 而當程式離開動畫或尚未進入動畫時,必須偵測
使用
者沒有操作鍵盤或滑鼠的時間是否超過等待時間, 如果是, 則進入動畫。
但是在 Windows 的多工作業環境底下, 所有鍵盤及滑鼠的輸入是由 Windows 統
籌管裡
的, 當使用者操作鍵盤或滑鼠時, 鍵盤與滑鼠的接收者是 Windows,而 Windows
會根
據當時的情況, 決定鍵盤及滑鼠的輸入該傳給哪一個程式或視窗,因此每一個程
式或視
窗只會收到屬於自己的鍵盤及滑鼠輸入。
以上的運作模式就好像電話一樣, 正常情況之下, 每個人都只會收到屬於自己的
電話
,除非, 嘿嘿, 竊聽。在 Windows 的工作模式底下, 想要竊聽鍵盤及滑鼠的輸
入是
可能的,一旦竊聽成功, 屬於其他視窗的鍵盤及滑鼠輸入都會先傳到我們的程式
中。
有關竊聽方面的程式設計, 筆者想留待下一回再介紹, 因為必須說明的觀念實在
不少
,本期請直接使用筆者所完成的鍵盤及滑鼠偵測程式 ─ Saver.vbp 中的 hook.
bas 模
,本期請直接使用筆者所完成的鍵盤及滑鼠偵測程式 ─ Saver.vbp 中的 hook.
bas 模
組, 此一模組雖然沒有提供竊聽的功能, 但可以偵測到是否有鍵盤及滑鼠被輸入
(不管
輸入的對象是哪一個程式或視窗都可以偵測到)。使用 hook.bas 的方法如下:
1. 偵測鍵盤及滑鼠的輸入之前, 呼叫 StartHook 副程式。
2. 呼叫 StartHook 之後, 只要發生鍵盤或滑鼠的輸入, hook 模組便會將鍵盤
或滑鼠
被輸入的時間記錄在 tmKbMouse 全域變數中, 其他程式可以利用目前時間(呼叫
Now
函數)減去此一變數, 得知使用者隔多久沒有操作鍵盤及滑鼠了, 如果超過等待
時間,
便可以進入螢幕保護程式的動畫。
3. 進入螢幕保護程式的動畫之前, 記得把 hook.bas 的 KbMouseDetect 全域變
數設定
為 False, 接著進入螢幕保護狀態之後, 只要使用者再度操作鍵盤或滑鼠,此一
變數
便會被 hook.bas 模組設定 True, 而其他程式可以再判斷此一變數,以停止動畫
並還
原螢幕。
4. 螢幕保護程式結束以前一定要呼叫 FreeHook 副程式, 不然會造成 Windows
運作不
正常, 舉例來說, 筆者所撰寫的 saver.frm 中便是在 Form_Load 事件程序中呼
叫 S
tartHook, 在 Form_Unload 事件程序中呼叫 FreeHook。
螢幕的還原
------------------------------------------------------------------------
----
----
當螢幕保護程式停止動畫時, 我們必須把螢幕還原, 還原的方法有很多種,例如
啟動
動畫之前先儲存螢幕的圖像, 結束時再回存圖像, 不過這個方法比較浪費記憶體
,筆
者使用的方法是把表單隱藏起來, 然後再顯示出來, 接著放到最大, 然後恢復
成原大
小,作用是利用表單覆蓋整個螢幕, 則最後當表單又恢復成原大小時, 螢幕圖像
即會
小,作用是利用表單覆蓋整個螢幕, 則最後當表單又恢復成原大小時, 螢幕圖像
即會
自動還原,程式如下:
Sub RestoreScreen()
Me.Visible = False
Me.Visible = True
Me.WindowState = vbMaximized
Me.WindowState = vbNormal
End Sub
時間的控制
------------------------------------------------------------------------
----
----
除了 saver 及 hook 兩個模組之外, 最重要的事情就是時間的控制了, 在筆者
的 sa
ver 表單中, 佈置了兩個 Timer 控制元件(Timer1 及 Timer2), 其中 Timer2
用來偵
測使用者隔多久沒有操作鍵盤及滑鼠, 若超過等待時間, 則驅動 Timer1 進入動
畫描
繪狀態, 其程式如下:
Private Sub Timer2_Timer()
If DateDiff("s", tmKbMouse, Now) > WaitTime * 60 Then
Timer1.Interval = 10 ' 驅動動畫
End If
End Sub
End Sub
至於 Timer1 則是用來顯示動畫, 並判斷使用者是否操作了鍵盤及滑鼠以決定是
否中斷
動畫,程式如下:
Private Sub Timer1_Timer()
If Not StartSaver Then ' 進入動畫的初始動作
StartSaver = True
KbMouseDetect = False
Exit Sub
End If
If KbMouseDetect Then ' 用者操作了鍵盤或滑鼠
Timer1.Interval = 0
StartSaver = False
RestoreScreen ' 還原螢幕
Else
Saver ' 顯示動畫
End If
End Sub
------------------------------------------------------------------------
----
----
製作您自己的螢幕保護程式
End Sub
------------------------------------------------------------------------
----
----
以上介紹的是筆者所製作的螢幕保護程式, 雖然動畫的部分稍嫌簡單, 但
Windows 技
術的難處均已克服, 如果您想製作自己的螢幕保護程式, 需要修改的是動畫的部
分,
也就是 saver.bas 中的 saver 副程式, 此外, 螢幕保護程式平常是隱藏起來的
,所
以 saver 表單載入後要呼叫 Me.Hide 自我隱藏, 最後則是把編譯成執行檔的螢
幕保護
程式複製到 Windows 的「啟動」資料夾中, 讓 Windows 啟動時, 把螢幕保護程
式載
入系統中。
--
" The Matrix is everywhere, it's all around us, here even in this room.
You
can see it out your window, or on your television. You feel it when
you
go to work, or go to church or pay your taxes. It is the world that has
been
pulled over your eyes to blind you from the truth... Unfortunately,
no one
can be told what the Matrix is. You have to see it for yourself."
Morphe
※ 来源:.武汉白云黄鹤站 bbs.whnet.edu.cn.[FROM: 202.114.3.124]
--
我并不是在等待奇迹,因为我知道没有奇迹的。
有的,也只是爱情、意志和勇气。
是这些东西的重叠后,而成为奇迹的。
所以,我从未曾想过放弃。
※ 修改:·Love1976 於 Apr 6 04:26:46 修改本文·[FROM: 202.112.140.138]
--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: blo0m.bbs@smth.org]
--
※ 转载:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: 202.118.247.254]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:212.059毫秒