會(huì)員登錄 - 用戶注冊(cè) - 網(wǎng)站地圖 Office中國(office-cn.net),專業(yè)Office論壇
當(dāng)前位置:主頁 > 技巧 > Access技巧 > API > 正文

API使用集錦

時(shí)間:2005-06-12 15:37 來源:accessQQ 作者:佚名 閱讀:

記載Windows使用的時(shí)間

有時(shí)候你需要記下每次Windows開啟和關(guān)閉的時(shí)間,下面這個(gè)小程序就可以完成這個(gè)功能,你可以把它放在Windows開始菜單的“啟動(dòng)”文件夾里面,這樣當(dāng)你進(jìn)入Windows時(shí),這個(gè)小程序就會(huì)自動(dòng)啟動(dòng)(不可見),并在你指定的文件中寫下當(dāng)時(shí)的時(shí)間,在你推出Windows系統(tǒng)時(shí),小程序會(huì)關(guān)閉并記下離開的時(shí)間,并關(guān)閉記錄文件。

Private Sub Form_Load()

Left = -10000

Top = -10000

Open "c:\apps\log.txt" For Append As #1

Print #1, "On: " & CStr(Now)

Close #1

End Sub

Private Sub Form_Unload(Cancel As Integer)

Open "c:\apps\log.txt" For Append As #1

Print #1, "Off:" & CStr(Now)

Close #1

End

End Sub


--------------------------------------------------------------------------------

怎樣關(guān)閉一個(gè)正在運(yùn)行的程序

 

你可以使用API函數(shù)FindWindow和PostMessage去尋找指定的窗口,并關(guān)閉它。下面的例子教給你怎樣找到并關(guān)掉一個(gè)Caption為“Caluclator”的程序。

 

Dim winHwnd As Long

Dim RetVal As Long

winHwnd = FindWindow(vbNullString, "Calculator")

Debug.Print winHwnd

If winHwnd <> 0 Then

RetVal = PostMessage(winHwnd, WM_CLOSE, 0&, 0&)

If RetVal = 0 Then

MsgBox "置入消息錯(cuò)誤!"

End If

Else

MsgBox "Calculator沒有打開!"

End If

 

為了讓以上的代碼工作,你必須在模塊文件中什么以下API函數(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, lParam As Any) As Long

Public Const WM_CLOSE = &H10


--------------------------------------------------------------------------------

我怎樣確定我的程序是否在運(yùn)行?

 

把以下代碼放在第一個(gè)窗體的Form_Load事件中:

 

If App.PrevInstance = True Then

Call MsgBox("這個(gè)程序正在運(yùn)行!",_

vbExclamation)

End

End If


--------------------------------------------------------------------------------

怎樣延遲一個(gè)VB程序?

 

延遲在VB中非常有意義!舉個(gè)例子,有時(shí)你需要等待一個(gè)額外的過程完成,才能運(yùn)行程序下面的代碼。延遲使程序擺脫了CPU的運(yùn)算速度對(duì)程序運(yùn)行速度的影響,但是在VB中卻沒有延遲這個(gè)很多語言都有的現(xiàn)成函數(shù),所以還要依靠API函數(shù),請(qǐng)看以下的代碼:

 

Declare Sub Sleep Lib "kernel32" _

(ByVal dwMilliseconds As Long)

 

'延遲1秒

Call Sleep(1000)


--------------------------------------------------------------------------------

怎樣改變雙擊鼠標(biāo)的時(shí)間間隔?

 

在較短時(shí)間里連續(xù)的點(diǎn)擊兩次鼠標(biāo)就會(huì)造成鼠標(biāo)雙擊事件。你可以調(diào)用API函數(shù)SetDoubleClickTime改變鼠標(biāo)雙擊所需要的時(shí)間,它只有一個(gè)參數(shù),并可精確到毫秒級(jí)。

 

Declare Function SetDoubleClickTime _

Lib "user32" Alias "SetDoubleClickTime" _

(ByVal wCount As Long) As Long

 

提示:這種改變將影響到整個(gè)操作系統(tǒng)。


--------------------------------------------------------------------------------

怎樣找到鼠標(biāo)指針的XY坐標(biāo)?

 

在很多的作圖軟件中都有一個(gè)小的區(qū)域顯示當(dāng)前屏幕上的光標(biāo)位置,這利用API函數(shù)非常容易做到,下面的例子將演示使用代碼如何返回當(dāng)前光標(biāo)的XY的坐標(biāo)值。

 

步驟:

在VB5中建立一個(gè)新項(xiàng)目文件,F(xiàn)orm1使用默認(rèn)設(shè)置.

選擇菜單的“Project/add Module”,建立一個(gè)新的模塊文件“Moudule1”。

輸入以下代碼聲明API函數(shù)。

Option Explicit

Type POINTAPI ' Declare types

x As Long

y As Long

End Type

Declare Function GetCursorPos Lib "user32" _

(lpPoint As POINTAPI) As Long ' Declare API

把焦點(diǎn)移到Form1,添加兩個(gè)標(biāo)簽對(duì)象(Label)和一個(gè)計(jì)時(shí)器對(duì)象(Timer1),把計(jì)時(shí)器的Interval屬性設(shè)為1,然后雙擊Form1的任何區(qū)域,在代碼窗口中輸入:

 

 

Option Explicit

Dim z As POINTAPI ' 聲明變量

 

Private Sub Timer1_Timer()

GetCursorPos z ' 得到坐標(biāo)

Label1 = "x: " & z.x ' 得到X坐標(biāo)

Label2 = "y: " & z.y ' 得到Y(jié)坐標(biāo)

End Sub

 

5、按F5運(yùn)行程序,移動(dòng)鼠標(biāo)注意觀察兩個(gè)標(biāo)簽對(duì)象的變化。


--------------------------------------------------------------------------------

怎樣捕捉窗體的鼠標(biāo)?

 

這個(gè)技巧將向您展示如何使用捕捉光標(biāo)的API函數(shù)阻止鼠標(biāo)指針移出窗體。

 

注意。喝绻绑w的BorderStyle屬性被設(shè)為sizeable(2或5),則當(dāng)你改變窗體的大小時(shí)鼠標(biāo)就會(huì)“逃脫”程序的監(jiān)控!因此你最好把BorderStyle設(shè)為0、1、3或4。

 

步驟:

 

把以下代碼添加如模塊:

 

Option Explicit

Type RECT

Left As Long

Top As Long

Right As Long

Bottom As Long

End Type

Declare Function ClipCursor Lib "user32" _

(lpRect As Any) As Long

 

Public Sub DisableTrap(CurForm As Form)

Dim erg As Long

'聲明過程變量

'設(shè)置新坐標(biāo)

Dim NewRect As RECT

CurForm.Caption = "釋放鼠標(biāo)"

With NewRect

.Left = 0&

.Top = 0&

.Right = Screen.Width / Screen.TwipsPerPixelX

.Bottom = Screen.Height / Screen.TwipsPerPixelY

End With

erg& = ClipCursor(NewRect)

End Sub

Public Sub EnableTrap(CurForm As Form)

Dim x As Long, y As Long, erg As Long

'聲明過程變量

'設(shè)置新坐標(biāo)

Dim NewRect As RECT

'得到TwipsperPixel

'窗體的ScaleMode必須設(shè)為Twips!。

x& = Screen.TwipsPerPixelX

y& = Screen.TwipsPerPixelY

CurForm.Caption = "捕捉鼠標(biāo)"

'設(shè)置光標(biāo)的范圍

With NewRect

.Left = CurForm.Left / x&

.Top = CurForm.Top / y&

.Right = .Left + CurForm.Width / x&

.Bottom = .Top + CurForm.Height / y&

End With

erg& = ClipCursor(NewRect)

End Sub

 

2、在窗體上添加兩個(gè)命令按鈕(Command Button)。

 

3、把以下代碼添加如Form1。

Private Sub Command1_Click()

EnableTrap Form1

End Sub

Private Sub Command2_Click()

DisableTrap Form1

End Sub

Private Sub Form_Unload(Cancel As Integer)

'程序結(jié)束時(shí)釋放鼠標(biāo)。

DisableTrap Form1

End Sub


--------------------------------------------------------------------------------

怎樣使我的程序總處于屏幕最前方?(Always on top)

 

如果你想讓你的程序處于前方,可以使用以下代碼:

 

Form1.ZOrder

 

配合計(jì)時(shí)器使用,每隔一段很小的時(shí)間間隔調(diào)用這種方法可以使窗體Form1處于屏幕前方,但是用戶還是可能使別的窗體在短暫的時(shí)間里處于Form1的上方。所以這種方法并不能使窗體真正的實(shí)現(xiàn)Always on top,而要真正的Always on top可以使用API函數(shù)SetWindowPos,代碼如下:

 

'聲明函數(shù):

Declare Function SetWindowPos Lib "user32" _

(ByVal h%, ByVal hb%, ByVal x%, ByVal y%, _

ByVal cx%,ByVal cy%,ByVal f%) As Integer

Global Const SWP_NOMOVE = 2

Global Const SWP_NOSIZE = 1

Global Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE

Global Const HWND_TOPMOST = -1

Global Const HWND_NOTOPMOST = -2

'把窗體放在最前面:

 

res% = SetWindowPos (Form1.hWnd, HWND_TOPMOST, _

0, 0, 0, 0, FLAGS)

'如果res%=0, 就產(chǎn)生錯(cuò)誤

 

'使窗體恢復(fù)普通模式:

res% = SetWindowPos (Form1.hWnd, HWND_NOTOPMOST, _

0, 0, 0, 0, FLAGS)


--------------------------------------------------------------------------------

怎樣得到文本框(TextBox)中的文本行數(shù)?

 

計(jì)算文本框中輸入文本的行數(shù)可以使用SendMessage函數(shù)返回,當(dāng)一行文字發(fā)生環(huán)繞時(shí),它將被當(dāng)作新的一行,而被非簡(jiǎn)單的計(jì)算文本中的換行符個(gè)數(shù)。

 

把以下API函數(shù)的聲明添入模塊文件的general declarations區(qū)域,如果您使用的是VB4-32或VB5,也可以把此聲明添入Form1的general declarations中,并把所有的“Public”更換為“Private”。

 

Option Explicit

 

Public Declare Function SendMessageLong Lib _

"user32" Alias "SendMessageA" _

(ByVal hwnd As Long, _

ByVal wMsg As Long, _

ByVal wParam As Long, _

ByVal lParam As Long) As Long

 

Public Const EM_GETLINECOUNT = &HBA

Form Code

Sub Text1_Change()

Dim lineCount as Long

On Local Error Resume Next

 

'得到/顯示文本行數(shù)

lineCount = SendMessageLong(Text1.hwnd, EM_GETLINECOUNT, 0&, 0&)

Label1 = Format$(lineCount, "##,###")

End Sub

 

注釋:

為了使本程序成功,請(qǐng)?jiān)谠O(shè)計(jì)階段把文本框的Multiline屬性設(shè)為True。


--------------------------------------------------------------------------------

怎樣使程序的標(biāo)題條閃爍?

 

建立新的項(xiàng)目文件,添加模塊文件,并填寫如下代碼:

 

Public Declare Function FlashWindow _

Lib "user32" (ByVal hwnd As Long, _

ByVal bInvert As Long) As Long

 

在窗體中添加兩個(gè)按鈕和一個(gè)計(jì)時(shí)器,并用設(shè)置以下屬性:

 

command1.caption="開始"

command2.caption="停止"

timer1.interval=500 '每0.5秒閃爍一次

timer1.enabled=false

 

Private Sub Timer1_Timer()

a& = FlashWindow(Me.hwnd, 1)

End Sub

 

Private Sub Command1_Click()

Timer1.Enabled = True

End Sub

 

Private Sub Command2_Click()

Timer1.Enabled = False

End Sub

(責(zé)任編輯:admin)

頂一下
(0)
0%
踩一下
(0)
0%
發(fā)表評(píng)論
請(qǐng)自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動(dòng)的言論。
評(píng)價(jià):