Solved

Window Precedence

Posted on 2000-03-10
7
163 Views
Last Modified: 2011-10-03
I have an application which has a main window, and when you press a button on the main window, other applications launch as part of the program.  Now, when the applications launch, they take over focus of the program with the main program window still running in the background (which is what I desired).  However, my problem is that when I select the main program, my launched application falls behind the main window.  What I want to do is leave the launched application on top of the main window after clicking the main window, but I want the launched window to be gray and disabled until the user clicks on the launched window again.

Also.. I want to be able to set precedence for the different windows.. like say if window foo is open.. and window baz is open.. I want to have a way for my application to determine that baz should remain on top of foo.
0
Comment
Question by:ChrisH
  • 4
  • 3
7 Comments
 
LVL 14

Accepted Solution

by:
mcrider earned 200 total points
ID: 2603963
Add the following code to a MODULE:

'-------------------------------------------------------------------------------
    Public Const HWND_TOPMOST = -1
    Public Const HWND_NOTOPMOST = -2
    Public Const SWP_NOMOVE = 2
    Public Const SWP_NOSIZE = 1
    Public Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE
    Declare Function SetWindowPos Lib "user32" _
        (ByVal hWnd As Long, _
        ByVal hWndInsertAfter As Long, _
        ByVal x As Long, _
        ByVal y As Long, _
        ByVal cx As Long, _
        ByVal cy As Long, _
        ByVal wFlags As Long) As Long
    Declare Function FindWindow Lib "user32" _
        Alias "FindWindowA" (ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long
    Public Sub SetTopMostWindow(ObjHwnd As Long, Optional Switch As Boolean)
        If Switch = True Then
            SetWindowPos ObjHwnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS
        Else
            SetWindowPos ObjHwnd, HWND_NOTOPMOST, 0, 0, 0, 0, FLAGS
        End If
    End Sub
'-------------------------------------------------------------------------------



Then after you launch your external application, do this to make it always on top:

'REPLACE "Untitled - Notepad" with the string in the TitleBar of your launched application
Dim hWnd As Long
hWnd = FindWindow(vbNullString, "Untitled - Notepad")
SetTopMostWindow hWnd, True



And do this to reset it back to normal:

'REPLACE "Untitled - Notepad" with the string in the TitleBar of your launched application
Dim hWnd As Long
hWnd = FindWindow(vbNullString, "Untitled - Notepad")
SetTopMostWindow hWnd, False





Cheers!®©
0
 
LVL 14

Expert Comment

by:mcrider
ID: 2603971
By the way, when you make the call:


   hWnd = FindWindow(vbNullString, "Untitled - Notepad")

if hWnd = 0 then the API did not find the window, so don't call the SetTopMostWindow function....



Cheers!®©
0
 
LVL 1

Author Comment

by:ChrisH
ID: 2604617
Is there a way to get the title name in before the findwindow call?  See.. I launch a window using a Call Shell() function call based on a register value.  Any thoughts?
0
Courses: Start Training Online With Pros, Today

Brush up on the basics or master the advanced techniques required to earn essential industry certifications, with Courses. Enroll in a course and start learning today. Training topics range from Android App Dev to the Xen Virtualization Platform.

 
LVL 1

Author Comment

by:ChrisH
ID: 2604823
Is there a way to get the title name in before the findwindow call?  See.. I launch a window using a Call Shell() function call based on a register value.  Any thoughts?
0
 
LVL 14

Expert Comment

by:mcrider
ID: 2604862
The SetTopMostWindow function I gave you requires a Window Handle and Shell returns an Instance handle...

Check out the following microsoft KB article:

HOWTO: Find a Window Handle from an Instance Handle
http://support.microsoft.com/support/kb/articles/Q242/3/08.ASP?LNG=ENG&SA=MSDN&FR=0 




Cheers!®©
0
 
LVL 1

Author Comment

by:ChrisH
ID: 2605990
Thanks for your help..
0
 
LVL 14

Expert Comment

by:mcrider
ID: 2607091
Thanks for the points! Glad I could help!


Cheers!®©
0

Featured Post

Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction In a recent article (http://www.experts-exchange.com/A_7811-A-Better-Concatenate-Function.html) for the Excel community, I showed an improved version of the Excel Concatenate() function.  While writing that article I realized that no o…
This article describes some techniques which will make your VBA or Visual Basic Classic code easier to understand and maintain, whether by you, your replacement, or another Experts-Exchange expert.
As developers, we are not limited to the functions provided by the VBA language. In addition, we can call the functions that are part of the Windows operating system. These functions are part of the Windows API (Application Programming Interface). U…
Get people started with the process of using Access VBA to control Outlook using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Microsoft Outlook. Using automation, an Access applic…

808 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question