ふらっとC♯(初心者用) Part7

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2006/05/20(土) 19:40:58
既製のコマンドラインのプログラムに対するラッパー的なフロントエンドのプログラムを
作りたいと思っています。その手のプログラムを組むに当たって初心者向けの解説サイト
というのはございますか?
953デフォルトの名無しさん:2006/05/20(土) 20:00:02
無いんじゃね?
954952:2006/05/20(土) 20:02:28
。・゚・(ノД`)・゚・。
955デフォルトの名無しさん:2006/05/20(土) 20:30:23
>>952
その手もなにもGUIだけ作ればいいんじゃない?
956952:2006/05/20(土) 20:34:53
>>955
たとえばどうパラメータをコマンドラインプログラムの引数として渡してやるかとか、
コマンドラインプログラムを実行した結果生じるステータスをどうしたら知ることができるのかな
と思いまして・・・
957デフォルトの名無しさん:2006/05/20(土) 20:42:43
そんなの悩むもんじゃないからな
958952:2006/05/20(土) 21:32:40
( ´・ω・)・・・
959デフォルトの名無しさん:2006/05/20(土) 21:47:27
>>958
Process.StandardOutput でぐぐる。
960952:2006/05/20(土) 22:14:02
>>959
> Process.StandardOutput

便利な関数ありがとうございます。
以下のような複数行からなる返り値も余すことなく拾いたかったところなんですよ( ´∀`)

C:\temp>hoge.exe
rep Run = LIVE
status ok
C:\temp>
961デフォルトの名無しさん:2006/05/20(土) 23:30:54
>>960
関数じゃなくてプロパティ。まずは基礎を…。
962952: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
まですべての出力を余すことなく拾うことはできますか?
963デフォルトの名無しさん:2006/05/21(日) 03:11:49
WaitForExit
つーか、ドキュメント、読め、ハゲ。
964952:2006/05/21(日) 03:25:55
>>963
> WaitForExit

どうもです。WaitForExitというのはプログラムが終了するまで待ってろと言う意味ですね。
ということはこの場合、明示的にCtrl + Cを押してやらない限りいつまでたっても

rep Run = LIVE
status ok

の文字列は読み込めないということですね?
できることならCtrl + Cを押す前の待機中の状態でも読みたかったんですが・・・。
と、言いますのも、
status ok
の部分次第ではさらに新しい命令を続けて打ち込む必要があるので・・・。
965デフォルトの名無しさん:2006/05/21(日) 05:40:53
自分で簡易サイドバーみたいなものをつくりたいのですが、
タスクバーみたいに画面の領域を占拠?するにはどうしたらいいんでしょうか?
966デフォルトの名無しさん:2006/05/21(日) 12:44:49
>>964
お前は死んだ方が良いと思うよ
967デフォルトの名無しさん:2006/05/21(日) 13:02:07
>>965
簡単で良いのなら、Screen クラスを使えばデスクトップの範囲を取得できるので
それを元に Form の位置サイズを調整すればいい。
TopMost にしとけば隠れることもない。他のウィンドウが後ろに行ってしまうけどな。

本格的にやるのなら、大変面倒。
MSDN で Taskbar の仕様を調べるところから。
// Band Objects でいいのかな?
968デフォルトの名無しさん:2006/05/21(日) 17:38:25
C#の#ってどんな意味をこめているのですか?

あげて、質問いたします。
969デフォルトの名無しさん:2006/05/21(日) 17:41:22
C++++
970デフォルトの名無しさん:2006/05/21(日) 17:46:46
そういえばC++ってどうして++Cにしなかったんだろうね?
971デフォルトの名無しさん:2006/05/21(日) 17:51:57
++CだとCに仕様を追加した格好になる
C++だとこれから仕様を追加する格好になる
したがって、C++にはこれからみんなでCを使いやすくしようという意味が込められている
972952: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
という風にさらにコマンドを実行したいんですが・・・
973デフォルトの名無しさん:2006/05/21(日) 20:00:36
ヒント:別スレッド
974952:2006/05/21(日) 20:03:44
いやでも、C#に関する、質問なんですが(;´Д`)・・・
975デフォルトの名無しさん:2006/05/21(日) 20:07:43
釣られてもいいですか?
976デフォルトの名無しさん:2006/05/21(日) 20:08:58
952は凄腕の釣り師だなw
977952:2006/05/21(日) 20:12:13
(´・ω・`)ショボーン
978デフォルトの名無しさん:2006/05/21(日) 20:14:12
>>977
別スレッドをスレ違いと読み違えたのはおそらくネタなんだろうが、
それでもお前は基礎から勉強した方が良いぞ
979デフォルトの名無しさん:2006/05/21(日) 20:15:30
System.Threading.Thread と言えばいいか?

しかしまあこの場合の問題は別だな。
冷静に考えろ、ReadToEnd() ってことは終わりまで読むんだよな。
終わりって何だ?
980デフォルトの名無しさん:2006/05/21(日) 20:17:00
>>967
ありがとうございます、本格的な方ですねorz

ざっと見た感じでは
VisualStyleElement.Taskbar
でしょうか?
981952:2006/05/21(日) 20:26:35
>>978
> 別スレッドをスレ違いと読み違えたのはおそらくネタなんだろうが
>>979
> System.Threading.Thread と言えばいいか?

Σ(´Д`; )!

(´・ω:::::.....

そういう意味でしたか。ありがとうございます。

> 「結論から言えば、スレッドは起動するな。」と予め言っておく、
> スレッドを起動しないでも別スレッドで処理を実行する方法はある。
> 別スレッドで処理をするという事の説明の前段階であり、
> これを見て喜んでスレッドを起動しないでほしい。
ttp://www.ailight.jp/blog/kazuk/articles/6281.aspx

結構鬼門そうなテクニックですね。
ちょっと調べてみます。
982デフォルトの名無しさん:2006/05/21(日) 20:30:20
>>980
SHAppBarMessage()
983952: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に続けてコマンドを
入力していきたいのですが、それでも別スレッドを立てて実行した方がいいのでしょうか?
984デフォルトの名無しさん:2006/05/22(月) 00:10:21
985デフォルトの名無しさん:2006/05/22(月) 00:14:25
もう帰れ
986952:2006/05/22(月) 00:17:25
>>979
> しかしまあこの場合の問題は別だな。
> 冷静に考えろ、ReadToEnd() ってことは終わりまで読むんだよな。
> 終わりって何だ?

つまりプログラムが終わらない限りReadToEnd()は全く読んでくれないということですね。
そして肝心のhoge.exeを終了させるにはCtrl + Cをかけなければならないと( ´・ω・)・・・
987デフォルトの名無しさん:2006/05/22(月) 00:22:11
で、StandardOutput である StreamReader には読み込むのに ReadToEnd しか用意されてないってのか?
988952:2006/05/22(月) 02:23:08
>>987
そういえばReadToEnd()だけでなく、ReadLine()というメソッドもありましたね(*´∀`)
ただ一度にではなく、不定期に現れてくる文をどう拾ってやるかという問題がありますね。
文が現れたときに読み込んでくれるようなメソッドがあれば便利なんですが・・・
989952: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"に
変えてみたんですが、エラーが出ます。
どなたかご教授いただければと思います。

991デフォルトの名無しさん:2006/05/22(月) 07:59:02
せめてエラーとやらの内容ぐらい書け。
992デフォルトの名無しさん:2006/05/22(月) 09:38:17
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)のループを
//一度も回っていない
}
993デフォルトの名無しさん:2006/05/22(月) 10:16:55
そういうのってDocumentCompletedイベントでやるべきでは?
994992: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;
}

どこか間違っているでしょうか?
995990:2006/05/22(月) 11:44:12
>>991
例えばHTMLのタイトルがふらっとC#だとしたら"title"でちゃんと「ふらっとC#」とでます
が"body"にすると「mshtml.HTMLBodyClass」と表示されて中身が出ません。
すみません、他にも「文字列が長すぎます」とか出たんですがそれは今出ません。
996デフォルトの名無しさん:2006/05/22(月) 15:47:31
>>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 );
}
997デフォルトの名無しさん:2006/05/22(月) 17:02:28
>>995
body で取得できるのは HTMLBodyClass オブジェクトであって文字列じゃないから。
大体中身って何を想定してるんだ?
998990:2006/05/22(月) 23:51:12
>>997
そうなんですか・・・
中身はhtmlのソース(タグ?)をそうていしています
999デフォルトの名無しさん:2006/05/23(火) 01:59:11
>>996

できたー!
ありがとうございました

ただ、DocumentCompletedイベントってあんましあてに
ならないのです。
例えば最初に飛んだページがLocationヘッダ吐いても、
ページがフレームで構成されていても、IFRAME使っていても
その都度DocumentCompetedが起こってしまいます。
1000デフォルトの名無しさん:2006/05/23(火) 02:30:13
うんこぶりぶり
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。