既製のコマンドラインのプログラムに対するラッパー的なフロントエンドのプログラムを
作りたいと思っています。その手のプログラムを組むに当たって初心者向けの解説サイト
というのはございますか?
無いんじゃね?
954 :
952:2006/05/20(土) 20:02:28
。・゚・(ノД`)・゚・。
>>952 その手もなにもGUIだけ作ればいいんじゃない?
956 :
952:2006/05/20(土) 20:34:53
>>955 たとえばどうパラメータをコマンドラインプログラムの引数として渡してやるかとか、
コマンドラインプログラムを実行した結果生じるステータスをどうしたら知ることができるのかな
と思いまして・・・
そんなの悩むもんじゃないからな
958 :
952:2006/05/20(土) 21:32:40
( ´・ω・)・・・
>>958 Process.StandardOutput でぐぐる。
960 :
952:2006/05/20(土) 22:14:02
>>959 > Process.StandardOutput
便利な関数ありがとうございます。
以下のような複数行からなる返り値も余すことなく拾いたかったところなんですよ( ´∀`)
C:\temp>hoge.exe
rep Run = LIVE
status ok
C:\temp>
>>960 関数じゃなくてプロパティ。まずは基礎を…。
962 :
952:2006/05/21(日) 03:04:57
あ、プロパティでしたか、こりゃ失敬(*´∀`)
ところで実際のコマンドラインプログラムの振る舞いをもう少し詳細に説明しますと、
C:\temp>hoge.exe
rep Run = LIVE
status ok
の状態で止まっているんです。しかも二行目、status okが表示されるまでそこそこの
時間がかかります。このプログラムを抜け、プロンプトに戻るためにはCtrl + Cを押さな
ければなりません。
C:\temp>hoge.exe
rep Run = LIVE
status ok
^c
C:\temp>
このようなコマンドラインプログラムでも2行目の
status ok
まですべての出力を余すことなく拾うことはできますか?
WaitForExit
つーか、ドキュメント、読め、ハゲ。
964 :
952:2006/05/21(日) 03:25:55
>>963 > WaitForExit
どうもです。WaitForExitというのはプログラムが終了するまで待ってろと言う意味ですね。
ということはこの場合、明示的にCtrl + Cを押してやらない限りいつまでたっても
rep Run = LIVE
status ok
の文字列は読み込めないということですね?
できることならCtrl + Cを押す前の待機中の状態でも読みたかったんですが・・・。
と、言いますのも、
status ok
の部分次第ではさらに新しい命令を続けて打ち込む必要があるので・・・。
自分で簡易サイドバーみたいなものをつくりたいのですが、
タスクバーみたいに画面の領域を占拠?するにはどうしたらいいんでしょうか?
>>965 簡単で良いのなら、Screen クラスを使えばデスクトップの範囲を取得できるので
それを元に Form の位置サイズを調整すればいい。
TopMost にしとけば隠れることもない。他のウィンドウが後ろに行ってしまうけどな。
本格的にやるのなら、大変面倒。
MSDN で Taskbar の仕様を調べるところから。
// Band Objects でいいのかな?
968 :
デフォルトの名無しさん:2006/05/21(日) 17:38:25
C#の#ってどんな意味をこめているのですか?
あげて、質問いたします。
C++++
そういえばC++ってどうして++Cにしなかったんだろうね?
++CだとCに仕様を追加した格好になる
C++だとこれから仕様を追加する格好になる
したがって、C++にはこれからみんなでCを使いやすくしようという意味が込められている
972 :
952:2006/05/21(日) 19:55:00
う〜ん、やはり
C:\temp>hoge.exe
rep Run = LIVE
status ok
hoge.exeプロセスが生きている間は
Console.WriteLine(p.StandardOutput.ReadToEnd());
を実行しても文字列は拾えませんね。
というか、
C:\temp>hoge.exe
rep Run = LIVE
status ok
^c
C:\temp>
Ctrl + Cをかけた後でなければ途中の文字列は拾えません。
でもそれだとプログラムが終了してしまうのでアクションが取れなくなってしまうんですよね(´・ω・`)
C:\temp>hoge.exe
rep Run = LIVE
status ok
プログラムの実行中でもまずここまで読んで、
その上で
C:\temp>hoge.exe
rep Run = LIVE
status ok
set Text = test
という風にさらにコマンドを実行したいんですが・・・
ヒント:別スレッド
974 :
952:2006/05/21(日) 20:03:44
いやでも、C#に関する、質問なんですが(;´Д`)・・・
釣られてもいいですか?
952は凄腕の釣り師だなw
977 :
952:2006/05/21(日) 20:12:13
(´・ω・`)ショボーン
>>977 別スレッドをスレ違いと読み違えたのはおそらくネタなんだろうが、
それでもお前は基礎から勉強した方が良いぞ
System.Threading.Thread と言えばいいか?
しかしまあこの場合の問題は別だな。
冷静に考えろ、ReadToEnd() ってことは終わりまで読むんだよな。
終わりって何だ?
>>967 ありがとうございます、本格的な方ですねorz
ざっと見た感じでは
VisualStyleElement.Taskbar
でしょうか?
981 :
952:2006/05/21(日) 20:26:35
>>978 > 別スレッドをスレ違いと読み違えたのはおそらくネタなんだろうが
>>979 > System.Threading.Thread と言えばいいか?
Σ(´Д`; )!
(´・ω:::::.....
そういう意味でしたか。ありがとうございます。
> 「結論から言えば、スレッドは起動するな。」と予め言っておく、
> スレッドを起動しないでも別スレッドで処理を実行する方法はある。
> 別スレッドで処理をするという事の説明の前段階であり、
> これを見て喜んでスレッドを起動しないでほしい。
ttp://www.ailight.jp/blog/kazuk/articles/6281.aspx 結構鬼門そうなテクニックですね。
ちょっと調べてみます。
983 :
952:2006/05/22(月) 00:07:10
スレッドに関して調べてみました。
ですがどうも自分のやりたいことと違うような気もするのですが・・・
C:\temp>hoge.exe
rep Run = LIVE
status ok
hoge.exeを実行し、任意の時間ののち status ok の表示でプログラムが停止しているとします。
この表示が出されたことを確認した上でさらに続けてコマンドを入力していくわけですが、
C:\temp>hoge.exe
rep Run = LIVE
status ok
set Text = test
別スレッドでこれをやるとなるとまた他のプロセスでhoge.exeを実行することになり
連続性が失われてしまいます。あくまでも最初に動かしたhoge.exeに続けてコマンドを
入力していきたいのですが、それでも別スレッドを立てて実行した方がいいのでしょうか?
もう帰れ
986 :
952:2006/05/22(月) 00:17:25
>>979 > しかしまあこの場合の問題は別だな。
> 冷静に考えろ、ReadToEnd() ってことは終わりまで読むんだよな。
> 終わりって何だ?
つまりプログラムが終わらない限りReadToEnd()は全く読んでくれないということですね。
そして肝心のhoge.exeを終了させるにはCtrl + Cをかけなければならないと( ´・ω・)・・・
で、StandardOutput である StreamReader には読み込むのに ReadToEnd しか用意されてないってのか?
988 :
952:2006/05/22(月) 02:23:08
>>987 そういえばReadToEnd()だけでなく、ReadLine()というメソッドもありましたね(*´∀`)
ただ一度にではなく、不定期に現れてくる文をどう拾ってやるかという問題がありますね。
文が現れたときに読み込んでくれるようなメソッドがあれば便利なんですが・・・
989 :
952:2006/05/22(月) 03:35:57
いや、ReadLine()で出来ました(*´∀`)・・・
990 :
デフォルトの名無しさん:2006/05/22(月) 03:43:28
こんばんわ。
mhtmlを使わずにHTMLのタグを取得したいのですがつまずいてしまいました。
1object htm;
2type typ ;
3string docbody;
4 typ = Type.GetTypeFromProgID("mhtmlfile") ;
5 htm = axWebBrowser2.Document ;
6docbody = typ.InvokeMember("title",BindingFlags.GetProperty, null, htm, null).ToString();
7textBox1.Text=("" + docbody);
上記のソースを記述しています。
タグの全てを表示したいのですが、うまくいきません。
とりあえず6行目の"title"できちんとHTMLで書かれたTITLEが表示されるのですが、
全体を表示しようとするとうまくいきません。
他のHPなどを参考に"title"の部分を"body"とか"outerHTML"とか"documentElement"に
変えてみたんですが、エラーが出ます。
どなたかご教授いただければと思います。
せめてエラーとやらの内容ぐらい書け。
c#8.0,win2000です
FrameWork2.0から追加されたWebBrowserコントロールを使って
ページが読み込まれるまで待ってからページのDocumentに対
して操作したいのですが
WebBrowser.IsBusyプロパティを使った判定の仕方がわかりません
private void button1_Click(object sender, EvebtArgs e)
{
WebBrowser wb = new WebBrowser();
wb.Navigate("
http://www.google.com");
//ここでwbがページ読み込み中かどうか判定したい
while(wb.IsBusy)
{
}
//ここに来た時点でページの読み込みは完了しているはず
//しかし wb.Document.GetElementById("xx");などとすると
//System.NullReferenceException例外が起こる
//ステップイン実行してみるとwhile(wb.IsBusy)のループを
//一度も回っていない
}
そういうのってDocumentCompletedイベントでやるべきでは?
994 :
992:2006/05/22(月) 10:49:15
ありがとうございます
やってみましたが駄目でした
bool b = false;
private void button1_Click(object sender, EvebtArgs e)
{
WebBrowser wb = new WebBrowser();
wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted);
wb.Navigate("
http://www.google.com");
b = true;
//ここでwbがページ読み込み中かどうか判定したい
while(b)
{
}
wb.Document.GetElementById("xx"); //同じエラーになってしまう
}
private void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
b = false;
}
どこか間違っているでしょうか?
995 :
990:2006/05/22(月) 11:44:12
>>991 例えばHTMLのタイトルがふらっとC#だとしたら"title"でちゃんと「ふらっとC#」とでます
が"body"にすると「mshtml.HTMLBodyClass」と表示されて中身が出ません。
すみません、他にも「文字列が長すぎます」とか出たんですがそれは今出ません。
>>994 private void button1_Click( object sender, EventArgs e )
{
WebBrowser wb = new WebBrowser();
wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler( wb_DocumentCompleted );
wb.Navigate( "
http://www.google.com" );
}
void wb_DocumentCompleted( object sender, WebBrowserDocumentCompletedEventArgs e )
{
HtmlElement element = ((WebBrowser)sender).Document.GetElementById( "1a" );
MessageBox.Show( element.InnerHtml );
}
>>995 body で取得できるのは HTMLBodyClass オブジェクトであって文字列じゃないから。
大体中身って何を想定してるんだ?
998 :
990:2006/05/22(月) 23:51:12
>>997 そうなんですか・・・
中身はhtmlのソース(タグ?)をそうていしています
>>996 できたー!
ありがとうございました
ただ、DocumentCompletedイベントってあんましあてに
ならないのです。
例えば最初に飛んだページがLocationヘッダ吐いても、
ページがフレームで構成されていても、IFRAME使っていても
その都度DocumentCompetedが起こってしまいます。
うんこぶりぶり
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。