[AccessD] Automation between 2 applications

Backroads Data backroad at idir.net
Wed Sep 10 08:24:48 CDT 2003


William,

That's good enough for me.  Thanks again.

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 6:24 PM
  Subject: Re: [AccessD] Automation between 2 applications


  Julie

  ...I've not used Win95 in so long I can't remember ...it does work fine in Win98, NT, Win2K, and WinXP ...and I use it in runtime environments all the time ...I'm sure that WinMe will work because its just W98 with media crap glued on ...Win95 should work because the API calls are the same afaik but I can't verify it ...I toss every W95 disk I find :))))

  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:51 PM
    Subject: Re: [AccessD] Automation between 2 applications


    William -

    Quick question - you said:
        "...works like a charm in all versions ...HTH :))))"

    Does that apply to Windows versions as well?  This is an Access97 runtime application (installed with Sagekey scripts), that is running on everything from Windows95 up.  Thanks.

    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



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


  _______________________________________________
  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/20030910/cafc66cf/attachment-0001.html>


More information about the AccessD mailing list