当应用程序是一个服务SetWinEventHook回调不工作(SetWinEventHook cal

2019-10-20 20:38发布

我在挂钩赢活动和使用回调赶窗口事件,像这样的.NET 4.0开发的应用:

    //import the methos from the dll
    [DllImport("user32.dll", SetLastError = true)]
    private static extern IntPtr SetWinEventHook(int eventMin, int eventMax, IntPtr hmodWinEventProc, WinEventProc lpfnWinEventProc, int idProcess, int idThread, int dwflags);
    //declare a callback
    public static WinEventProc _winEventProc = new WinEventProc(WindowEventCallback);
    //pass this callback to SetWinEventHook
    SetWinEventHook(
            EVENT_SYSTEM_FOREGROUND, // eventMin
            EVENT_SYSTEM_FOREGROUND, // eventMax
            IntPtr.Zero,             // hmodWinEventProc
            _winEventProc,
            0,                       // idProcess
            0,                       // idThread
            WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
   //define somthing in callback
   private static void WindowEventCallback(IntPtr hWinEventHook, uint eventType, IntPtr      hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
    {
        Logger.Instance.Write("WindowEventCallback");
    }
    //the loop that reads the messages
     while (true)
        {
            if (PeekMessage(out msg, IntPtr.Zero, 0, 0, PM_REMOVE))
            {
                if (msg.Message == WM_QUIT)
                    break;
                TranslateMessage(ref msg);
                DispatchMessage(ref msg);
            }
        }

此代码工作完美,当应用程序被配置为一个控制台应用程序。 但我希望它作为服务运行,所以我改变了一下循环,因为我们不能在服务的OnStart方法连续循环。 于是我做了一个定时器,在像这样一个50毫秒的间隔读取消息:

MSG msg;
        if (PeekMessage(out msg, IntPtr.Zero, 0, 0, PM_REMOVE))
        {
            TranslateMessage(ref msg);
            DispatchMessage(ref msg);
        }
//

我也改变了整个应用程序,我创建了一个新的项目作为一个窗口服务创建的服务安装程序,并使其运行。 它运行OK作为一种服务,但我没有得到事件的通知。 我的假设是,有运行的应用程序作为服务时,一些问题与Windows权限。
应用程序是使用Visual Studio Win7上64发2010 .NET 4.0
你对我为什么不赶在活动通知的任何想法?
谢谢

文章来源: SetWinEventHook callback does not work when app is a service