2011-11-26 223 views
2

我將嘗試通過引導您完成解釋我的問題。預先感謝與我同在。殺死進程的替代方法(Autohotkey或.BAT或備用解決方案)

TL; DR:開始於4

1. C#

我在創造VS 2008 C#的街機遊戲啓動應用程序的過程。 它讀取'C:\ ARCADE \ GAMES'目錄並填充一個列表,然後可以選擇該列表。 在每個遊戲文件夾中都有一個名爲'autohotkey.ahk'的AutoHotKey腳本正在運行。這是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. AutoHotkey的鍵綁定

鍵綁定腳本的簡化版本是這樣的:

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

的所有按鈕都正確重新映射,除了殺按鈕(輸出數字'3')。我開始測試它是否是一個機械問題,但事實並非如此。我試圖將代碼附加到任何其他按鈕,沒有工作。我使用的kill命令「Process,Close,Dosbox」適用於大多數其他遊戲,但也有替代方案。所以我開始嘗試不同的代碼。街頭霸王表現出了同樣的問題,與znesw代替的Dropbox:

kill.bat的
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 

內容:

%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個小時的時間內,我無法在工作時間和時間間隔之間劃出一個平行線。

任何幫助,替代殺方法或什麼的,認識

+0

檢查taskkill是否成功返回智能ERROLEVEL(= 0)。如果ERRORLEVEL> 0將消息打印到日誌文件。也許taskkill命令找不到該進程。 %comspec%包含什麼? – Lucian

回答

2

你可以嘗試的Sysinternals(現在由微軟收購)PsKill代替,看看是否能在終止您的過程是比較成功的。

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