DOBON.NET DOBON.NETプログラミング掲示板過去ログ

プログラムが起動されたことを知るには?

環境/言語:[2005.NET]
分類:[.NET]

WebBrowserを使用してアプリの開発をしていますが
ファイル名の自動入力で
WebBrowser2.Document.GetElementById("file").InvokeMember("Click") で
ファイルを開くダイアログをオープンしたときのイベントをキャッチしたいのですが
コードがよく分かりません。
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200811/08110018.txt
を手がかりに色々テストしてるのですが、反応がありません。
テスト中のコード
Dim PrcEvt
Dim Prc
Dim Locator
Dim Service
Dim MesStr

Locator = CreateObject("WbemScripting.SWbemLocator")
Service = Locator.ConnectServer

Prc = Service.ExecNotificationQuery _
("SELECT * FROM __InstanceCreationEvent " _
& "WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'")

Do
Application.DoEvents()
PrcEvt = Prc.NextEvent
ListBox1.Items.Add(PrcEvt)
ListBox1.Items.Add(PrcEvt.Path_.Class)
Loop

エクスプローラで画像を開いたときは反応があります。

目的は、ファイルのダイアログがオープン直後に
SendKeys.Send(PicFil)にて
ファイル名の自動入力を目的としています。

よろしくご教授お願いします。
■No25106に返信(ふろんさんの記事)
> ファイル名の自動入力で
> WebBrowser2.Document.GetElementById("file").InvokeMember("Click") で
> ファイルを開くダイアログをオープンしたときのイベントをキャッチしたいのですが
> コードがよく分かりません。

「ファイルを開くダイアログが表示されること」は、「プログラムが起動されたこと」ではありません。
同じプログラムの中で、新しいダイアログが表示されただけになります。

残念ながら、「プログラムが起動されたこと」の方針では目的のことを実現することはできません。

> 目的は、ファイルのダイアログがオープン直後に
> SendKeys.Send(PicFil)にて
> ファイル名の自動入力を目的としています。

No25046 にも書きましたが、タイマーで開いたかどうかチェックする手法もあるでしょう。
ただ、この手法は同じ名前のダイアログがいると、判別するのが困難かもしれません。

一定時間待つでも良いとは思いますが、何かまずいことがあったのでしょうか?
■No25107に返信(Azuleanさんの記事)
> ■No25106に返信(ふろんさんの記事)
>>ファイル名の自動入力で
>>WebBrowser2.Document.GetElementById("file").InvokeMember("Click") で
>>ファイルを開くダイアログをオープンしたときのイベントをキャッチしたいのですが
>>コードがよく分かりません。
>
> 「ファイルを開くダイアログが表示されること」は、「プログラムが起動されたこと」ではありません。
> 同じプログラムの中で、新しいダイアログが表示されただけになります。
>
> 残念ながら、「プログラムが起動されたこと」の方針では目的のことを実現することはできません。
>
>>目的は、ファイルのダイアログがオープン直後に
>>SendKeys.Send(PicFil)にて
>>ファイル名の自動入力を目的としています。
>
> No25046 にも書きましたが、タイマーで開いたかどうかチェックする手法もあるでしょう。
> ただ、この手法は同じ名前のダイアログがいると、判別するのが困難かもしれません。
>
> 一定時間待つでも良いとは思いますが、何かまずいことがあったのでしょうか?
>

Azulean 様
何時もありがとうございます。
その後、色々テストしてみたのですが通常の方法でダイアログを先に開いてしまうと
そこで、ファイルを選択しダイアログのボタンを押さない限り処理が止まってしまい
次のステップ → SendKeys.Send(PicFil) に進めません。
そこで、SendKeys.Send(PicFil)を先に実行しその後ダイアログをオープンして
何とかいけていたのですが、どうも安定が悪くファイルパスの初めの部分が抜けていたりします。
しかし、SendKeys.Send(PicFil)を先に実行しあとからダイアログをオープンして
なぜ入力が出来ているのかよく分りませんが
やっぱり順序としては、ダイアログをオープンしてからファイル名のインプット
が手順だと思うのですが、ダイアログをオープンしてしまうと次のステップに進めず困っています。
最低限ここのところだけはマルチスレッドで並行処理をやらなければいけないのではと思っていますが処理の仕方がよく分らず・・・・・
くどい説明になってしまい申し訳ございません。
仮に、ダイアログオープンがキャッチできたとしても、スレッドにしないと同じことになりそうですね。
> ただ、この手法は同じ名前のダイアログがいると、判別するのが困難かもしれません。
この部分は、自分専用ですので管理できるのではと思ってるのですが。
■No25108に返信(ふろんさんの記事)
> ■No25107に返信(Azuleanさんの記事)
>>■No25106に返信(ふろんさんの記事)
> >>ファイル名の自動入力で
> >>WebBrowser2.Document.GetElementById("file").InvokeMember("Click") で
> >>ファイルを開くダイアログをオープンしたときのイベントをキャッチしたいのですが
> >>コードがよく分かりません。
>>
>>「ファイルを開くダイアログが表示されること」は、「プログラムが起動されたこと」ではありません。
>>同じプログラムの中で、新しいダイアログが表示されただけになります。
>>
>>残念ながら、「プログラムが起動されたこと」の方針では目的のことを実現することはできません。
>>
> >>目的は、ファイルのダイアログがオープン直後に
> >>SendKeys.Send(PicFil)にて
> >>ファイル名の自動入力を目的としています。
>>
>>No25046 にも書きましたが、タイマーで開いたかどうかチェックする手法もあるでしょう。
>>ただ、この手法は同じ名前のダイアログがいると、判別するのが困難かもしれません。
>>
>>一定時間待つでも良いとは思いますが、何かまずいことがあったのでしょうか?
>>
>
> Azulean 様
> 何時もありがとうございます。
> その後、色々テストしてみたのですが通常の方法でダイアログを先に開いてしまうと
> そこで、ファイルを選択しダイアログのボタンを押さない限り処理が止まってしまい
> 次のステップ → SendKeys.Send(PicFil) に進めません。
> そこで、SendKeys.Send(PicFil)を先に実行しその後ダイアログをオープンして
> 何とかいけていたのですが、どうも安定が悪くファイルパスの初めの部分が抜けていたりします。
> しかし、SendKeys.Send(PicFil)を先に実行しあとからダイアログをオープンして
> なぜ入力が出来ているのかよく分りませんが
> やっぱり順序としては、ダイアログをオープンしてからファイル名のインプット
> が手順だと思うのですが、ダイアログをオープンしてしまうと次のステップに進めず困っています。
> 最低限ここのところだけはマルチスレッドで並行処理をやらなければいけないのではと思っていますが処理の仕方がよく分らず・・・・・
> くどい説明になってしまい申し訳ございません。

>>残念ながら、「プログラムが起動されたこと」の方針では目的のことを実現することはできません。

↑タイマーと云うのはマルチスレッドでということでしょうか??
■No25109に返信(ふろんさんの記事)
> ↑タイマーと云うのはマルチスレッドでということでしょうか??
System.Windows.Forms.Timer のことを暗に指していましたので、マルチスレッドではありません。(タイマーはいくつか種類があり、ものによってはマルチスレッドになることもあります)

System.Windows.Forms.Timer はツールボックスの「コンポーネント」というカテゴリにあり、それを貼り付けることで利用できるようになります。


■No25108に返信(ふろんさんの記事)
> その後、色々テストしてみたのですが通常の方法でダイアログを先に開いてしまうと
> そこで、ファイルを選択しダイアログのボタンを押さない限り処理が止まってしまい
> 次のステップ → SendKeys.Send(PicFil) に進めません。
試していないので推測になりますが、InvokeMember を実行したら、ダイアログを閉じるまで次の行が実行されないと言うことでしょうか?

> そこで、SendKeys.Send(PicFil)を先に実行しその後ダイアログをオープンして
> 何とかいけていたのですが、どうも安定が悪くファイルパスの初めの部分が抜けていたりします。
”たまたま”いけていた状態です。
環境によっては全く駄目なことや、問題なく動くこともあるでしょう。
状況によっても左右されますので、危ないコードと言えます。

> 最低限ここのところだけはマルチスレッドで並行処理をやらなければいけないのではと思っていますが処理の仕方がよく分らず・・・・・
> くどい説明になってしまい申し訳ございません。
そのスレッドが完全に止まってしまうわけではないと思いますので、先ほどのタイマーで逃げるという手もなくはないです。

----- イメージコード -----
Timer1.Enabled = True
InvokeMember 呼び出し → ダイアログが閉じるまで帰ってこない

 裏でTimer1_Tickが呼ばれる。
 Timer1.Enabled = False ' 何度も呼ばれないようにしておく
 SendKeys.Send() ' ダイアログにファイル名 + Enter 送信
 イベント終了

ダイアログが閉じたので元の処理に戻ってくる
----- ここまで -----

タイマーでダイアログが表示されたかどうかチェックするなり、チェック自体を省いて一定時間後に実行するという手抜きにしたりは組み方次第かと。

# InvokeMember の中でメッセージループが回っていることを前提としています。

> 仮に、ダイアログオープンがキャッチできたとしても、スレッドにしないと同じことになりそうですね。
十分な知識があれば構わないと思いますが、安易にスレッドに手を出すと、酷い目に遭いやすいです。

> この部分は、自分専用ですので管理できるのではと思ってるのですが。
他にファイルを開くダイアログを同時に表示することがないのであれば、特に問題にはならないと思います。
■No25110に返信(Azuleanさんの記事)
> ■No25109に返信(ふろんさんの記事)
>>↑タイマーと云うのはマルチスレッドでということでしょうか??
> System.Windows.Forms.Timer のことを暗に指していましたので、マルチスレッドではありません。(タイマーはいくつか種類があり、ものによってはマルチスレッドになることもあります)
>
> System.Windows.Forms.Timer はツールボックスの「コンポーネント」というカテゴリにあり、それを貼り付けることで利用できるようになります。
>
>
> ■No25108に返信(ふろんさんの記事)
>>その後、色々テストしてみたのですが通常の方法でダイアログを先に開いてしまうと
>>そこで、ファイルを選択しダイアログのボタンを押さない限り処理が止まってしまい
>>次のステップ → SendKeys.Send(PicFil) に進めません。
> 試していないので推測になりますが、InvokeMember を実行したら、ダイアログを閉じるまで次の行が実行されないと言うことでしょうか?
>
>>そこで、SendKeys.Send(PicFil)を先に実行しその後ダイアログをオープンして
>>何とかいけていたのですが、どうも安定が悪くファイルパスの初めの部分が抜けていたりします。
> ”たまたま”いけていた状態です。
> 環境によっては全く駄目なことや、問題なく動くこともあるでしょう。
> 状況によっても左右されますので、危ないコードと言えます。
>
>>最低限ここのところだけはマルチスレッドで並行処理をやらなければいけないのではと思っていますが処理の仕方がよく分らず・・・・・
>>くどい説明になってしまい申し訳ございません。
> そのスレッドが完全に止まってしまうわけではないと思いますので、先ほどのタイマーで逃げるという手もなくはないです。
>
> ----- イメージコード -----
> Timer1.Enabled = True
> InvokeMember 呼び出し → ダイアログが閉じるまで帰ってこない
>
>  裏でTimer1_Tickが呼ばれる。
>  Timer1.Enabled = False ' 何度も呼ばれないようにしておく
>  SendKeys.Send() ' ダイアログにファイル名 + Enter 送信
>  イベント終了
>
> ダイアログが閉じたので元の処理に戻ってくる
> ----- ここまで -----
>
> タイマーでダイアログが表示されたかどうかチェックするなり、チェック自体を省いて一定時間後に実行するという手抜きにしたりは組み方次第かと。
>
> # InvokeMember の中でメッセージループが回っていることを前提としています。
>
>>仮に、ダイアログオープンがキャッチできたとしても、スレッドにしないと同じことになりそうですね。
> 十分な知識があれば構わないと思いますが、安易にスレッドに手を出すと、酷い目に遭いやすいです。
>
>>この部分は、自分専用ですので管理できるのではと思ってるのですが。
> 他にファイルを開くダイアログを同時に表示することがないのであれば、特に問題にはならないと思います。

Azulean 様
何時もご指導ありがとうございます。

>十分な知識があれば構わないと思いますが、安易にスレッドに手を出すと、酷い目に遭いやすいです。

もはや、スレッド以外に解決策はないかと、サンプルをいじくりり回していたところです。
がとても私のレベルでは手に負えそうに無く途方に暮れていました。

> 試していないので推測になりますが、InvokeMember を実行したら、ダイアログを閉じるまで次の行が実行されないと言うことでしょうか?
>
ここのところ記述が間違っていました。
' ダイアログオープン
WebBrowser2.Document.GetElementById("file").InvokeMember("Click")
の実行により開かれたダイアログを閉じないと次のステップに進まないということです。
従ってスレッドにして並行処理しかないかなと思っていました。

> ”たまたま”いけていた状態です。
> 環境によっては全く駄目なことや、問題なく動くこともあるでしょう。
> 状況によっても左右されますので、危ないコードと言えます。

そうですよね、私もいまだに何故これでファイル名のインプットがいけているのか
よく分りません。理解できないコードはやるべきではないですね。

> System.Windows.Forms.Timer はツールボックスの「コンポーネント」というカテゴリにあり、それを貼り付けることで利用できるようになります。

早速 ↑ のテストをしてみます。

またご報告させていただきます。
前回の手法では解決していない、ということでしょうか?

初めにも説明しましたと思いますが、この方法はトリッキーです。
何かしらのリカバリー方法を準備しておく必要があります。

Timerを起動して一定期間ダイアログが閉じなければ強制的に閉じてリトライするなど。

>そこで、SendKeys.Send(PicFil)を先に実行しその後ダイアログをオープンして
>何とかいけていたのですが、どうも安定が悪くファイルパスの初めの部分が抜けていたりします。

5秒後に起動するようなTimerを動作させ、ダイアログをオープンする。
5秒後のTimer動作でSendeKeyではどうですか?

WebBrowserにPOSTを実装した方が確実だと思います。
■No25113に返信(ヴァンさんの記事)
> WebBrowserにPOSTを実装した方が確実だと思います。
気になっていたのですが、WebBrowserにPOSTを実装するとはどのようなことでしょうか?
可能性があるとすればWebClientを使う方法かなと考えたのですが、WebBrowserとの関連性が思い浮かばなかったものですので、ヒントとなりそうなものを書き添えて頂ければなと思いました。
■No25119に返信(Azuleanさんの記事)
> ■No25113に返信(ヴァンさんの記事)
>>WebBrowserにPOSTを実装した方が確実だと思います。
> 気になっていたのですが、WebBrowserにPOSTを実装するとはどのようなことでしょうか?
> 可能性があるとすればWebClientを使う方法かなと考えたのですが、WebBrowserとの関連性が思い浮かばなかったものですので、ヒントとなりそうなものを書き添えて頂ければなと思いました。

前回も書いたと思うのですが、

http://www.codeproject.com/KB/aspnet/set-webbrowser-file-input.aspx?display=Print

これを参考にすれば可能です。
自分の場合はそのままではうまくアップロードできませんでしたので、
色々と手を入れましたけど。

WebClientでも可能ですが、タグ解析を考慮するとこちらを使った方が楽かなと思います。
■No25120に返信(ヴァンさんの記事)
> ■No25119に返信(Azuleanさんの記事)
>>■No25113に返信(ヴァンさんの記事)
> >>WebBrowserにPOSTを実装した方が確実だと思います。
>>気になっていたのですが、WebBrowserにPOSTを実装するとはどのようなことでしょうか?
>>可能性があるとすればWebClientを使う方法かなと考えたのですが、WebBrowserとの関連性が思い浮かばなかったものですので、ヒントとなりそうなものを書き添えて頂ければなと思いました。
>
> 前回も書いたと思うのですが、
>
> http://www.codeproject.com/KB/aspnet/set-webbrowser-file-input.aspx?display=Print
>
> これを参考にすれば可能です。
> 自分の場合はそのままではうまくアップロードできませんでしたので、
> 色々と手を入れましたけど。
>
> WebClientでも可能ですが、タグ解析を考慮するとこちらを使った方が楽かなと思います。
>

Azulean 様
ヴァン 様

色々とご指導ありがとうございます。
Azulean 様より教えていただいた、タイマー方式で先ほどまでテストを繰り返していましたが、100%完璧に安定したファイル名入力に成功しました。
ありがとうございました!!。

手間取っていたのは、フォルダーの名称に日本語を使用していたため
SendKeys.Send() ステートメントの実行の際文字化けを起こしてしまい
混乱していました、フォルダーやファイル名を全て小文字英数字にして
確実なインプットができるようになりました。

一応関係部分のみコードを書いておきます。

Call Timer_start() ' タイマー スタート → ファイルダイアログオープン & Picファイルインプット

Private Sub Timer_start() ' タイマー スタート → ファイルダイアログオープン

Timer1.Interval = 1000 'タイマー間隔1秒に設定
Timer1.Enabled = True ' Timer Star
Label47.Text = "タイマー スタート → ダイアログオープン"
WebBrowser2.Document.GetElementById("file").InvokeMember("Click")
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

If Cunt = 3 Then '3秒経過!! PICファイル入力
SendKeys.Send(PicFil) ' PIcファイルインプット
SendKeys.Send("{ENTER}")
Label47.Text = "3秒経過!! PICファイル入力完了"
Label4.Text = "画像投稿完了 !!"
Timer1.Enabled = False 'タイマーStop
Exit Sub
End If
Cunt = Cunt + 1
Label47.Text = Cunt & " 秒経過!! "
Application.DoEvents()
End Sub

私も、ダイアログオープンしてファイル名インプットを実行するには
ダイアログを閉じない限り次のステップに進めず、もはやスレッドの採用しかないかと思っていました。
Azulean 様より最初の段階から、タイマー方式のアイデアを頂きながら
スレッドの先入観で、何をしてもダイアログを閉じない限り全ての処理が
停止してしまうと思い込んでしまい遠回りをしてしまいました。

それにしても、タイマーによる裏のスレッドもどき???
タイマーの働きが今一理解できてませんが、簡単に並行処理みたいなことが
できてしまうとは、やってみて驚きました!
スレッドの場合は、ラベル表示一つでも”有効ではないスレッド間の操作で例外が・・・”のように厳しく制限がかかってしまうのに
実験は、していませんがタイマーの場合そのような競合の心配はないのでしょうか?

また、タイマーでの裏操作?の場合どのくらいの(時間)長さの処理が可能なのでしょうか?
例えば、タイマー間隔を1秒に設定した場合1秒経つとまたそのステップが実行されるとなると処理の内容は1秒以内と考えておかなければならないのでしょうか?

ヴァン 様の紹介サイトも拝見しましたが、英文でCとなると私の理解を超えており
申し訳ございませんが、手がつけられなかったです。

しかしながら、私のPCと限られた環境の中ではタイマー方式で確実にファイル名のインプットが出来るようにまりした。
非情に知識に浅く、理解力に乏しいにもかかわらず、長々とお付き合い頂き
感謝いたします、ありがとうございました。
■No25120に返信(ヴァンさんの記事)
>>可能性があるとすればWebClientを使う方法かなと考えたのですが、WebBrowserとの関連性が思い浮かばなかったものですので、ヒントとなりそうなものを書き添えて頂ければなと思いました。
>
> 前回も書いたと思うのですが、
確認不十分でした。申し訳ありません。

# CodeProject でもnot working とか書かれている点が気にかかりますが、試していません。

■No25123に返信(ふろんさんの記事)
> Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
>
(略)
> Label47.Text = Cunt & " 秒経過!! "
> Application.DoEvents()
> End Sub
この Application.DoEvents はなぜあるのでしょうか。
Application.DoEvents を使う理由が明確に説明できないのであれば、無闇に使ってはいけません。また、理由があったとしても、基本的には避けるべきです。
色々とバグを生む温床になるからです。

> Azulean 様より最初の段階から、タイマー方式のアイデアを頂きながら
> スレッドの先入観で、何をしてもダイアログを閉じない限り全ての処理が
> 停止してしまうと思い込んでしまい遠回りをしてしまいました。
Windows プログラミングの根底にある、メッセージループの概念が分かっていると、このあたりの考え方は変わってくると思います。
ただ、.NET Framework でコードを書いていると、そのあたりの意識を持つことは難しいかもしれません。

> それにしても、タイマーによる裏のスレッドもどき???
> タイマーの働きが今一理解できてませんが、簡単に並行処理みたいなことが
> できてしまうとは、やってみて驚きました!
スレッドとは明確に異なります。
このあたりの説明は入門書、参考書に譲ります。
なるべく自分で理解しておいて下さい。

> スレッドの場合は、ラベル表示一つでも”有効ではないスレッド間の操作で例外が・・・”のように厳しく制限がかかってしまうのに
> 実験は、していませんがタイマーの場合そのような競合の心配はないのでしょうか?
今回、利用して頂いた、System.Windows.Forms.Timer に関しては同じスレッドで実行されますので、InvalidOperationExcception が発生することはありません。
System.Threading.Timer や System.Timers.Timer だと事情は異なります。

> また、タイマーでの裏操作?の場合どのくらいの(時間)長さの処理が可能なのでしょうか?
> 例えば、タイマー間隔を1秒に設定した場合1秒経つとまたそのステップが実行されるとなると処理の内容は1秒以内と考えておかなければならないのでしょうか?
1 秒以内に終わらなくても構いませんが、そういったコードを書いていると、フォームが操作できなくなる等の問題を生むかもしれません。

そんなに長い処理を実行するのであれば、処理の最初に Timer コンポーネントの Enabled プロパティを False に設定しておくことが無難ではないでしょうか。

> ヴァン 様の紹介サイトも拝見しましたが、英文でCとなると私の理解を超えており
> 申し訳ございませんが、手がつけられなかったです。
C ではありません。C# です。
■No25127に返信(Azuleanさんの記事)
> ■No25120に返信(ヴァンさんの記事)
> >>可能性があるとすればWebClientを使う方法かなと考えたのですが、WebBrowserとの関連性が思い浮かばなかったものですので、ヒントとなりそうなものを書き添えて頂ければなと思いました。
>>
>>前回も書いたと思うのですが、
> 確認不十分でした。申し訳ありません。
>
> # CodeProject でもnot working とか書かれている点が気にかかりますが、試していません。
>
> ■No25123に返信(ふろんさんの記事)
>> Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
>>
> (略)
>> Label47.Text = Cunt & " 秒経過!! "
>> Application.DoEvents()
>> End Sub
> この Application.DoEvents はなぜあるのでしょうか。
> Application.DoEvents を使う理由が明確に説明できないのであれば、無闇に使ってはいけません。また、理由があったとしても、基本的には避けるべきです。
> 色々とバグを生む温床になるからです。
>
>>Azulean 様より最初の段階から、タイマー方式のアイデアを頂きながら
>>スレッドの先入観で、何をしてもダイアログを閉じない限り全ての処理が
>>停止してしまうと思い込んでしまい遠回りをしてしまいました。
> Windows プログラミングの根底にある、メッセージループの概念が分かっていると、このあたりの考え方は変わってくると思います。
> ただ、.NET Framework でコードを書いていると、そのあたりの意識を持つことは難しいかもしれません。
>
>>それにしても、タイマーによる裏のスレッドもどき???
>>タイマーの働きが今一理解できてませんが、簡単に並行処理みたいなことが
>>できてしまうとは、やってみて驚きました!
> スレッドとは明確に異なります。
> このあたりの説明は入門書、参考書に譲ります。
> なるべく自分で理解しておいて下さい。
>
>>スレッドの場合は、ラベル表示一つでも”有効ではないスレッド間の操作で例外が・・・”のように厳しく制限がかかってしまうのに
>>実験は、していませんがタイマーの場合そのような競合の心配はないのでしょうか?
> 今回、利用して頂いた、System.Windows.Forms.Timer に関しては同じスレッドで実行されますので、InvalidOperationExcception が発生することはありません。
> System.Threading.Timer や System.Timers.Timer だと事情は異なります。
>
>>また、タイマーでの裏操作?の場合どのくらいの(時間)長さの処理が可能なのでしょうか?
>>例えば、タイマー間隔を1秒に設定した場合1秒経つとまたそのステップが実行されるとなると処理の内容は1秒以内と考えておかなければならないのでしょうか?
> 1 秒以内に終わらなくても構いませんが、そういったコードを書いていると、フォームが操作できなくなる等の問題を生むかもしれません。
>
> そんなに長い処理を実行するのであれば、処理の最初に Timer コンポーネントの Enabled プロパティを False に設定しておくことが無難ではないでしょうか。
>
>>ヴァン 様の紹介サイトも拝見しましたが、英文でCとなると私の理解を超えており
>>申し訳ございませんが、手がつけられなかったです。
> C ではありません。C# です。

Azulean 様
疑問点に関するご説明ありがとうございます。

>Application.DoEvents を使う理由が明確に説明できないのであれば、無闇に使ってはいけません。

サンプルで使っているところがありましたので、非常に処理が早い場合?
表示が出ないことがありましたので念のためとつい安易に使っていました。
テスト確認し必要ないところは削除します。

>スレッドとは明確に異なります。
この辺り(スレッド)も含めて未だ十分理解できていません
勉強しておきます。

タイマー処理(時間の件)については、スレッドもどきみたいな誤解をしていましたので
そんな長い処理をやるつもりは、ないのですが変な質問をしてしまいました。
今回のタイマー内での処理は最低限の処理にとどめています。

お陰さまで、私にとっては最大の難関であった画像投稿の自動化を達成することができました。
更に、疑問点にまで解説を頂き感謝致します。
色々ご指導頂いた方々に深く御礼申し上げ、解決とさせて頂きます。
ありがとうございました。
■No25128に返信(ふろんさんの記事)
> ■No25127に返信(Azuleanさんの記事)
>>■No25120に返信(ヴァンさんの記事)
>>>>可能性があるとすればWebClientを使う方法かなと考えたのですが、WebBrowserとの関連性が思い浮かばなかったものですので、ヒントとなりそうなものを書き添えて頂ければなと思いました。
> >>
> >>前回も書いたと思うのですが、
>>確認不十分でした。申し訳ありません。
>>
>># CodeProject でもnot working とか書かれている点が気にかかりますが、試していません。
>>
>>■No25123に返信(ふろんさんの記事)
> >> Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
> >>
>>(略)
> >> Label47.Text = Cunt & " 秒経過!! "
> >> Application.DoEvents()
> >> End Sub
>>この Application.DoEvents はなぜあるのでしょうか。
>>Application.DoEvents を使う理由が明確に説明できないのであれば、無闇に使ってはいけません。また、理由があったとしても、基本的には避けるべきです。
>>色々とバグを生む温床になるからです。
>>
> >>Azulean 様より最初の段階から、タイマー方式のアイデアを頂きながら
> >>スレッドの先入観で、何をしてもダイアログを閉じない限り全ての処理が
> >>停止してしまうと思い込んでしまい遠回りをしてしまいました。
>>Windows プログラミングの根底にある、メッセージループの概念が分かっていると、このあたりの考え方は変わってくると思います。
>>ただ、.NET Framework でコードを書いていると、そのあたりの意識を持つことは難しいかもしれません。
>>
> >>それにしても、タイマーによる裏のスレッドもどき???
> >>タイマーの働きが今一理解できてませんが、簡単に並行処理みたいなことが
> >>できてしまうとは、やってみて驚きました!
>>スレッドとは明確に異なります。
>>このあたりの説明は入門書、参考書に譲ります。
>>なるべく自分で理解しておいて下さい。
>>
> >>スレッドの場合は、ラベル表示一つでも”有効ではないスレッド間の操作で例外が・・・”のように厳しく制限がかかってしまうのに
> >>実験は、していませんがタイマーの場合そのような競合の心配はないのでしょうか?
>>今回、利用して頂いた、System.Windows.Forms.Timer に関しては同じスレッドで実行されますので、InvalidOperationExcception が発生することはありません。
>>System.Threading.Timer や System.Timers.Timer だと事情は異なります。
>>
> >>また、タイマーでの裏操作?の場合どのくらいの(時間)長さの処理が可能なのでしょうか?
> >>例えば、タイマー間隔を1秒に設定した場合1秒経つとまたそのステップが実行されるとなると処理の内容は1秒以内と考えておかなければならないのでしょうか?
>>1 秒以内に終わらなくても構いませんが、そういったコードを書いていると、フォームが操作できなくなる等の問題を生むかもしれません。
>>
>>そんなに長い処理を実行するのであれば、処理の最初に Timer コンポーネントの Enabled プロパティを False に設定しておくことが無難ではないでしょうか。
>>
> >>ヴァン 様の紹介サイトも拝見しましたが、英文でCとなると私の理解を超えており
> >>申し訳ございませんが、手がつけられなかったです。
>>C ではありません。C# です。
>
> Azulean 様
> 疑問点に関するご説明ありがとうございます。
>
> >Application.DoEvents を使う理由が明確に説明できないのであれば、無闇に使ってはいけません。
>
> サンプルで使っているところがありましたので、非常に処理が早い場合?
> 表示が出ないことがありましたので念のためとつい安易に使っていました。
> テスト確認し必要ないところは削除します。
>
> >スレッドとは明確に異なります。
> この辺り(スレッド)も含めて未だ十分理解できていません
> 勉強しておきます。
>
> タイマー処理(時間の件)については、スレッドもどきみたいな誤解をしていましたので
> そんな長い処理をやるつもりは、ないのですが変な質問をしてしまいました。
> 今回のタイマー内での処理は最低限の処理にとどめています。
>
> お陰さまで、私にとっては最大の難関であった画像投稿の自動化を達成することができました。
> 更に、疑問点にまで解説を頂き感謝致します。
> 色々ご指導頂いた方々に深く御礼申し上げ、解決とさせて頂きます。
> ありがとうございました。
>
>
>
>
>
>
>
>
>
>
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板