![]() |
|
![]() |
|
Verificar si la base de datos que se abre ya ha sido abierta |
|
![]() Volver |
'********************************************************* ' El siguiente código se encarga de averiguar si ya ' existe una instancia abierta de la base de datos que ' se está abriendo en ese momento. ' ' Ejemplo de uso: ' ' If PrevInstance = True Then ' MsgBox "Ya existe una instancia de la base actual" ' DoCmd.Quit ' End If ' ' Autor: Juan M. Afán de Ribera ' Fecha: Junio 2004 ' ' ¿Por qué? porque alguien lo preguntó y a mí me gusta ' complicarme la vida... ' Private Declare Function FindWindowEx Lib "user32.dll" _ Alias "FindWindowExA" _ (ByVal hWnd1 As Long, _ ByVal hWnd2 As Long, _ ByVal lpsz1 As String, _ ByVal lpsz2 As String) As Long Private Declare Function GetWindow Lib "user32.dll" _ (ByVal hwnd As Long, _ ByVal wCmd As Long) As Long Private Declare Function GetDesktopWindow _ Lib "user32.dll" () As Long Private Declare Function GetWindowText Lib "user32.dll" _ Alias "GetWindowTextA" _ (ByVal hwnd As Long, _ ByVal lpString As String, _ ByVal cch As Long) As Long Private Declare Function GetClassName Lib "user32.dll" _ Alias "GetClassNameA" _ (ByVal hwnd As Long, _ ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long Private Const GW_HWNDNEXT = 2& Private Const GW_CHILD = 5& ' Esta función enumera las ventanas abiertas y comprueba ' que no sea otra ventana de Access. En caso de que ' encuentre una, compara los títulos de las ventanas ' de base de datos. Si son iguales es que ya hay una ' instancia abierta de la base de datos. ' Function PrevInstance() As Boolean Dim sODb1 As String, sODb2 As String, sClass As String Dim hwnd As Long ' averiguamos el título de la ventana Base de Datos sODb1 = ODbCaption(hWndAccessApp) ' enumeramos las ventanas abiertas hwnd = GetWindow(GetDesktopWindow, GW_CHILD) sClass = Space(255) Do If hwnd Then ' si la ventana no es la de nuestra aplicación If hwnd <> hWndAccessApp Then ' averiguamos el nombre de la clase de ventana Call GetClassName(hwnd, sClass, 255) ' si la ventana es una ventana de Access... If Trim(sClass) = "OMain" & vbNullChar Then sODb2 = ODbCaption(hwnd) ' si la ventana base de datos tiene el mismo ' título que la nuestras, es que ya está ' abierta If sODb2 = sODb1 Then PrevInstance = True Exit Function End If End If End If sClass = Space(255) ' obtenemos el manipulador de la siguiente ' ventana abierta hwnd = GetWindow(hwnd, GW_HWNDNEXT) Else Exit Do End If Loop End Function ' Esta función devuelve el título de la ventana base de ' datos de una aplicación de Access. El argumento hwnd ' ha de ser la propiedad hWndAccessApp (manipulador de ' la ventana principal de Access) ' Function ODbCaption(hwnd As Long) As String Dim sODb As String Dim hMDi As Long, hODb As Long ' obtenemos el manipulador de ventana de la ventana ' MDI de Access hMDi = FindWindowEx(hwnd, 0&, "MDIClient", vbNullString) ' obtenemos el manipulador de ventana de la ventana ' base de datos hODb = FindWindowEx(hMDi, 0&, "ODb", vbNullString) ' averiguamos el título de la ventana base de datos sODb = String(255, " ") Call GetWindowText(hODb, sODb, 255) ODbCaption = Trim(sODb) End Function |
![]() |
Última actualización 15/06/2004 © Juan M. Afán deRibera |