たびたびすみません。
Minecraftというゲームのサーバーはbatファイルから起動するのですがそれをプログラム(C#/XAML)から行い、その後表示される子マンドプロンプトをGUIプログラムに映したいです。
ただし、コマンドプロンプトを起動させずに、ということでお願いします。(プログラム自体がcmdの機能も持つみたいなイメージ)
バッチファイルと同等のことをするプログラム
Re: バッチファイルと同等のことをするプログラム
へー、そうなんですね。baby2478nishi さんが書きました:Minecraftというゲームのサーバーはbatファイルから起動するのですがそれをプログラム(C#/XAML)から行い、その後表示される子マンドプロンプトをGUIプログラムに映したいです。
日記は質問掲示板ではなく、日記に書いた方がいいでしょう。
何をお願いされたのか、よくわかりません。baby2478nishi さんが書きました:ただし、コマンドプロンプトを起動させずに、ということでお願いします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: バッチファイルと同等のことをするプログラム
Minecraftについては知りませんが、件のバッチファイルは単に.jarのサーバプログラムを起動しているだけでしょうか?
であれば、以下の方法で、サーバプログラムの標準出力をリダイレクトすることができます。
[C#] 非同期で標準出力(コンソールアプリケーション)の内容をプログラムで受け取る
以下は、上記を参考にしたWindowsフォームアプリケーションの例です。
適当なサーバ(Sv.jar)を起動し、サーバの標準出力をテキストボックスに追記します。
であれば、以下の方法で、サーバプログラムの標準出力をリダイレクトすることができます。
[C#] 非同期で標準出力(コンソールアプリケーション)の内容をプログラムで受け取る
以下は、上記を参考にしたWindowsフォームアプリケーションの例です。
適当なサーバ(Sv.jar)を起動し、サーバの標準出力をテキストボックスに追記します。
using System;
using System.Windows.Forms;
using System.Diagnostics;
namespace StdOut
{
public partial class Form1 : Form
{
public delegate void MyEventHandler(object sender, DataReceivedEventArgs e);
public event MyEventHandler m_myEvent = null;
Process m_process = null;
public Form1()
{
InitializeComponent();
}
// サーバ起動
private void btnExec_Click(object sender, EventArgs e)
{
m_myEvent = new MyEventHandler(event_DataReceived);
m_process = new Process();
// 起動したい.jarファイルのある場所=EXEと同じ場所とする
string jarDir = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
// 適切な引数にて.jarファイルを実行する
// Sv.jar は適当なサーバプログラム
m_process.StartInfo.FileName = "java";
m_process.StartInfo.Arguments = " -jar \"" + jarDir + "\\Sv.jar\" 8079";
m_process.StartInfo.CreateNoWindow = true; // ウインドウは非表示とする
m_process.StartInfo.UseShellExecute = false;
m_process.StartInfo.RedirectStandardOutput = true; // 標準出力をリダイレクト
m_process.OutputDataReceived += new DataReceivedEventHandler( process_DataReceived);
m_process.Start();
m_process.BeginOutputReadLine();
}
void event_DataReceived(object sender, DataReceivedEventArgs e)
{
// とりあえずテキストボックスに追記
tb1.Text += e.Data + "\r\n";
}
void process_DataReceived(object sender, DataReceivedEventArgs e)
{
// UIのハンドラへ
this.Invoke(m_myEvent, new object[2] { sender, e });
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
try
{
if (m_process != null)
{
m_process.Kill();
m_process.Close();
m_process.Dispose();
}
}
catch (InvalidOperationException exc)
{
Debug.WriteLine( exc.Message);
}
}
}
}
-
- 記事: 52
- 登録日時: 10年前
- 住所: 兵庫県姫路市
Re: バッチファイルと同等のことをするプログラム
can110さん、ありがとうございます。
とりあえず、WPFに移行させて頑張ってみます!
とりあえず、WPFに移行させて頑張ってみます!
-
- 記事: 52
- 登録日時: 10年前
- 住所: 兵庫県姫路市
Re: バッチファイルと同等のことをするプログラム
移行させようとしてみたのですがうまくいきません。
移行後がこちらなのですが、
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー CS0117 'Application' に 'ExecutablePath' の定義がありません WPF F:\WPF\WPF\WPF\MainWindow.xaml.cs 50 アクティブ
エラー CS0103 現在のコンテキストに 'process_DataReceived' という名前は存在しません。 WPF F:\WPF\WPF\WPF\MainWindow.xaml.cs 60 アクティブ
エラー CS0103 現在のコンテキストに 'event_DataReceived' という名前は存在しません。 WPF F:\WPF\WPF\WPF\MainWindow.xaml.cs 45 アクティブ
というエラーが出ます。(現段階でこのエラーが出たので途中までです。)
どこか足らないところありますか?
//MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Runtime.InteropServices;
using System.Security;
using System.Collections;
using System.Net;
using System.Threading;
using System.Diagnostics;
using UPNPLib;
namespace WPF
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
public delegate void MyEventHandler(object sender, DataReceivedEventArgs e);
public event MyEventHandler m_myEvent = null;
Process m_process = null;
public MainWindow()
{
InitializeComponent();
}
private void button_Click(object sender, RoutedEventArgs e)
{
this.info1.DataContext = "Booting…";
m_myEvent = new MyEventHandler(event_DataReceived);
m_process = new Process();
// 起動したい.jarファイルのある場所=EXEと同じ場所とする
string jarDir = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
// 適切な引数にて.jarファイルを実行する
// Sv.jar は適当なサーバプログラム
m_process.StartInfo.FileName = "java";
m_process.StartInfo.Arguments = " -jar \"" + jarDir + "\\Sv.jar\" 8079";
m_process.StartInfo.CreateNoWindow = true; // ウインドウは非表示とする
m_process.StartInfo.UseShellExecute = false;
m_process.StartInfo.RedirectStandardOutput = true; // 標準出力をリダイレクト
m_process.OutputDataReceived += new DataReceivedEventHandler(process_DataReceived);
m_process.Start();
m_process.BeginOutputReadLine();
}
private void button_Copy_Click(object sender, RoutedEventArgs e)
{
this.info1.DataContext = "Closing…";
}
private void button_Click_1(object sender, RoutedEventArgs e)
{
this.info1.DataContext = "Restarting…";
}
private void button_Click_2(object sender, RoutedEventArgs e)
{
this.Close();
}
private void settings_Click(object sender, RoutedEventArgs e)
{
var win = new Settings1();
win.Show();
}
private void button_Click_3(object sender, RoutedEventArgs e)
{
}
private void test_Click(object sender, RoutedEventArgs e)
{
/*int p_ip;
p_ip = 1;
IUPnPAddressFamilyControl.GetAddressFamily(out p_ip);
this.info1.DataContext = "IPアドレス:";*/
}
}
}
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー CS0117 'Application' に 'ExecutablePath' の定義がありません WPF F:\WPF\WPF\WPF\MainWindow.xaml.cs 50 アクティブ
エラー CS0103 現在のコンテキストに 'process_DataReceived' という名前は存在しません。 WPF F:\WPF\WPF\WPF\MainWindow.xaml.cs 60 アクティブ
エラー CS0103 現在のコンテキストに 'event_DataReceived' という名前は存在しません。 WPF F:\WPF\WPF\WPF\MainWindow.xaml.cs 45 アクティブ
というエラーが出ます。(現段階でこのエラーが出たので途中までです。)
どこか足らないところありますか?
Re: バッチファイルと同等のことをするプログラム
そのまんまだと思いますが……。
WPFに内のは、単純にWinFormsのApplicationクラスの役割が大きすぎる、ということかと思います。
普通に、System.Reflection.Assembly.GetEntryAssemblyから、LocationなりCodeBaseなりで取得するようにすればよいので。
イベントハンドラ系も簡単な物は面倒だからラムダ式で、もよくありますが……。
System.Windows.Forms.ApplicationにExecutablePathは存在しますが、System.Windows.Applicationには存在しません。baby2478nishi さんが書きました:エラー CS0117 'Application' に 'ExecutablePath' の定義がありません WPF F:\WPF\WPF\WPF\MainWindow.xaml.cs 50 アクティブ
WPFに内のは、単純にWinFormsのApplicationクラスの役割が大きすぎる、ということかと思います。
普通に、System.Reflection.Assembly.GetEntryAssemblyから、LocationなりCodeBaseなりで取得するようにすればよいので。
そのまま、これらの名前のメソッドが存在していません。can110さんのコードにはこれらのメソッドが存在します。baby2478nishi さんが書きました:エラー CS0103 現在のコンテキストに 'process_DataReceived' という名前は存在しません。 WPF F:\WPF\WPF\WPF\MainWindow.xaml.cs 60 アクティブ
エラー CS0103 現在のコンテキストに 'event_DataReceived' という名前は存在しません。 WPF F:\WPF\WPF\WPF\MainWindow.xaml.cs 45 アクティブ
イベントハンドラ系も簡単な物は面倒だからラムダ式で、もよくありますが……。
-
- 記事: 52
- 登録日時: 10年前
- 住所: 兵庫県姫路市
Re: バッチファイルと同等のことをするプログラム
eratta: s/内/無い/YuO さんが書きました:WPFに内のは、単純にWinFormsのApplicationクラスの役割が大きすぎる、ということかと思います。
そのまんまです。baby2478nishi さんが書きました:とはどういうことでしょうか?これらの名前のメソッドが存在していません。
どこにevent_DataReceivedという名前のメソッドが書かれているのですか。
どこにprocess_DataReceivedという名前のメソッドが書かれているのですか。
その2行は,デリゲートの生成と代入,デリゲートの生成とイベントの追加をそれぞれ行っているだけです。
メソッドが無いと言われて意味がわからないのであれば,自分にあうC#の入門書を1冊買ってきてそれを読んでください。
文法解説をし始めたらキリが無いので。