Крюк к окну событий из приложения службы ac # windows не работает

1

Я пытаюсь разработать приложение, которое будет подключаться к событиям Windows и уведомлять меня, когда, например. активное окно изменилось. Я использую Win7 64 с.net 4.0 VS 2010
Для этого я создал проект типа Window Service, создал в нем установщик служб и метод OnStart из проекта службы шаблонов, который я зарегистрировал для событий, используя SetWinEventHook из user32.dll. Все кажется прекрасным, за исключением того факта, что я не получаю ничего в методе обратного вызова, переданного 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? спасибо

  • 1
    Как говорит Дэвид, вы не хотите реализовывать это как службу Windows. Просто создайте обычную программу Windows, возможно, без пользовательского интерфейса, и попросите пользователя запустить ее, включив в свою папку «Автозагрузка» или через записи реестра, которые автоматически запускают программы.
Теги:
events
hook

2 ответа

2
Лучший ответ

Служба работает на другой Window Station (Desktop), чем пользовательские приложения. Даже без сервисов может быть несколько оконных станций (RDP, UAC и т.д.).

Вам нужно будет запустить процесс на локальном рабочем столе пользователя и использовать его для обнаружения событий. Затем он может связаться с сервисом.

1

Что сказал @DavidCrowell, плюс вы, возможно, сможете использовать это свойство для службы (никогда не пробовали):

Изображение 174551

На этой странице MS,

В большинстве случаев рекомендуется не разрешать службе "Разрешить" взаимодействовать с настройками рабочего стола. Если вы разрешаете службе взаимодействовать с рабочим столом, любая информация, отображаемая службой на рабочем столе, также будет отображаться на интерактивном рабочем столе пользователя. Затем злоумышленник может взять под свой контроль сервис или атаковать его с интерактивного рабочего стола.

Поскольку это подразумевает взаимодействие между окнами на двух рабочих столах, вы можете использовать свой крючок, если вы установите это свойство в службе.

  • 1
    Я не уверен, но я не думаю, что это будет работать для целей ОП. Сервис может взаимодействовать с рабочим столом, но я не думаю, что это тот же рабочий стол Windows, который использует пользователь.
  • 0
    Читая это: msdn.microsoft.com/en-us/library/aa983650(v=vs.71).aspx Я точно выяснил, что сказал Дэвид Кроуэлл, они работают на разных оконных станциях, поэтому я не могу получить оконные окна от другой станции. Спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню