Файл ярлыка не всегда запускается при нажатии клавиши быстрого доступа

522
Divin3

У меня в компании маленькие рабочие станции ~ 13 дюймов с сенсорным экраном.
Операционная система: Microsoft Windows Embedded Standard 6.1.7601 Service Pack 1 Build 7601
Рабочие станции имеют 5 кнопок, которые могут быть сопоставлены для любой комбинации клавиш. (пример ctrl+alt+shift+[any key on the keyboard])

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

Итак, я:
- создал командный файл, который при запуске проверяет, запущены ли программы, если нет, то запускает их;
- создал ярлык командного файла ( %appdata%\Microsoft\Windows\Start Menu\Programsкак предложено здесь );
- добавлена ​​комбинация клавиш (ctrl + alt + s);
- назначил одну из кнопок на рабочей станции привязке клавиш.

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

После устранения неполадок я понял, что одна из программ вызывает проблему.
Позволяет называть программы Aи B. Когда Bили рабочий стол находится впереди, комбинация клавиш работает правильно и запускает пакетный файл. Aработает в полноэкранном режиме. Поэтому, когда комбинация клавиш нажата, когда она Aнаходится спереди, она не работает.
Таким образом, я назначил alt + tabкомбинацию клавиш для другой кнопки, но тут возникает проблема.

Если я ранее нажимал ctrl + alt + Sкомбинацию клавиш, когда Aнаходился спереди, впоследствии она не будет работать даже после того, как я переключился Bна рабочий стол или на него.

Что делает его более интересным, так это то, что, если я создаю еще одну клавишу быстрого вызова для другого файла ярлыка, скажем, ctrl + alt + Dи запустим ее после того, как ctrl + alt + Sперестал работать, он исправит это и ctrl + alt + Sначнет работать снова, пока Bрабочий стол не окажется в фокусе.

Пробовал это, не сработало.
Красный этот форум. Нет решения.

Я ищу решение / обходной путь / другой метод для решения этой проблемы.

Я не хочу устанавливать какие-либо сторонние программы. Однако я могу изменить настройки и реестр, если это необходимо.

РЕДАКТИРОВАТЬ:

Пакетный файл

echo off tasklist /FI "IMAGENAME eq progB.exe" 2>NUL | find /I /N "progB.exe">NUL if "%ERRORLEVEL%"=="1" ( cd C:\<progB path> start /MAX progB.exe  )  tasklist /FI "IMAGENAME eq progA.exe" 2>NUL | find /I /N "progA.exe">NUL if "%ERRORLEVEL%"=="1" C:\<progA path>  exit 
2
Сочетания клавиш всегда были облупленными. Решением для перебора было бы планировать выполнение командного файла каждую минуту. Если программы запущены, я не думаю, что это будет заметно пользователю. harrymc 8 лет назад 1
@harrymc - я думал о чем-то похожем, но это может вызвать проблемы, если работник сканирует и программа теряет фокус. Также рабочие станции работают немного медленно, и даже для такого простого пакетного файла, как этот, требуется 5-10 секунд для запуска. Divin3 8 лет назад 0
5-10 секунд, чтобы просто определить, что программы работают? Если вы опубликуете пакетный файл, мы сможем улучшить его. harrymc 8 лет назад 0
@harrymc - обновлено. Это занимает много времени, потому что рабочие станции работают слишком медленно Divin3 8 лет назад 0
Я не знаю, что у вас есть в этих системах. WMIC может быть быстрее: `Процесс WMIC получает подпись | find / i / n "prog.exe`. Существует также Get-Process Powershell, а также Powershell через WMI: Get-WMIObject Win32_Process. harrymc 8 лет назад 0
@harrymc - на станциях установлены процессоры Intel Atom с тактовой частотой 1,6 ГГц, 2 ГБ оперативной памяти, 32 ГБ SSD. Процессор как раз достаточен для запуска необходимых программ. Даже открытие окна проводника иногда кажется вечностью в этих системах. Проверено WMIC, это гораздо более элегантное решение, но, кажется, имеет ту же скорость или даже медленнее Divin3 8 лет назад 0
Вопросы: (1) Можно ли модифицировать progA / B самостоятельно? (2) Можете ли вы представить новые программы? (3) Если нет, приемлемо ли это по соображениям безопасности и приемлема ли новая программа, скомпилированная вами? (4) Если вы откроете cmd и сделаете «dir / path / to // file», будет ли каталог также медленным? harrymc 8 лет назад 0
@harrymc - 1. обе программы имеют INI-файл, который можно изменить. Я не нашел в них ничего, что могло бы быть полезным. 2. Я могу, но не хочу, потому что у меня могут возникнуть проблемы, если материнская компания сочтет это «небезопасным». 3. Простые файлы reg / batch принимаются до тех пор, пока я не смогу дать объяснения своему боссу в случае, если меня спросят. Были случаи, когда я вводил простые переносимые исполняемые файлы, но только когда запрашивалось решение проблемы, и это был единственный возможный способ ее решения. 4. Чтобы дать вам представление, `dir` в system32 на рабочей станции занимает ~ 20 секунд для 2470 файлов. Divin3 8 лет назад 0
Это не оставляет слишком много возможностей для более быстрого обнаружения. Блокирует ли progA / B исключительно какой-либо файл? harrymc 8 лет назад 0
Или вы можете назвать progA / B следующим образом: «prog 2 >> file». Это заблокирует файл исключительно, поэтому ваш скрипт может запустить прогу, если файл не существует или если его можно удалить. harrymc 8 лет назад 0
@harrymc - я не понимаю этот метод. Не могли бы вы уточнить это? Divin3 8 лет назад 0
«prog 2 >> file» запускает прогу с перенаправлением файла ошибки, также называемого stderr в Linux, на котором большинство программ обычно ничего не пишут. Во время работы программы файл заблокирован и не может быть удален, поскольку он используется. Если вы можете добавить «2 >> file» к вызову программы, дайте мне знать, и я протестирую его и добавлю ответ, подробно описывающий метод. См. [Перенаправление ввода / вывода и каналы] (http://sourcedaddy.com/windows-7/io-redirection-and-pipes.html). harrymc 8 лет назад 0
@harrymc - да, это работает, файл создан и заблокирован. Обратите внимание, что мне также понадобится метод, чтобы можно было закрыть программу без ее автоматического запуска в случае обслуживания. Divin3 8 лет назад 0
Я добавил свой ответ. harrymc 8 лет назад 0
Просто быстрый совет - вы попробовали инструмент AutoHotkey? Я читал случаи, когда он мог поймать нажатые клавиши, которые не были обработаны функцией горячей клавиши Windows. Это немного более сложное решение, но вы можете попробовать. xpac 8 лет назад 0
@xpac - Я не могу устанавливать сторонние программы, потому что это противоречит политике компаний. Divin3 8 лет назад 0

2 ответа на вопрос

1
harrymc

Решение для перебора - планировать выполнение командного файла каждую минуту. Цель состоит в том, что, если программы работают, эта проверка не будет заметна пользователю.

К сожалению, на этих медленных компьютерах, работающих под управлением Windows Embedded Standard 6, список задач и его вариант работают слишком медленно, поэтому нам нужно найти другой механизм для проверки, работают ли программы. К счастью, кажется, что проверка на наличие файла все еще очень быстро.

Механизм, который я предлагаю, заключается в запуске программ с использованием следующего синтаксиса:

prog 2 >> \path\to\lockfile 

Параметр «2 >> file» означает, что файл ошибок программы prog перенаправлен в файл блокировки. Этот файл, также называемый stderr в Linux, обычно никогда не записывается в большинство программ. Во время работы программы файл заблокирован и не может быть удален, поскольку он используется. Если программа остановлена, файл может существовать или не существовать, но его можно удалить.

Вот пример сценария, который проверяет, существует ли файл и может ли он быть удален. Я добавил команды echo, полезные при отладке такого скрипта.

@echo off if exist \path\to\lockfile ( echo lockfile exists del \path\to\lockfile if exist \path\to\lockfile ( echo lockfile is locked - program is running ) else ( echo lockfile was deleted - program is not running **launch program here** ) ) else ( echo lockfile doesn't exist - program is not running **launch program here** ) 

Чтобы закрыть программу без ее автоматического запуска, как для обслуживания, отключите планирование пакетного файла.

Или, если это слишком хлопотно, добавьте еще один файл под названием «обслуживание» и проверьте его наличие в командном файле, ничего не делая, если он существует. Удалите файл после завершения обслуживания.

Для тестирования можно заблокировать файл с помощью этого пакетного скрипта. Нажмите любую клавишу, чтобы остановить:

pause 2 >> \path\to\lockfile 

Рекомендации :

Я проверю это и дам отзыв как можно скорее Divin3 8 лет назад 0
Я также считаю это лучшим решением. У меня есть одна проблема, с которой я столкнулся. Я должен заставить командный файл работать в фоновом режиме. Он не должен украсть фокус даже для вспышки, потому что это может прервать сканирование. Лучшее решение, которое я нашел до сих пор, было: `% comspec% / c start" "/ мин.\ file.bat ^ & exit`, но это не так, как должно работать. Divin3 8 лет назад 0
Смотрите эту ветку: [Запустите командный файл полностью скрытым способом] (http://superuser.com/questions/62525/run-a-batch-file-in-a-completely-hidden-way/62646#62646) , harrymc 8 лет назад 0
Я немного разочарован, потому что нет «взлома Windows», чтобы заставить горячие клавиши работать как оригинальная идея, но это отличный обходной путь. В конечном итоге я решил сделать 2 пакетных файла в меню «Пуск», которые будут включать / отключать планировщик заданий, и скрипт будет загружаться из общей сетевой папки. Мне нужно добавить еще обработку ошибок (в случае, если файл не может быть доступен, или возникнут какие-либо проблемы), но я смогу справиться с этим. Спасибо за ваши усилия и отличный ответ. Divin3 8 лет назад 0
0
root

Your approach to this problem is unique, and sounds close, but it's running away from you. Thinking along the same path you've been following so far, here's an offer.

If it's safe to, which you will have to thoroughly determine, you may want to choose to use a key bind to Alt+F4 the applications. It would be even better if you could do a combination of Alt+Tab first, then Alt+F4. Theoretically, you would be able to close both applications and return to the desktop by pressing this key bind a maximum of three times.

This would leave you in a position where you know the exact state of both applications - not running. Using a redacted version of your bind, you can then launch your applications (there is no longer the need to check if they are running).

Example (both applications are running):

  • application A has window focus
  • [press bind] B has focus and closes, returning focus to A
  • [press bind] desktop has focus, and nothing closes
  • [press bind] A has focus and closes

Example 2 (B has been closed):

  • desktop has window focus
  • [press bind] A (for example) has focus and closes, returning focus to desktop

Alternatively, you could have one key to do the Alt+Tab and another key to do the Alt+F4. The users would have to press key 1, followed by key 2, for a total of 3 presses for each button.

It is up to you to determine if Alt+F4ing your applications is safe. One might consider this never to be safe, but it absolutely is not safe to do if your applications process data actively, process data based on a schedule, have an active database connection, ect. If the applications happen to only carry out their function(s) when a user intervenes with a request, and Alt+F4ing each application does not leave any unforgotten temporary data or locks, there may be no consequence.

As always, there is more than one approach to your problem. This specific solution sticks with your initial thought process and overall theme.

Выключать приложения во время работы небезопасно, это может вызвать еще большие проблемы. Также приложения не закрываются, когда нажата `alt + f4`. Приложение `A` даже запрашивает пароль для закрытия. Divin3 8 лет назад 0