Пользовательский ввод под Local System

Тема в разделе "WASM.WIN32", создана пользователем solvitz, 2 мар 2011.

  1. solvitz

    solvitz Member

    Публикаций:
    0
    Регистрация:
    28 авг 2010
    Сообщения:
    86
    Имеется системный сервис работающий под правами Local System. То есть сервис не интерактивный и не может воспринимать клавиатурный ввод так как Windows сопоставляет его с невидимым WindowStation - объектом.
    Вопрос: как сделать, чтобы данный сервис мог считывать клавиатурный ввод с видимых окон?

    Пробовал создавать сервис как SERVICE_WIN32_INTERACTIVE_PROCESS но тут загвоздка в другом, как SERVICE_WIN32_OWN_PROCESS он прекрасно работает, но мне нужно, чтобы он был SERVICE_WIN32_SHARE_PROCESS то есть работал в одном процессе с другими сервисами.
     
  2. solvitz

    solvitz Member

    Публикаций:
    0
    Регистрация:
    28 авг 2010
    Сообщения:
    86
    any ideas?
     
  3. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Нужен вспомогательный процес.
     
  4. solvitz

    solvitz Member

    Публикаций:
    0
    Регистрация:
    28 авг 2010
    Сообщения:
    86
    Костыль ИМХО. Хотелось бы более изящное решение.
     
  5. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    solvitz

    Наверное что-то типа:

    - создать поток;
    - в процедуре потока вызвать dll с реализацией SetWindowsHookEx на WH_KEYBOARD_LL и ассоциированой с потоком.

    Но эта так... навскидку.
    :))
     
  6. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Это не костыль, это и есть самое изящное решение из возможных. Именно так работает весь нормальный софт с сервисами.
     
  7. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Как это поможет преодолеть границы WindowStation? Хуки, ЕМНИП, действуют лишь в пределах одной WinSta.
     
  8. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    В пределах одного десктопа
     
  9. solvitz

    solvitz Member

    Публикаций:
    0
    Регистрация:
    28 авг 2010
    Сообщения:
    86
  10. solvitz

    solvitz Member

    Публикаций:
    0
    Регистрация:
    28 авг 2010
    Сообщения:
    86
    Данный код полностью решает проблему:
    Код (Text):
    1. SetCurrentDesktop()
    2. {
    3.     HDESK deskTop;
    4.     HWINSTA hwinsta;
    5.     hwinsta = OpenWindowStation("winsta0", true, GENERIC_ALL);
    6.         if(hwinsta)
    7.         {
    8.             if(SetProcessWindowStation(hwinsta))
    9.                 {
    10.  
    11.                         if((deskTop=OpenInputDesktop(0, TRUE, MAXIMUM_ALLOWED)))
    12.                         {
    13.                               SetThreadDesktop(deskTop);
    14.                         }
    15.                 }
    16.         }
    17.     return 0;
    18. }