William Hindman
wdhindman at bellsouth.net
Tue Sep 9 18:24:15 CDT 2003
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 -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://databaseadvisors.com/pipermail/accessd/attachments/20030909/bd755e95/attachment-0001.html>