如何在VB.net应用程序中启动.exe目录因用户而异?

时间:2016-02-23 07:48:12

标签: vb.net

我正在为Arma 3服务器创建一个应用程序,该服务器直接启动游戏并将用户连接到特定服务器。我遇到的问题是,我是一个相对较新的VB编码器,是Arma3battleye.exe目录(用于启动游戏的.exe)可能安装在不同的目录中,具体取决于用户最初安装它的位置。如果他们在正常位置安装了Arma,我已经开发了将用户连接到服务器的代码:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Process.Start("C:\Program Files (x86)\Steam\steamapps\common\Arma 3\arma3battleye.exe", "2 1 -noSplash -skipIntro -useBE -noPause -world=empty -connect=192.99.36.80 -port=2505 -mod=@Exile;@AlRayak;@AllInArmaTerrainPack;@CUP Units;@CUP Vehicles;@CUP Weapons;@CBA_A3;@TRYK's Multi-Play Unifrom's pack")

End Sub

然而,在研究了几个小时之后,我无法确定如何让程序自动确定arma3batteye.exe的安装目录,然后使用包含的所有正确启动参数执行它。任何有助于解决这个问题的解决方案或指针都将非常感激。

TLDR:对应用程序进行编程以自动查找给定.exe的安装目录然后使用给定参数执行它的最简单方法是什么?如上所述?

编辑:与我类似的另一个线程提出了一个类似的问题(如何查看/获取蒸汽文件夹而不进行硬编码。他们得出的结论是,如果你这样做(对于winx32):

Dim strSteamInstallPath as String = My.Computer.Registry.GetValue(
"HKEY_LOCAL_MACHINE\SOFTWARE\Valve\Steam", "InstallPath", Nothing)

或者将此注册表位置用于winx64:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Valve\Steam

然后使用Process.Start创建一个按钮,它允许您最终查看目录。此时我还没有找到一种方法可以转换为能够使用适当的参数从该steam目录中执行battleyearma3.exe。虽然看起来这个代码在获得我正在寻找的解决方案时可能很有用,但我现在只能在程序中查看一般的Steam目录。

编辑:底部发布的解决方案。感谢@VisualVincent,他真的是允许我完成此任务的人。真的应该是你发布了正确的答案,而不是我。

2 个答案:

答案 0 :(得分:0)

我会使用注册表... 你添加一个像HKEY_LOCAL_MACHINE \ Software \ Arma3 \ ServerPath =" ..."安装服务器时。

无论何时需要启动客户端,都要检查该注册表项的路径。

答案 1 :(得分:0)

所以通过你给我的评论和提示(尤其是@VisualVincent),我设法将足够的东西拼凑起来解决我的问题。感谢大家的帮助:

首先我声明了2个变量。第一个(BattleyePath)进入注册表,只要我可以挖掘它。单独执行此变量将打开用户steam目录。然后我声明了第二个变量(BattleyePath2),它使用IO.Path.Combine到达安装用户Arma3.exe的目录:

Dim BattleyePath As String = My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Valve\Steam", "InstallPath", Nothing) Dim BattleyePath2 As String = IO.Path.Combine(BattleyePath, "SteamApps", "common", "Arma 3", "arma3battleye.exe")

我添加了几个按钮来关闭程序并静音:

`Private Sub Button2_Click(sender As Object,e As EventArgs)处理Button2.Click         Me.Close()     结束子

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

    My.Computer.Audio.Stop()

End Sub`

最后我创建了实际启动游戏的按钮:

`Private Sub Button4_Click_1(发件人为对象,e为EventArgs)处理Button4.Click

    Process.Start(BattleyePath2, "2 1 -noSplash -skipIntro -useBE -noPause -world=empty -connect=192.99.36.80 -port=2505 -mod=@Exile;@AlRayak;@AllInArmaTerrainPack;@CUP Units;@CUP Vehicles;@CUP Weapons;@CBA_A3;@TRYK's Multi-Play Unifrom's pack")

End Sub`