こんにちは。以前のスレッドを何件か拝見して、私の事象がないようなので、投稿します。背面フォーム内の処理をタイマ割込みやループなどで処理しつつ、その前面でフォームを表示する場合、SetWindowPosのAPIが有効というところまでは分かっているのですが、私の場合、割り込みによるビットのON/OFFをしたいと思ってロジックを組んでいるのですが・・・
どうしてもモーダルフォームを前面表示したときと同じように、背面での処理が走ってくれません・・・
ロジックですが、前面フォームのイベントを
sub Form_Load()
SetWindowPos(frm_ctrl.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
end sub
のように行っています。アンロード時にハンドルの設定は解除してあります。
タイマ割込みの処理が他者作成のため、目下処理が不明なのですが、こちらの方もAPIを使用しているかもしれません。
情報が少なくて恐縮ですが、この内容で解決の手掛かりとなる事をご教授頂けると幸いです。
ビット出力と前面フォームの関係です。
sub main()
frmA.Show 'frmAフォームを表示
Do
'ビット出力処理
DoEvents
Loop
end sub
'-----------------------------------------
sub cmdB_Click() 'frmAのcmdBコマンドボタンでfrmCを表示
Response = "" 'frmCでのイベントによる変数
frmC.Show 'frmCフォームを表示
Do Response = "" 'frmCから値を得るまでループ
Doevents
Loop
if Response <> "" then
'戻り値別の処理
end if
end sub
'-----------------------------------------
上記は要点だけなので、分かり易く単純化してあります。
問題点は、frmCのイベントにて値が格納される
"Response"を確実に得るまでの間ループすることです。
当初SetWindowPosと思われたのですが、もっと単純な部分でのつまずきでした。上記のビット出力処理というのは、どういう状況でも常に実行されなくてはならない箇所(背面処理)で、フォームから発生させるイベントはDB更新やファイル作成など、データ処理をユーザの任意で行うもの(前面処理)で、"Response"を得ないとfrmCを閉じて他の処理へは進めないようにしたいが、背面処理は行いたいというイメージです。
お礼
kmb01さん、ご回答ありがとうございます。原因が分かったのですが、補足でご説明したいと思います。恐れ入りますが、補足をご覧頂いてもう一度ご助言いただけますと幸いです。
補足
ビット出力と前面フォームの関係です。 sub main() frmA.Show 'frmAフォームを表示 Do 'ビット出力処理 DoEvents Loop end sub '----------------------------------------- sub cmdB_Click() 'frmAのcmdBコマンドボタンでfrmCを表示 Response = "" 'frmCでのイベントによる変数 frmC.Show 'frmCフォームを表示 Do Response = "" 'frmCから値を得るまでループ Doevents Loop if Response <> "" then '戻り値別の処理 end if end sub '----------------------------------------- 上記は要点だけなので、分かり易く単純化してあります。 問題点は、frmCのイベントにて値が格納される "Response"を確実に得るまでの間ループすることです。 当初SetWindowPosと思われたのですが、もっと単純な部分でのつまずきでした。上記のビット出力処理というのは、どういう状況でも常に実行されなくてはならない箇所(背面処理)で、フォームから発生させるイベントはDB更新やファイル作成など、データ処理をユーザの任意で行うもの(前面処理)で、"Response"を得ないとfrmCを閉じて他の処理へは進めないようにしたいが、背面処理は行いたいというイメージです。