steve-west
asked on
Activating an application and correctly setting the focus
I've a series of applications which can be used concurrently. The user can switch between the applications without alt-tabbing, from within each application.
This works fine, but...
If application A switches to application B, and application B has a modal dialog open, it's the main form which is shown - not the modal dialog. The user then clicks on the main form and of course nothing happens other than a series of beeps. The user has to alt tab to bring the modal dialog into view and then close this to allow access to the application.
How can I achieve the same result as alt-tabbing? This is how I'm doing it at the moment...
Result := FindWindow(Pchar(ThisWindo wClass), nil);
ShowWindow(Result, SW_RESTORE);
ShowWindow(Result, SW_SHOWMAXIMIZED);
SendMessage(Result, WM_ACTIVATEAPP, 1, 0);
Thanks for any help.
Steve
This works fine, but...
If application A switches to application B, and application B has a modal dialog open, it's the main form which is shown - not the modal dialog. The user then clicks on the main form and of course nothing happens other than a series of beeps. The user has to alt tab to bring the modal dialog into view and then close this to allow access to the application.
How can I achieve the same result as alt-tabbing? This is how I'm doing it at the moment...
Result := FindWindow(Pchar(ThisWindo
ShowWindow(Result, SW_RESTORE);
ShowWindow(Result, SW_SHOWMAXIMIZED);
SendMessage(Result, WM_ACTIVATEAPP, 1, 0);
Thanks for any help.
Steve
ASKER
Thank you for this, but I don't see any topics within the link which are relevant.
There is a section which relates to setting the focus to a KNOWN modal dialog but this is not what I'm after.
Application A switches to application B.
Application B could have nth number of Modal dialog boxes opened on top of each other. The way I'm currently doing this results in only the main form of application B showing, but with the dialog boxes open, the application is effectively disabled.
I need to do exactly what Alt-tabbing does - i.e. show the topmost dialog. I could send a message to the application telling it to show the topmost dialog, but how do I do this (showing the window that is, not the messagey part).
Regards
Steve
There is a section which relates to setting the focus to a KNOWN modal dialog but this is not what I'm after.
Application A switches to application B.
Application B could have nth number of Modal dialog boxes opened on top of each other. The way I'm currently doing this results in only the main form of application B showing, but with the dialog boxes open, the application is effectively disabled.
I need to do exactly what Alt-tabbing does - i.e. show the topmost dialog. I could send a message to the application telling it to show the topmost dialog, but how do I do this (showing the window that is, not the messagey part).
Regards
Steve
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
I agree, the solution you propose will return focus to an application with an open modal dialog.
The problem with this method, you have to know the class of the form you are bringing to the front. The applications that the user can switch between them hold over 3000 forms so it's not practical to code for each class type.
I've eventually managed to implement this successfully with the following approach.
1. Switch to application B from A by finding application's B main window and showing that.
2. Send application B a user defined message
3. When Application B receives this, it runs through the list of all open screens and for any screen which itself has an open screen, then bring the topmost screen to the front.
Since your solution does work, although not really suitable for my situation, I'll award the points.
Thanks fro your help
Steve
The problem with this method, you have to know the class of the form you are bringing to the front. The applications that the user can switch between them hold over 3000 forms so it's not practical to code for each class type.
I've eventually managed to implement this successfully with the following approach.
1. Switch to application B from A by finding application's B main window and showing that.
2. Send application B a user defined message
3. When Application B receives this, it runs through the list of all open screens and for any screen which itself has an open screen, then bring the topmost screen to the front.
Since your solution does work, although not really suitable for my situation, I'll award the points.
Thanks fro your help
Steve
procedure TPRIAMCoreMainF.UMEnsureRestored(var Msg: TMessage);
var
iCounter : integer;
ComCounter: Integer;
HasScreens : boolean;
begin
//
// Restore application
if IsIconic(Application.Handle) then
Application.Restore;
if not Visible then
Visible := True;
Application.BringToFront;
//
// Ensure all TOPMOST modal screens are brought to the front
for iCounter := 0 to Screen.FormCount - 1 do
begin
if Screen.Forms[iCounter].Visible and
(Screen.Forms[iCounter].FormStyle = fsNormal) and
//
// ignore embedded forms
(not (Screen.Forms[iCounter] is TPriamConnF)) then
begin
HasScreens := false;
for ComCounter := 0 to Screen.Forms[iCounter].ComponentCount - 1 do
begin
if Screen.Forms[iCounter].Components[ComCounter] is TForm then
begin
HasScreens := true;
TForm(Screen.Forms[iCounter].Components[ComCounter]).BringToFront;
Break;
end;
end;
if not HasScreens then
Screen.Forms[iCounter].BringToFront;
end;
end;
end;
http://www.codeproject.com/dialog/dlgboxtricks.asp?df=100&forumid=3124&exp=0&select=1718923
If you need me to provide a Delphi example, I will see what I can do.
Let me know.