Обратный вызов Windows, когда активное окно изменилось - PullRequest
2 голосов
/ 14 февраля 2012
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);
}
}

когда я переключаюсь между активными окнами, я получаю обратный вызов но когда я максимизирую свернутое окно, мне не перезванивают,

Я найду работу, чтобы решить эту проблему, но я ищу лучшее решение

любая помощь будет оценена.

1 Ответ

5 голосов
/ 14 февраля 2012

когда я переключаюсь между активными окнами, я получаю обратный вызов, но когда я максимизирую свернутое окно, я не получаю обратного вызова

Да, вам нужно использовать либо EVENT_SYSTEM_MINIMIZESTART или EVENT_SYSTEM_MINIMIZEEND константа события для получения уведомления о свернутых объектах окна.

Используйте параметры eventMin и eventMax функции SetWinEventHook чтобы указать, что вы заинтересованы в получении уведомлений об одном из этих событий и EVENT_SYSTEM_FOREGROUND.

...