С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
FastTI
10 / 10 / 7
Регистрация: 29.08.2014
Сообщений: 84
1

GetForegroundWindow() не работает в службе

18.05.2016, 14:47. Просмотров 403. Ответов 8
Метки нет (Все метки)

Здравствуйте. Пишу сервис и возникла проблема с методом GetForegroundWindow(). При поиске активного окна.Метод возвращает 0.

C#
1
2
3
4
[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
public static extern IntPtr GetForegroundWindow();
 
IntPtr handleActive = GetForegroundWindow() // = 0;
При чем все работает из консоли. Но не работает со службы. Я читал что вроде как там защита и из сервиса нет возможности десктопа считывать, но есть ли решение данной проблемы?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2016, 14:47
Ответы с готовыми решениями:

Объявление GetForegroundWindow
Здравствуйте. Хочу получить активное окно, нашёл такой код public string...

Использование таймера в службе
Здравствуйте. есть решение с двумя проектами: служба windows и библиотека...

Вызов функции в службе
Необходимо написать службу которая будет отслеживать подключение USB устройств....

Найти косяки в службе
Написал свою первую службу. По задумке она через определенное время очищает...

Получение информации о службе
Как средствами c# узнать тип запуска службы (автоматически или вручную) и...

8
quwy
Native x86
3338 / 2184 / 650
Регистрация: 13.02.2013
Сообщений: 7,239
18.05.2016, 15:00 2
Возможно поможет галка "разрешить взаимодействие с рабочим столом" в свойствах сервиса.

Но я бы на вашем месте подумал о том, что должна была бы вернуть эта функция, работай она как вы ожидаете, если в систему залогинено сразу несколько пользователей.
0
FastTI
10 / 10 / 7
Регистрация: 29.08.2014
Сообщений: 84
18.05.2016, 15:02  [ТС] 3
Цитата Сообщение от quwy Посмотреть сообщение
Возможно поможет галка "разрешить взаимодействие с рабочим столом" в свойствах сервиса.
Не помогает эта галка. пробовал((
0
OwenGlendower
Супер-модератор
Эксперт .NET
9698 / 8440 / 3614
Регистрация: 17.03.2014
Сообщений: 16,901
Записей в блоге: 1
18.05.2016, 15:03 4
FastTI, сервис может работать когда в системе нет пользователей или когда их несколько. Поэтому в общем это неправильная постановка задачи. Зачем твоей службе информация о foreground окне?
0
FastTI
10 / 10 / 7
Регистрация: 29.08.2014
Сообщений: 84
18.05.2016, 15:09  [ТС] 5
посредством сервиса я получаю активное окно и уже исходя из его активности произвожу закрытие проги.
когда я проверяю свой код из консоли или winForms/wpf все отрабатывает и в переменную записывается имя процесса (того что мне нужно). А из сервиса этого не происходит. Имя процесса "Idle" оно не определяется.
0
OwenGlendower
Супер-модератор
Эксперт .NET
9698 / 8440 / 3614
Регистрация: 17.03.2014
Сообщений: 16,901
Записей в блоге: 1
18.05.2016, 15:13 6
FastTI, сделай дополнительную программу которая будет работать в сеансе пользователя и общаться c сервисом через WCF или любой удобный способ межпроцессного общения. Клиентская программа сможет вызывать GetForegroundWindow() и любые другие необходимые функции.
1
quwy
Native x86
3338 / 2184 / 650
Регистрация: 13.02.2013
Сообщений: 7,239
18.05.2016, 15:14 7
Цитата Сообщение от FastTI Посмотреть сообщение
А из сервиса этого не происходит
Вам уже дважды сказали, почему сервис не должен видеть пользовательских окон.
Напишите обычную безоконную программу и поместите ее в автозагрузку, тогда никаких проблем с GetForegroundWindow() не будет.
0
FastTI
10 / 10 / 7
Регистрация: 29.08.2014
Сообщений: 84
18.05.2016, 15:25  [ТС] 8
Цитата Сообщение от quwy Посмотреть сообщение
Вам уже дважды сказали, почему сервис не должен видеть пользовательских окон.
ну не должен не значит не может. В этом и вопрос как можно обойти данную проблему (не определение службой десктопа)

Цитата Сообщение от quwy Посмотреть сообщение
Напишите обычную безоконную программу и поместите ее в автозагрузку, тогда никаких проблем с GetForegroundWindow() не будет.
это то что я делаю сейчас... Но мне нужно чтобы от программы остался максимум один запущенный процесс и больше нигде не было "следов" от нее.

Добавлено через 1 минуту
Цитата Сообщение от OwenGlendower Посмотреть сообщение
сделай дополнительную программу которая будет работать в сеансе пользователя и общаться c сервисом через WCF или любой удобный способ межпроцессного общения
Пока для меня это темный лес. Но, спасибо копну глубже.
0
quwy
Native x86
3338 / 2184 / 650
Регистрация: 13.02.2013
Сообщений: 7,239
18.05.2016, 15:28 9
Цитата Сообщение от FastTI Посмотреть сообщение
В этом и вопрос как можно обойти данную проблему
Никак, логика работы системы не предполагает подобного взаимодействия.

Цитата Сообщение от FastTI Посмотреть сообщение
Но мне нужно чтобы от программы остался максимум один запущенный процесс и больше нигде не было "следов" от нее.
И в чем проблема? Обычная (не консольная) программа без форм проявляет себя только строчкой в диспетчере процессов. Ни окон, ни кнопок на панели задач она не создает. Для управления можно заставить ее добавить иконку с контекстным меню в системный трей, но это совсем не обязательно.
1
18.05.2016, 15:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2016, 15:28

Обработка глобальных исключений в службе
Добрый день! Подскажите пожалуйста. Не получается сделать обработку...

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

Определение нажатой клавиши в службе Windows
Всем привет. Пишу службу для винды. Мне нужно определить нажата ли клавиша и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru