VB 聲明
Declare Function CreateSemaphore Lib "kernel32" Alias "CreateSemaphoreA" (lpSemaphoreAttributes As SECURITY_ATTRIBUTES, ByVal lInitialCount As Long, ByVal lMaximumCount As Long, ByVal lpName As String) As Long
作用是創建一個信號
這裡給出返回值介紹,日後會交大家如何破解這種多開
返回值介紹
返回類型:Long
當返回= 0
就會調用GetLastError
若是出現同名的信號 則GetLastError會返回ERROR_ALREADY_EXISTS
參數介紹
lpSemaphoreAttributes
指定一個SECURITY_ATTRIBUTES的結構體 也可以傳遞零值(將參數類型設為Long)即
Declare Function CreateSemaphore Lib "kernel32" Alias "CreateSemaphoreA" (lpSemaphoreAttributes As Long, ByVal lInitialCount As Long, ByVal lMaximumCount As Long, ByVal lpName As String) As Long
lInitialCount
設置信號的初始計數,這裡設置窗體最多可開幾個視窗與 lMaximumCount設同值
lMaximumCount
設置信號的最大計數,這裡設置窗體最多可開幾個視窗與lInitialCount設同值
lpName
信號對象的名稱
再來 還有一個函數
WaitForSingleObject的用法
聲明
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
參數
hHandle 就是句柄!!
dwMilliseconds 就是等待時間
如果有信號狀態返回值=0
但是如果時間超過dwMilliseconds的值 我們設為0 (就是立即判斷)
且無信號狀態 則返回WAIT_TIMEOUT
開始編寫代碼
On Error Resume Next
Dim FormName As String
Dim a, b As Long
FormName = "UserForm"
a = CreateSemaphore(0, 3, 3, FormName)
b = WaitForSingleObject(a, 0)
If b <> 0 Then
MsgBox "程式只能3開", vbOKOnly + 16, "錯誤"
End
End If
加在Form的Load事件裡就可以限制了
留言列表