2

我将尝试通过引导您来解释我的问题。提前感谢您对我的包容。

TL;DR:从 4 点开始。

1.C#

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

游戏是混合的

  • Dos 游戏在 Dosbox 中运行
  • Snes 游戏在 zsnesw 中运行
  • 视窗游戏

2.自动热键

街机控制输出键盘命令,不能更改。我使用自动热键脚本重新绑定每个游戏的键。

'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 命令“进程、关闭、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。因此,由于某些莫名其妙的原因,键绑定似乎被忽略了。

我已经尝试了我能想到的所有 kill 命令的许多变体和组合(因此 zsnesw 的 kill-attemps 臃肿),但它们都不是总是有效的。他们中的许多人有时会工作,在 6 个小时的时间里,我什至无法在它工作时和不工作时之间画出一条平行线。

任何帮助、替代杀戮方法或其他任何东西,都将不胜感激

4

1 回答 1

1
3:: 
zKill:
Process, Exist, zsnesw.exe
If ErrorLevel {
    RunWait, %comspec% /c "taskkill /F /IM zsnesw.exe /T"  ,,hide
    Sleep, 300
    Goto, zKill
} Else
    ExitApp
于 2012-08-19T15:06:09.183 回答