窗口回调,当活动窗口更改时

本文关键字:窗口 回调 活动 | 更新日期: 2023-09-27 18:24:18

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);
}
}

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

我找到了一个工作来解决这个问题,但我正在寻找更好的解决方案

任何帮助将不胜感激。

窗口回调,当活动窗口更改时

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

是的,您需要使用 EVENT_SYSTEM_MINIMIZESTARTEVENT_SYSTEM_MINIMIZEEND 事件常量来接收窗口对象最小化的通知。

使用 SetWinEventHook 函数的eventMineventMax参数来指示你有兴趣接收其中一个事件的通知EVENT_SYSTEM_FOREGROUND