Andrea Nagar
Andrea Nagar

Reputation: 1263

How to position a form on top of another form without taking the focus

My application needs to display a popup near the cursor position of any active application when certain conditions are met (known by my app).

So I would like to display the form (without stealing the focus from the active application). I tried using ShowWindow with the SW_SHOWNOACTIVATE param but, this way, the my form is displayed under the currently active form.

How can I force my form to be displayed on top of any form active on the screen without stealing the input focus?

Thanks.

Upvotes: 4

Views: 1294

Answers (2)

David Anderson
David Anderson

Reputation: 13690

What you want is to use the TopMost property of the form you want to stay on top.

Upvotes: 1

Edwin Groenendaal
Edwin Groenendaal

Reputation: 2324

You need to add a bit of plumbing to the pop-up form so you can override the WM_ACTIVATE message:

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_ACTIVATE)
        {
            if (((int)m.WParam & 0xFFFF) != WA_INACTIVE)
            {
                if (m.LParam != IntPtr.Zero)
                {
                    SetActiveWindow(m.LParam);
                }
                else
                {
                    // Could not find sender, just in-activate it.
                    SetActiveWindow(IntPtr.Zero);
                }
            }
        }

        base.WndProc(ref m);
    } 

Make sure you add the following to your pop-up form as well:

    [DllImport("user32.dll")]
    private extern static IntPtr SetActiveWindow(IntPtr handle);
    private const int WM_ACTIVATE = 6;
    private const int WA_INACTIVE = 0;

You can use the pop-up form as you would any other, by calling Show() on it. You can make it the top-most window through the TopMost property, as with other forms.

Upvotes: 0

Related Questions