|
楼主 |
发表于 2011-7-8 07:45:29
|
显示全部楼层
无论程序在何地,只能运行一个应用程序示例
模块中:
'程序实现功能:自动激活前一个实例
Public Declare Function ReleaseMutex Lib "kernel32" (ByVal hMutex As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As SECURITY_ATTRIBUTES, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function FlashWindowEx Lib "user32.dll" (ByRef pfwi As FLASHWINFO) As Long
Private Const FLASHW_STOP = 0 '停止闪烁,系统恢复窗体到她原始的状态.
Private Const FLASHW_CAPTION = &H1 '闪烁窗体的标题
Private Const FLASHW_TRAY = &H2 '闪烁任务栏
Private Const FLASHW_ALL = (FLASHW_CAPTION Or FLASHW_TRAY) '标题栏&窗体标题一起闪烁
Private Const FLASHW_TIMER = &H4 '连续的闪烁,直到设置了FLASHW_STOP标志
Private Const ERROR_ALREADY_EXISTS = 183&
Private Const SW_RESTORE = 9
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Private Type FLASHWINFO
cbSize As Long '结构大小
hwnd As Long
dwFlags As Long
uCount As Long '闪烁的次数
dwTimeout As Long '闪烁的时间
End Type
Public Mutex As Long
Private Sub Main()
Dim sa As SECURITY_ATTRIBUTES
Dim hwnd As Long
Dim FlashInfo As FLASHWINFO
sa.bInheritHandle = 1
sa.lpSecurityDescriptor = 0
sa.nLength = Len(sa)
Mutex = CreateMutex(sa, 1, App.Title) '试着创建一个新的互斥体
If (Err.LastDllError = ERROR_ALREADY_EXISTS) Then '互斥体已经存在,表明已打开一个实例
hwnd = GetSetting("AppName", "Section", "Key", 0) '找到我们保存的前一个实例的句柄,这样避免了使用FindWindow函数等对变标题程序的无奈
ShowWindow hwnd, SW_RESTORE '显示窗口
SetForegroundWindow hwnd '激活窗体
FlashInfo.cbSize = Len(FlashInfo)
FlashInfo.dwFlags = FLASHW_ALL Or FLASHW_TIMER
FlashInfo.dwTimeout = 0 '以毫秒为单位指定窗体闪烁的速率,如果为0,则使用默认的光标闪烁速率.
FlashInfo.hwnd = hwnd
FlashInfo.uCount = 3 '指定闪烁的次数.
FlashWindowEx FlashInfo '闪烁效果
Else
FrmMain.Show '显示主窗体
End If
End Sub
窗体中:
Private Sub Form_Load()
SaveSetting "AppName", "Section", "Key", Me.hwnd '临时保存我们的窗体句柄
End Sub
Private Sub Form_Unload(Cancel As Integer)
ReleaseMutex Mutex '释放互斥体,没有这两句,你在VB环境下这可以运行一次,再次按F5的时候你会发现自动退出
CloseHandle Mutex
DeleteSetting "AppName", "Section", "Key" '清除我们在注册表种存放的数据,绿色效果。
End Sub
|
|