Имеется системный сервис работающий под правами Local System. То есть сервис не интерактивный и не может воспринимать клавиатурный ввод так как Windows сопоставляет его с невидимым WindowStation - объектом. Вопрос: как сделать, чтобы данный сервис мог считывать клавиатурный ввод с видимых окон? Пробовал создавать сервис как SERVICE_WIN32_INTERACTIVE_PROCESS но тут загвоздка в другом, как SERVICE_WIN32_OWN_PROCESS он прекрасно работает, но мне нужно, чтобы он был SERVICE_WIN32_SHARE_PROCESS то есть работал в одном процессе с другими сервисами.
solvitz Наверное что-то типа: - создать поток; - в процедуре потока вызвать dll с реализацией SetWindowsHookEx на WH_KEYBOARD_LL и ассоциированой с потоком. Но эта так... навскидку. )
Это не костыль, это и есть самое изящное решение из возможных. Именно так работает весь нормальный софт с сервисами.
Как это поможет преодолеть границы WindowStation? Хуки, ЕМНИП, действуют лишь в пределах одной WinSta.
Данный код полностью решает проблему: Код (Text): SetCurrentDesktop() { HDESK deskTop; HWINSTA hwinsta; hwinsta = OpenWindowStation("winsta0", true, GENERIC_ALL); if(hwinsta) { if(SetProcessWindowStation(hwinsta)) { if((deskTop=OpenInputDesktop(0, TRUE, MAXIMUM_ALLOWED))) { SetThreadDesktop(deskTop); } } } return 0; }