繁体   English   中英

来自ac#windows服务应用程序的钩子窗口事件不起作用

[英]Hook to window events from a c# windows service application does not work

我正在尝试开发一个应用程序,它将挂钩到Windows事件并通知我何时为例如。 活动窗口已更改。 我正在使用Win7 64与.net 4.0 VS 2010
为此,我创建了一个Window Service类型的项目,在其中创建了一个服务安装程序,以及我使用来自user32.dll的SetWinEventHook注册到事件的模板服务项目中的OnStart方法。 一切似乎都很好,除了我没有在传递给SetWinEventHook的回调方法中收到任何东西。 我的代码看起来像这样:

protected override void OnStart(string[] args)
{
    workerThread = new Thread(OnTimer);
    workerThread.Start();
}

public void OnTimer()
{
       UserWatchdog userWatchdog = new UserWatchdog();
        UserWatchdog.SubscribeToWindowEvents();
        ScreenTime.EventLoop.Run();
}
public static WinEventProc _winEventProc = new WinEventProc(WindowEventCallback);
public static void SubscribeToWindowEvents()
    {
        if (windowEventHook == IntPtr.Zero)
        {
            windowEventHook = SetWinEventHook(
            0x00000001,
            0x7FFFFFFF,
            IntPtr.Zero,             // hmodWinEventProc
            _winEventProc,
            0,                       // idProcess
            0,                       // idThread
            WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
         }
    }
    private static void WindowEventCallback(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
    {
        //I NEVER GET HERE
        ScreenTime.WatchdogAnalyzer.analyze(hwnd);
    }

     public static void Run()
    {

        MSG msg;
        while (!_shouldStop)
        {
            WatchdogAnalyzer.printActiveWindow();
            if (PeekMessage(out msg, IntPtr.Zero, 0, 0, PM_REMOVE))
            {
                if (msg.Message == WM_QUIT)
                    break;
                TranslateMessage(ref msg);
                DispatchMessage(ref msg);
            }
        }
    }

你知道为什么我没有赢得Win的活动吗? 谢谢

服务在与用户应用程序不同的Window Station(桌面)上运行。 即使没有服务,也可以有几个窗口站(RDP,UAC等)。

您需要在用户的本地桌面上运行进程并使用它来捕获事件。 然后它可以与服务进行通信。

什么@DavidCrowell说,加上你可能能够使用这个属性的服务(从未尝试过):

在此输入图像描述

根据这个MS页面

在大多数情况下,建议您不要更改允许服务与桌面交互设置。 如果您允许服务与桌面交互,则服务在桌面上显示的任何信息也将显示在交互式用户的桌面上。 然后,恶意用户可以控制服务或从交互式桌面攻击它。

由于这意味着两个桌面上的窗口之间的交互,如果在服务上设置此属性,则可以使用挂钩。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM