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

フォーカスが移動できない

環境/言語:[WinXPsp2,C#,.NET Framework1.1]
分類:[.NET]

いつも参考にさせてもらっています。よろしくお願いします。

2つのプロセスを作成し、MessageQueueクラスを用いてプロセス間通信(同じマシン内、プライベートのキューです)をしています。
一方のプロセスには複数のテキストボックスをフォーム上に用意しています。
もう一方からキューを送信して、上記のプロセスがキューを受信した際にテキストボックス内の
フォーカスを順に移動させようとしているのですが、Focus()メソッドを使用しても戻り値が
Falseとなり移動されません。
キューの内容にテキストボックスへの文字列表示にした場合はうまくいくので、テキストボックスの
コントロールへはキューによる操作ができると思っているのですが、フォーカスが移動できないのは
なぜでしょうか?
メッセージキューの受信は非同期を使用しています。
こんにちは、じゃんぬ です。

■No10965に返信(Synさんの記事)
> キューの内容にテキストボックスへの文字列表示にした場合はうまくいくので、テキストボックスの
> コントロールへはキューによる操作ができると思っているのですが、フォーカスが移動できないのは
> なぜでしょうか?
> メッセージキューの受信は非同期を使用しています。

む、非同期ですか。
受信側のソースだけでも提示すると、何かヒントがもらえるかもしれません。
■No10968に返信(じゃんぬねっとさんの記事)
> こんにちは、じゃんぬ です。
>
> ■No10965に返信(Synさんの記事)
>>キューの内容にテキストボックスへの文字列表示にした場合はうまくいくので、テキストボックスの
>>コントロールへはキューによる操作ができると思っているのですが、フォーカスが移動できないのは
>>なぜでしょうか?
>>メッセージキューの受信は非同期を使用しています。
>
> む、非同期ですか。
> 受信側のソースだけでも提示すると、何かヒントがもらえるかもしれません。

じゃんぬねっとさん、返信をありがとうございます。
すみません、自己解決しました。

以下の2つにより異なるスレッドで動作しているものとは思っていませんでした。
@キュー受信を非同期にしていた。
Aキュー受信にてテキストボックスへの文字列表示が可能だった。

つい今しがた試してみたのですが、テキストボックスの「InvokeRequired」を
チェックしてみました。すると、「True」が返ってきました。
「あ、これはdelegateで処理しなければいけない」のだと気づきました。
Invoke()メソッドにより代理処理を用意したらうまくいきました。

お騒がせしてしまってすみませんでした。

こちらを参考にさせていただきました。
http://dobon.net/vb/melma/dotnet25.txt
解決済み!
少し補足します。

> 「あ、これはdelegateで処理しなければいけない」のだと気づきました。
> Invoke()メソッドにより代理処理を用意したらうまくいきました。

と書くと、動機と手段が逆になっているような印象を受けます。(私は)

「delegate で処理する必要がある」のではなく「Invoke() する必要がある」って、Invoke() を使うには(結果として)「delegate を使用することになる」のです。

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