杀死进程的替代方法(Autohotkey或.BAT或备用解决方案)

时间:2011-11-26 16:25:21

标签: autohotkey dosbox

我将试着通过引导你来解释我的问题。提前感谢我的支持。

TL; DR:从4开始。

1。 C#

我正在VS 2008 C#中创建Arcade机器游戏启动器应用程序。 它读取'C:\ ARCADE \ GAMES'目录并填充一个列表,然后可以选择该列表。 在每个游戏文件夹中都有一个名为“autohotkey.ahk”的AutoHotKey脚本,该脚本正在运行。这是C#app层中唯一的逻辑。 这有效。

游戏是

的混合体
  • 在Dosbox中运行Dos游戏
  • 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。 Autohotkey键绑定

键绑定脚本的缩写版本如下所示:

#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”适用于大多数其他游戏,但也有其他选择。所以我开始尝试不同的代码。街头霸王展示了同样的问题,使用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 个答案:

答案 0 :(得分:2)

您可以尝试使用SysInternals(现在由Microsoft拥有)PsKill,以查看在终止您的流程时是否更成功。

答案 1 :(得分:1)

尝试在循环中重新检查'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