Альтернативные способы уничтожения процессов (Autohotkey или .BAT или альтернативное решение) - PullRequest
2 голосов
/ 26 ноября 2011

Я попытаюсь объяснить мою проблему, проведя вас через нее. Заранее спасибо за терпение со мной.

TL; DR: начало в 4.

1. C #

Я нахожусь в процессе создания приложения запуска игровых автоматов Arcade в VS 2008 C #. Он читает каталог 'C: \ ARCADE \ GAMES' и заполняет список, который затем можно выбрать. В каждой папке с игрой есть скрипт AutoHotKey, который называется autohotkey.ahk и запускается. Это единственная логика на уровне приложений C #. Это работает.

Игры представляют собой смесь

  • Dos игры запускаются в Dosbox
  • Игры Snes запускаются в zsnesw
  • Игры для Windows

2. AutoHotkey

Аркада управляет выводом клавиатурных команд, которые нельзя изменить. Я использую скрипты autohotkey для перепривязки ключей для каждой игры.

Сценарий autohotkey.ahk выглядит следующим образом:

Run C:\BARCADE\GAMES\SIMPSONS\autohotkeybindings.ahk
RunWait, DOSBox.exe -conf "C:\BARCADE\GAMES\SIMPSONS\dosbox.conf" -exit  -noconsole  -fullscreen, C:\BARCADE\DOSBOX\
DetectHiddenWindows On
SetTitleMatchMode 2  
WinClose autohotkeybindings.ahk - AutoHotkey  
Exit

В первой строке запускается скрипт связывания клавиш, во второй строке запускается dosbox и ожидает его выхода / уничтожения, остальные строки выгружают скрипт связывания клавиш. Это работает.

3. DOSBOX

Сценарий dosbox.conf выглядит следующим образом:

[sdl]
fullscreen=true
[render]
aspect=true
[cpu]
cycles=12000
[autoexec]
mount c C:\BARCADE\GAMES\
c:
cd SIMPSONS
cd PRG
SIMPSONS.EXE

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

4. Клавиши автоотключения

Сокращенная версия скрипта привязки клавиш выглядит следующим образом:

#MaxHotkeysPerInterval 1000
;p2
Numpad8::w
Numpad2::x
Numpad4::a
Numpad6::d
;FUNCTION BUTTONS
SetTitleMatchMode 2  
3::Process, Close, Dosbox

Все кнопки переназначены правильно, , кроме кнопки Kill (которая выводит число '3'). Я начал с тестирования, если это была механическая проблема, это не так. Я пытался прикрепить код к любой другой кнопке, не сработало. Команда kill, которую я использую, «Process, Close, Dosbox», работает в большинстве других игр, но есть альтернативы этому. Поэтому я начал экспериментировать с другим кодом. Streetfighter показывает ту же проблему, с znesw вместо dropbox:

3::
Run, kill.bat, C:\BARCADE\GAMES\STREETFIGHTER2
Process, Close, zsnesw
Process, Close, zsnesw.exe
WinKill, zsnesw
WinKill, zsnesw.exe
Run, tskill.exe zsnesw
return

содержимое kill.bat:

%comspec% /c "taskkill /F /IM zsnesw /T"
%comspec% /c "taskkill /F /IM zsnesw /T"
%comspec% /c "taskkill /F /IM zsnesw.exe /T"
/c "taskkill /F /IM zsnesw /T"
/c "taskkill /F /IM zsnesw /T"
/c "taskkill /F /IM zsnesw.exe /T"

Это работает примерно в 30% случаев. Остальные 70% времени игра не выходит. Все остальные переназначенные элементы управления работают, так что в них можно играть, но нет способа вернуться в меню и выбрать другую игру. Эта функция нарушает все назначение машины, которая будет находиться в общественном месте, и будет получать все большее количество игр.

Когда кнопка выхода не работает, все, что я могу сделать, это нажать Ctrl + Alt + Del дважды на подключенной клавиатуре (которая будет удалена после завершения проекта), чтобы открыть задачу менеджер и возврат в windows XP. Все переназначения кнопок все еще работают (например, покачивание палочек приведет к выводу группы букв в блокноте), НО число 3, просто вывод числа 3. Таким образом, сочетания клавиш, кажется, игнорируются по какой-то необъяснимой причине.

Я перепробовал множество вариантов и комбинаций всех команд уничтожения, о которых мог подумать (отсюда и раздутые попытки уничтожения zsnesw), и ни одна из них не работала всегда . Многие из них работают иногда, и в течение 6 часов я не смог провести ни одной параллели между тем, когда это работало, а когда - нет.

Любая помощь, альтернативные методы уничтожения или что-либо, приветствуется

Ответы [ 2 ]

2 голосов
/ 03 декабря 2011

Вместо этого вы можете попробовать SysInternals (в настоящее время принадлежит Microsoft) PsKill , чтобы увидеть, насколько успешнее будет завершить ваши процессы.

1 голос
/ 19 августа 2012

попробуйте перепроверить ваше 'taskkill' в цикле.

3:: 
kill:
GAMEPID = 
Process, Exist, zsnesw.exe
GAMEPID = %ErrorLevel%

If GAMEPID
    RunWait, %comspec% /c "taskkill /F /IM zsnesw.exe /T"  ,,hide

Process, Exist, zsnesw.exe
GAMEPID = %ErrorLevel%

If GAMEPID
    Goto, kill
Else
    ExitApp
...