Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Windows Callback, When The Active Window Changed

public class ActiveWindow
{
public delegate void ActiveWindowChangedHandler(object sender, String windowHeader,IntPtr hwnd);
public event ActiveWindowChangedHandler ActiveWindowChanged;

[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

delegate void WinEventDelegate(IntPtr hWinEventHook, uint eventType,
    IntPtr hwnd, int idObject, int idChild, uint dwEventThread,
    uint dwmsEventTime);

const uint WINEVENT_OUTOFCONTEXT = 0;
const uint EVENT_SYSTEM_FOREGROUND = 3;

[DllImport("user32.dll")]
static extern bool UnhookWinEvent(IntPtr hWinEventHook);

[DllImport("user32.dll")]
static extern IntPtr SetWinEventHook(uint eventMin, uint eventMax,
    IntPtr hmodWinEventProc, WinEventDelegate lpfnWinEventProc,
    uint idProcess, uint idThread, uint dwFlags);

IntPtr m_hhook;
private WinEventDelegate _winEventProc;

public ActiveWindow()
{
    _winEventProc = new WinEventDelegate(WinEventProc);
    m_hhook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND,
        EVENT_SYSTEM_FOREGROUND, IntPtr.Zero, _winEventProc,
        0, 0, WINEVENT_OUTOFCONTEXT);
}

void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd,
    int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
{
    if (eventType == EVENT_SYSTEM_FOREGROUND)
    {
        if (ActiveWindowChanged != null)
            ActiveWindowChanged(this,GetActiveWindowTitle(hwnd),hwnd);
    }
}

private string GetActiveWindowTitle(IntPtr hwnd)
{
    StringBuilder Buff = new StringBuilder(500);
    GetWindowText(hwnd, Buff, Buff.Capacity);
    return Buff.ToString();
}

~ActiveWindow()
{
    UnhookWinEvent(m_hhook);
}
}

when i switch between the active windows i get the callback but when i maximize a minimized window i don't get a call back,

i find a work throw to solve this problem, but i am seeking for better solution

any help will be appreciated.

like image 410
HB MAAM Avatar asked Jun 09 '26 12:06

HB MAAM


1 Answers

when i switch between the active windows i get the callback but when i maximize a minimized window i don't get a call back

Yes, you need to use either the EVENT_SYSTEM_MINIMIZESTART or EVENT_SYSTEM_MINIMIZEEND event constant to receive notification of window objects being minimized.

Use the eventMin and eventMax parameters of the SetWinEventHook function to indicate that you're interested in receiving notifications for one of these events and EVENT_SYSTEM_FOREGROUND.

like image 157
Cody Gray Avatar answered Jun 11 '26 03:06

Cody Gray



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!