Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win


Activating an application and correctly setting the focus

Posted on 2007-11-14
Medium Priority
Last Modified: 2013-11-22
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(ThisWindowClass), nil);
     ShowWindow(Result, SW_RESTORE);
     ShowWindow(Result, SW_SHOWMAXIMIZED);
     SendMessage(Result, WM_ACTIVATEAPP, 1, 0);

Thanks for any help.

Question by:steve-west
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
  • 2
LVL 21

Expert Comment

ID: 20283097
I found some code that does this, here is the link.  check out the section on how to steal focus.


If you need me to provide a Delphi example, I will see what I can do.

Let me know.

Author Comment

ID: 20287767
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).


LVL 21

Accepted Solution

developmentguru earned 2000 total points
ID: 20291463
I used code directly off the link in my example.  I created one program that just had a buton that brought up the modal file open dialog.  I called the form TLaunchDialog and the title was LaunchDialog.  I left it running.  In my second application I used the following code and it works as you stated you wanted it to.

procedure TForm2.Button1Click(Sender: TObject);
  WindowHandle : THandle;

  WindowHandle := FindWindow('TLaunchDialog', 'LaunchDialog');

  if WindowHandle <> 0 then
        GetCurrentThreadID(), true);


        GetCurrentThreadID(), false);

Let me know if you need more.

Author Comment

ID: 20297014
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


procedure TPRIAMCoreMainF.UMEnsureRestored(var Msg: TMessage);
  iCounter : integer;
  ComCounter: Integer;
  HasScreens : boolean;
  // Restore application
  if IsIconic(Application.Handle) then
  if not Visible then
    Visible := True;
  // Ensure all TOPMOST modal screens are brought to the front
  for iCounter := 0 to Screen.FormCount - 1  do
    if Screen.Forms[iCounter].Visible and
      (Screen.Forms[iCounter].FormStyle = fsNormal) and
      // ignore embedded forms
      (not (Screen.Forms[iCounter] is TPriamConnF))  then
        HasScreens := false;
        for ComCounter := 0 to Screen.Forms[iCounter].ComponentCount - 1 do
          if Screen.Forms[iCounter].Components[ComCounter] is TForm then
            HasScreens := true;
        if not HasScreens then

Open in new window


Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
Want to learn how to record your desktop screen without having to use an outside camera. Click on this video and learn how to use the cool google extension called "Screencastify"! Step 1: Open a new google tab Step 2: Go to the left hand upper corn…
This lesson discusses how to use a Mainform + Subforms in Microsoft Access to find and enter data for payments on orders. The sample data comes from a custom shop that builds and sells movable storage structures that are delivered to your property. …
Suggested Courses

636 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