Приложение C # для Windows - привязка кнопки для запуска игры - PullRequest
1 голос
/ 23 апреля 2011

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

Пока у меня есть кнопка, связывающая процесс:

void button2_Click(object sender, EventArgs e)
{
    process1.Start();
}

this.process1.EnableRaisingEvents = true;
this.process1.StartInfo.Domain = "";
this.process1.StartInfo.FileName = "MBO\\marbleblast.exe";
this.process1.StartInfo.LoadUserProfile = false;
this.process1.StartInfo.Password = null;
this.process1.StartInfo.StandardErrorEncoding = null;
this.process1.StartInfo.StandardOutputEncoding = null;
this.process1.StartInfo.UserName = "";
this.process1.SynchronizingObject = this;
this.process1.Exited += new System.EventHandler(this.Process1Exited);

Таким образом, где бы я ни разместил EXE (тот, который я кодирую), он будет запускать файл «marbleblast.exe» в подпапке MBO относительно его местоположения.

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

Я дам более подробную информацию, если это необходимо.

Как мне заставить игру работать нормально?

Ответы [ 4 ]

2 голосов
/ 23 апреля 2011

попробуйте добавить это

this.process1.StartInfo.WorkingDirectory= "MBO\\";

или что-то подобное, чтобы установить Рабочий каталог .

1 голос
/ 23 апреля 2011

this.process1.StartInfo.WorkingDirectory = "MBO \";

В игре есть неаккуратное программирование, оно основано на правильной установке Environment.CurrentDirectory. Который по умолчанию является тем же каталогом, где находится EXE. Ответ, лишенный права голоса, повторяет ошибку, хотя. Чтобы это утверждение действительно устранило проблему, вы теперь полагаетесь на ваш CurrentDirectory, установленный правильно. Если он не установлен там, где вы думаете, он все равно не будет работать.

Проблема с текущим каталогом программы заключается в том, что он может быть изменен программным обеспечением, которое вы не контролируете. Классическим примером является OpenFileDialog со свойством RestoreDirectory, установленным в значение по умолчанию false. Etcetera.

Всегда программируйте с защитой и передавайте полный путь к файлам и каталогам. Например, c: \ mumble \ foo.ext. Для этого начните с Assembly.GetEntryAssembly (). Location, это путь к вашему EXE-файлу. Затем используйте класс System.IO.Path для генерации путей к ним. Правильный код, который всегда работает:

using System.IO;
using System.Reflection;
...
        string myDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
        string gameDir = Path.Combine(myDir, "MBO");
        string gameExe = Path.Combine(gameDir, "marbleblast.exe");
        process1.StartInfo.FileName = gameExe;
        process1.StartInfo.WorkingDirectory = gameDir;
        process1.SynchronizingObject = this;
        process1.EnableRaisingEvents = true;
        process1.Exited += new EventHandler(Process1Exited);
1 голос
/ 23 апреля 2011

Я Добракмато из MBForums.Вам просто нужно добавить рабочий каталог для Marble Blast.

this.process1.EnableRaisingEvents = true;
this.process1.StartInfo.Domain = "";
this.process1.StartInfo.FileName = "MBO\\marbleblast.exe";
this.process1.StartInfo.WorkingDirectory = "pathto marbleblast.exe directory";
this.process1.StartInfo.LoadUserProfile = false;
this.process1.StartInfo.Password = null;
this.process1.StartInfo.StandardErrorEncoding = null;
this.process1.StartInfo.StandardOutputEncoding = null;
this.process1.StartInfo.UserName = "";
this.process1.SynchronizingObject = this;
this.process1.Exited += new System.EventHandler(this.Process1Exited);
1 голос
/ 23 апреля 2011

Установите WorkingDirectory свойство ProcessInfo на правильный каталог.

...