Имя: Пароль:
1C
1С v8
Нетленка - перехват событий клавиатуры
,
0 247tsm
 
27.10.14
03:13
Доброй ночи, неспящим гуру 1С.
Уже долго бьюсь, но никак не получается перехватить нажатие на клавишу.
У меня 1С8.1.15.14. Использую нетленку 2.2.1.193(СЕ).
Задача с виду простая. В некотором приложении 1С нужно при простое, бездействии пользователя, например,  3 минуты запускать слайд-шоу, а при нажатии на любую клавишу остановить слайд-шоу. Вот код, где я хочу перехватить нажатие:

Каталог = Константы.ПутьКслайдШоу.Получить();

ффф=0;
Пока ффф=0 Цикл
    
    //    Находим все файлы в выбранном каталоге
    НайденныеФайлы = НайтиФайлы(Каталог, "*");
    
    Для каждого файл из НайденныеФайлы Цикл
        
        Если файл.ЭтоКаталог() Тогда
            Продолжить;
        КонецЕсли;
        
        Если ффф<>0 Тогда
            Прервать;
        КонецЕсли;
        
        ИмяФайла = Файл.ПолноеИмя;
        Картинка = Новый Картинка(ИмяФайла);
        Панель.Картинка = Картинка;
        
        глПауза(константы.ВремяПоказаСлайда.Получить());
        
    КонецЦикла;
    
КонецЦикла;

Процедура Пауза(Сек)
    scr = Новый COMОбъект("WScript.Shell");
    scr.Run("ping 127.0.0.1 -n "+СокрЛП(Число(Сек)+1),0,1);
    
    //нн = 1000 * Число(Сек);
    //Для н=1 по нн Цикл
    //    р=1;
    //КонецЦикла;
КонецПроцедуры

При нажатии на клавишу я формирую ффф=5 и, по идее, циклы должны прерваться, но ничего не получается. Просто вечный цикл и всё.
Если я просто без цикла вывожу одну картинку, то после ее вывода отслеживается нажатие клавиши. А в цикле ну никак не хочет. В процедуре Пауза я паузу делал разными способами, но всё равно не  работает отслеживание нажатия, пока не закончится цикл.
Что можно сделать?
Может, у кого-нибудь есть работающий код для подобной задачи? Решение средствами Windows  (screen saver)  прошу не предлагать.
1 247tsm
 
27.10.14
03:19
И вдогонку.
Я еще не знаю, как определить сам простой в 3 минуты. Время можно задать в константах. А дальше, наверно использовать процедуру отслеживания нажатия клавишей, или как-то по-другому?
2 lopus
 
27.10.14
07:42
А обработчик ожидания не пойдет?
3 lopus
 
27.10.14
07:43
Ам сорри тут нужно обрабатывать нажатие
4 Fragster
 
гуру
27.10.14
08:01
как раз обработчик ожидания и подойдет
5 dmpl
 
27.10.14
08:09
(0) Пиши скрин-сейвер отдельно от 1С.

А вообще - ффф = 0 всегда, с чего вдруг оно на 5 сменится?
6 Torquader
 
27.10.14
22:23
Открывайте слайд-шоу в "осле" поверх всего и там же ловите клавиши и закрываете "осла".
7 User_Agronom
 
27.10.14
22:37
Было давно, уже подзабыл: но прерывание опрашивающее клавиатуру можно было запустить двумя способами: первый ждал нажатие клавиши, а второй просто проверял нажата или нет.
На Turbo Pascacal была функция(?) keypressed и функция ReadKey() (точно функция)
8 247tsm
 
27.10.14
23:17
(4) У меня такое впечатление, что перехватчик нажатия клавиши из НЕТЛЕНКИ работает только, когда программа простаивает. А в цикле не работает, т.к. не срабатывает внешнее событие формы.
Попробую обработчик ожидания. Но, наверно, нужны два обработчика. Один, чтобы организовать проверку времени простоя, а другой, чтобы организовать непосредственно слайд-шоу. Время следования слайдов буду задавать в константе. Обработчик ожидания будет в соответствии с этим временем запускать показ очередной картинки. А между показами программа будет простаивать и, значит, можно с помощью НЕТЛЕНКИ отследить нажатие клавиши.
Наверно, так.
(5) А зачем писать screen saver  отдельно от 1С? Он уже есть - стандартный в windows.
(6) Я не такой знаток 1С и не весь сленг понимаю. Что такое "осел"?
9 Torquader
 
27.10.14
23:20
(8) А Screen Saver умеет плакаты показывать ?
P.S. писать Screen Saver очень просто - несколько экспортных функций и правильная обработка нажатия клавиш, ну и вывод чего-то на экран, причём поверх всех окон можно.
10 247tsm
 
27.10.14
23:34
(9) А разве он не показывает картинки из заданной папки?
11 247tsm
 
27.10.14
23:55
А вообще, могут работать два обработчика ожидания сразу? Например, один вызывает процедуру каждые 5 минут, а другой - каждые 20 сек.
12 247tsm
 
27.10.14
23:57
Я имею в виду - второй вызывает другую процедуру, а ту же самую.
13 Torquader
 
27.10.14
23:57
(12) Обработчик будет один, только в нём будет условие когда и что вызывать - так проще.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший