c#全局系统挂钩,用于检测活动窗口的更改

时间:2014-08-03 12:40:27

标签: c#

我一直在使用以下代码来检测C#的活动窗口的变化,但在奇怪的情况下,当它肯定发生时,它根本不会记录活动窗口的变化。在大多数情况下,它的工作非常好。我已经看了一下,但在我看来,我唯一能做的就是转向C ++来获得可靠的解决方案,但在此之前,我想我会问下面代码的问题。

GlobalEventHook.Start();
GlobalEventHook.WinEventActive += new EventHandler(GlobalEventHook_WinEventActive);                         //set up the global hook events

private void GlobalEventHook_WinEventActive(object sender, EventArgs e)
{
// do whatever
}  

using System;
using System.Collections;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace Pro
{
public static class GlobalEventHook
{
    [DllImport("user32.dll")]
    internal static extern IntPtr SetWinEventHook(uint eventMin, uint eventMax, IntPtr hmodWinEventProc, 
        WinEventDelegate lpfnWinEventProc, uint idProcess, uint idThread, uint dwFlags);

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

    public static event EventHandler WinEventActive = delegate { };
    public static event EventHandler WinEventContentScrolled = delegate { };

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

    private static WinEventDelegate dele = null;
    private static IntPtr _hookID = IntPtr.Zero;



    public static void Start()
    {
        dele = new WinEventDelegate(WinEventProc);
        _hookID = SetWinEventHook(Win32API.EVENT_SYSTEM_FOREGROUND, Win32API.EVENT_SYSTEM_FOREGROUND, IntPtr.Zero, dele, 0, 0, Win32API.WINEVENT_OUTOFCONTEXT);
    }

    public static void stop()
    {
        UnhookWinEvent(_hookID);
    }

    public static void restart()
    {

        _hookID = SetWinEventHook(Win32API.EVENT_SYSTEM_FOREGROUND, Win32API.EVENT_SYSTEM_FOREGROUND, IntPtr.Zero, dele, 0, 0, Win32API.WINEVENT_OUTOFCONTEXT);
    }

    public static void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
    {
        try
        {
            if (eventType == Win32API.EVENT_SYSTEM_FOREGROUND)
            {
                if (hwnd == Win32API.GetForegroundWindow())
                {
                    WinEventActive(null, new EventArgs());
                }                    
            }                                    
        }

        catch (Exception exc)
        {
        }
    }

0 个答案:

没有答案