Windows回调,活动窗口更改时

时间:2012-02-14 04:47:12

标签: c# .net wpf windows-7

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 个答案:

答案 0 :(得分:5)

  

当我在活动窗口之间切换时,我得到回调但是当我最大化最小化窗口时,我没有得到回叫

是的,您需要使用EVENT_SYSTEM_MINIMIZESTARTEVENT_SYSTEM_MINIMIZEEND event constant来接收最小化窗口对象的通知。

使用SetWinEventHook functioneventMineventMax参数表示您有兴趣接收其中一项 {{1}的通知}}