5

Basically, how do I tell if my program is layered above all the other ones?

slugster
  • 49,403
  • 14
  • 95
  • 145
Jon
  • 2,566
  • 6
  • 32
  • 52

4 Answers4

13

A fairly simple way is to P/Invoke GetForegroundWindow() and compare the HWND returned to the application's form.Handle property.

using System;
using System.Runtime.InteropServices;

namespace MyNamespace
{
    class GFW
    {
        [DllImport("user32.dll")]
        private static extern IntPtr GetForegroundWindow();

        public bool IsActive(IntPtr handle)
        {
            IntPtr activeHandle = GetForegroundWindow();
            return (activeHandle == handle);
        }
    }
}

Then, from your form:

if (MyNamespace.GFW.IsActive(this.Handle))
{
  // Do whatever.
}
Euric
  • 339
  • 2
  • 6
  • So this will be run instantly when it becomes the topmost form? – Jon Aug 21 '12 at 05:04
  • No, the code sample above just checks to see whether you have the foreground window. To execute code when you become the foreground window you'll have to use SetWinEventHook. – Euric Aug 21 '12 at 05:30
  • Thanks so much, I've taken an hours for search this solution on google but now you're my hero – Viet Nguyen Aug 21 '15 at 14:19
1

You can use:

if (GetForegroundWindow() == Process.GetCurrentProcess().MainWindowHandle)
{
     //do stuff
}

WINAPI imports (at class level):

[System.Runtime.InteropServices.DllImport("user32.dll")] public static extern bool GetForegroundWindow();

Assign a property to hold the value, and add the check to the form's GotFocus event through IDE, or after InitializeComponent();

e.g.:

//.....
InitalizeComponent();
this.GotFocus += (myFocusCheck);
//...

private bool onTop = false;

private void myFocusCheck(object s, EventArgs e)
{
    if(GetFore......){ onTop = true; }
}
Chibueze Opata
  • 9,856
  • 7
  • 42
  • 65
  • Two problems - I need it to tell when it becomes the topmost window, and I don't know where to put the imports. – Jon Aug 21 '12 at 05:02
0

If your window inherits form, you can check Form.Topmost property

0

A good solution is given by this answer to an identical question: https://stackoverflow.com/a/7162873/386091

/// <summary>Returns true if the current application has focus, false otherwise</summary>
public static bool ApplicationIsActivated()
{
    var activatedHandle = GetForegroundWindow();
    if (activatedHandle == IntPtr.Zero) {
        return false;       // No window is currently activated
    }

    var procId = Process.GetCurrentProcess().Id;
    int activeProcId;
    GetWindowThreadProcessId(activatedHandle, out activeProcId);

    return activeProcId == procId;
}


[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int GetWindowThreadProcessId(IntPtr handle, out int processId);

The currently accepted solution by Euric doesn't work if your program shows a dialog box or has detachable windows (like if you use a windows docking framework).

Community
  • 1
  • 1
Ron
  • 1,888
  • 20
  • 25