- PR -

フォームのフォーカス設定について

1
投稿者投稿内容
まめ
会議室デビュー日: 2004/05/25
投稿数: 2
投稿日時: 2004-07-01 13:26
はじめまして。
VB.NET 2003で以下のような状態が発生しており、何かいい方法やアドバイスが頂けないかと思い、書き込みしています。よろしくお願い致します。
ちなみにOSはWin2000、XP、2003です。

●目的
アプリAからアプリBを起動し、アプリBが終了するまでアプリAには一切のイベントなどを発生させたくない。基本的にアプリAもアプリBもアクティブ時に最前面に設定している。また、アプリで使用しているフォームのスタイルは全てNone。

●手法

アプリAのボタンクリックイベント

Me.Enabled = False
bolRet = clsAPI32.ExecuteCmd(mCstrExePath & mstM_PG.strPGFL, True)
Me.TopMost = True
Me.Enabled = True
Me.Activate()

「Me」はアプリA
「mCstrExePath & mstM_PG.strPGFL」はアプリB
「clsAPI32.ExecuteCmd」はExeを起動し終了するまで待機する関数


●状態
アプリAは待ち状態のまま極力イベントなどが発生するのを抑えたいので、Me.Enabled = False としています。
そのあと、アプリBを起動し待機しているのですが、アプリB終了後、Me.Enabled = Trueが実行され、Me.Activate()も実行されますが、アプリAのフォームにフォーカスが戻ってきません。おそらくMe.Enabled = False をしているため、一度他のアプリケーションにフォーカスが移動しているためだと思うのですが、どうも、Me.Activate()自体がうまく動いていない気がします。Activatedイベントにて確認したところ、やはり発生していません。

●推測
ボタンクリックイベント内でActiveにしても意味がない??外部からアプリAのフォームに対して、アクティブになるようなメッセージをポストする必要がある??


ちょっとこれだけの内容では不十分だと思いますが、何か良い解決策をお願い致します。
nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2004-07-01 14:24
アプリBの起動に関わらずMe.Enabled = Falseとした時点でフォーカスがどこかいってるってことないですか?(たぶんフォームの上に入力コントロールがあって、そのフォーカスのことをいってるんですよね?)

Me.Activate() でなく Me.Focus() としたらどうなります?
(VB.NETよく知らないので書き方があってるか分からないですが。C# だと this.Focus(); )
まめ
会議室デビュー日: 2004/05/25
投稿数: 2
投稿日時: 2004-07-01 14:52
レスありがとうございます。
Me.Focus()としても結果は同じでした。
アプリAの詳細です。
フォームがひとつあり、入力コントロールはテキストボックス1つあるだけです。
あとはコマンドボタンが数個配置されています。

ここで困っているのは、アプリBから戻ったときに、アプリAのフォーム上のテキストボックスにカーソルが設定されてはいるのですが(テキストボックス内のカーソルが点滅しているため)、テンキーを押下してもアプリA自体がフォーカスを持っていないためテンキー入力値がテキストボックスに反映されないのです。
当然の結果ですが、以下のことをためしました。
@アプリB終了直後にメッセージボックスを表示する
⇒メッセージボックスにフォーカスがあり、OKボタンをEnterキーを消すため、アプリAのフォームがWindowsでのカレントアプリのフォームとして認識される
Aダイアログをモーダル表示する
⇒メッセージボックスと同じ
Bダミーのフォーム(表示直後、ActiveイベントにてClose)を表示する
⇒アプリAにフォーカスは設定されない

アプリAのボタンクリックイベントにて、アプリBの終了直後に、アプリAのフォームにマウス左ボタンダウンのメッセージを投げてみましたが、結果は同じでした。
(何か基本的なイベントの考え方を間違っているような気がします・・・)
アプリAのボタンクリックイベントが完全に終了したあとに何かしないといけない気がしています。
1

スキルアップ/キャリアアップ(JOB@IT)