William Hindman
wdhindman at bellsouth.net
Tue Sep 9 18:27:38 CDT 2003
...just passing along what another AccessD member gave me a long time back when I had virtually the same question ...pass it along to someone else here when the opportunity arises :)
William Hindman
So, then, to every man his chance -- to every man, regardless of his birth, his shining golden opportunity -- to every man his right to live, to work, to be himself, to become whatever his manhood and his vision can combine to make him -- this, seeker, is the promise of America.
-- Thomas Wolfe
----- Original Message -----
From: Backroads Data
To: Access Developers discussion and problem solving
Sent: Tuesday, September 09, 2003 2:29 PM
Subject: Re: [AccessD] Automation between 2 applications
William -
This looks awesome - thanks so much! I'll begin working with it this afternoon.
Best Regards,
Julie Schwalm
Backroads Data
www.backroadsdata.com
785-594-6807
----- Original Message -----
From: William Hindman
To: Access Developers discussion and problem solving
Sent: Tuesday, September 09, 2003 12:06 PM
Subject: Re: [AccessD] Automation between 2 applications
Julie
...I've used the following code since A97 in my Autoexec macro to handle multiple instances of my Access apps being opened by users ...it should meet all of your stated needs ...just modify the IfThen to call your process.
...copy and insert the following module as mdlCheckMultipleInstances
Option Compare Database
Option Explicit
' Module mdlCheckMultipleInstances
' © Graham Mandeno, Alpha Solutions, Auckland, NZ
' graham at alpha.co.nz
Private Const cMaxBuffer = 255
Private Declare Function apiGetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function apiGetDesktopWindow Lib "user32" _
Alias "GetDesktopWindow" _
() As Long
Private Declare Function apiGetWindow Lib "user32" _
Alias "GetWindow" _
(ByVal hwnd As Long, _
ByVal wCmd As Long) _
As Long
Private Const GW_CHILD = 5
Private Const GW_HWNDNEXT = 2
Private Declare Function apiGetWindowText Lib "user32" _
Alias "GetWindowTextA" _
(ByVal hwnd As Long, _
ByVal lpString As String, _
ByVal aint As Long) _
As Long
Private Declare Function apiSetActiveWindow Lib "user32" _
Alias "SetActiveWindow" _
(ByVal hwnd As Long) _
As Long
Private Declare Function apiIsIconic Lib "user32" _
Alias "IsIconic" _
(ByVal hwnd As Long) _
As Long
Private Declare Function apiShowWindowAsync Lib "user32" _
Alias "ShowWindowAsync" _
(ByVal hwnd As Long, _
ByVal nCmdShow As Long) _
As Long
Private Const SW_SHOW = 5
Private Const SW_RESTORE = 9
Public Function winGetClassName(hwnd As Long) As String
Dim sBuffer As String, iLen As Integer
sBuffer = String$(cMaxBuffer - 1, 0)
iLen = apiGetClassName(hwnd, sBuffer, cMaxBuffer)
If iLen > 0 Then
winGetClassName = Left$(sBuffer, iLen)
End If
End Function
Public Function winGetTitle(hwnd As Long) As String
Dim sBuffer As String, iLen As Integer
sBuffer = String$(cMaxBuffer - 1, 0)
iLen = apiGetWindowText(hwnd, sBuffer, cMaxBuffer)
If iLen > 0 Then
winGetTitle = Left$(sBuffer, iLen)
End If
End Function
Public Function winGetHWndDB(Optional hWndApp As Long) As Long
Dim hwnd As Long
winGetHWndDB = 0
If hWndApp <> 0 Then
If winGetClassName(hWndApp) <> "OMain" Then Exit Function
End If
hwnd = winGetHWndMDI(hWndApp)
If hwnd = 0 Then Exit Function
hwnd = apiGetWindow(hwnd, GW_CHILD)
Do Until hwnd = 0
If winGetClassName(hwnd) = "ODb" Then
winGetHWndDB = hwnd
Exit Do
End If
hwnd = apiGetWindow(hwnd, GW_HWNDNEXT)
Loop
End Function
Public Function winGetHWndMDI(Optional hWndApp As Long) As Long
Dim hwnd As Long
winGetHWndMDI = 0
If hWndApp = 0 Then hWndApp = Application.hWndAccessApp
hwnd = apiGetWindow(hWndApp, GW_CHILD)
Do Until hwnd = 0
If winGetClassName(hwnd) = "MDIClient" Then
winGetHWndMDI = hwnd
Exit Do
End If
hwnd = apiGetWindow(hwnd, GW_HWNDNEXT)
Loop
End Function
Public Function winCheckMultipleInstances(Optional fConfirm As Boolean = True) As Boolean
Dim fSwitch As Boolean, sMyCaption As String
Dim hWndApp As Long, hWndDb As Long
On Error GoTo ProcErr
sMyCaption = winGetTitle(winGetHWndDB())
hWndApp = apiGetWindow(apiGetDesktopWindow(), GW_CHILD)
Do Until hWndApp = 0
If hWndApp <> Application.hWndAccessApp Then
hWndDb = winGetHWndDB(hWndApp)
If hWndDb <> 0 Then
If sMyCaption = winGetTitle(hWndDb) Then Exit Do
End If
End If
hWndApp = apiGetWindow(hWndApp, GW_HWNDNEXT)
Loop
If hWndApp = 0 Then Exit Function
If fConfirm Then
If MsgBox(sMyCaption & " is already open@" _
& "Do you want to open a second instance of this database?@", _
vbYesNo Or vbQuestion Or vbDefaultButton2) = vbYes Then Exit Function
End If
apiSetActiveWindow hWndApp
If apiIsIconic(hWndApp) Then
apiShowWindowAsync hWndApp, SW_RESTORE
Else
apiShowWindowAsync hWndApp, SW_SHOW
End If
Application.Quit
ProcEnd:
Exit Function
ProcErr:
MsgBox err.Description
Resume ProcEnd
End Function
...then put this as a RunCode in your AutoExec macro
winCheckMultipleInstances (True)
...works like a charm in all versions ...HTH :))))
William Hindman
So, then, to every man his chance -- to every man, regardless of his birth, his shining golden opportunity -- to every man his right to live, to work, to be himself, to become whatever his manhood and his vision can combine to make him -- this, seeker, is the promise of America.
-- Thomas Wolfe
----- Original Message -----
From: Backroads Data
To: AccessD
Sent: Tuesday, September 09, 2003 11:59 AM
Subject: [AccessD] Automation between 2 applications
Hello Group,
I have 2 (related) questions on this subject...
Question 1: If another application (it's not Access, I believe it's C++) uses the Shell command to launch my Access application, and the Access app is already open, will this simply make the Access app "active", or will it launch a 2nd instance of it? (I'm wanting it to make my app active, not open another copy.)
Question 2: Is there any kind of "Application.Activation" event I can hook into? If the above issue can be resolved to activate the Access app, I need Access to go to a specific form and process a small amount of data from the launching application. (I can do this if the other app actually opens the Access app, but am not sure if I can call this processing routine when the already-open app is activated.)
Thanks in advance for any direction you can provide.
Best Regards,
Julie Schwalm
Backroads Data
www.backroadsdata.com
785-594-6807
--------------------------------------------------------------------------
_______________________________________________
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com
----------------------------------------------------------------------------
_______________________________________________
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com
------------------------------------------------------------------------------
_______________________________________________
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://databaseadvisors.com/pipermail/accessd/attachments/20030909/457557aa/attachment-0001.html>