[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/11/12(Sat) 13:53
投稿者名:E
Eメール:
URL :
タイトル:
あるウィンドウの手前にフォームを表示
環境:WindowsXP Pro SP1,VB6.0
開発初心者です。
あるソフトウェア(CAD)からVBで作ったEXEをキックし、フォームを表示しています。
常にあるソフトウェアのウィンドウの手前にフォームを表示させたいのですが、
やり方が分からず困っています。
フォーム表示後、ウィンドウをメモ帳等他のソフトに切り替えることがあります。
その後も、あるソフトウェアをタスクバーから選ぶとフォームが手前に表示される
ようにしたいと考えています。

今はフォームを常に一番手前に表示させています。
※サンプルを参考にさせて頂きました。ありがとうございます。

どうぞお力添えのほど宜しくお願い致します。

投稿時間:2005/11/12(Sat) 20:02
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: あるウィンドウの手前にフォームを表示
他にいい方法があるかも知れませんが、アクティブウィンドウを監視して、あるソフトが
アクティブになったら、フォームを再前面に表示するようにしたらどうですか?

投稿時間:2005/11/12(Sat) 20:32
投稿者名: 
Eメール:
URL :
タイトル:
Re^2: あるウィンドウの手前にフォームを表示
強引にSetParent()で、相手を自分の子にしてしまうとか…
あれ…メモ帳がForm1の中に入るか、メモ帳の中にForm1が入っちゃう…
だめかぁ(orz

投稿時間:2005/11/13(Sun) 01:52
投稿者名:Starfish
Eメール:
URL :
タイトル:
Re: あるウィンドウの手前にフォームを表示
> 環境:WindowsXP Pro SP1,VB6.0
> 開発初心者です。
> あるソフトウェア(CAD)からVBで作ったEXEをキックし、フォームを表示しています。
> 常にあるソフトウェアのウィンドウの手前にフォームを表示させたいのですが、
> やり方が分からず困っています。

 メモ帳の手前に表示するサンプルです。APIの定義は、APIビューアから
持ってきてください。

Private Sub Command1_Click()
    Dim lngRetuenValue As Long
    Dim lngHwndNotepad As Long
    
    lngHwndNotepad = FindWindow("Notepad", vbNullString)
    
    lngRetuenValue = SetWindowLong(Me.hwnd, GWL_HWNDPARENT, lngHwndNotepad)
    
End Sub

 ただし、SDKのドキュメントには、以下のように記載されております。何が起こっても
責任は取れませんので、自己責任でお願いします。

You must not call SetWindowLong with the GWL_HWNDPARENT index to change the parent of a
child window. Instead, use the SetParent function.

 SetParentを代わりに使えって言っても、機能が違うし、、、

投稿時間:2005/11/14(Mon) 20:30
投稿者名:E
Eメール:
URL :
タイトル:
Re^2: あるウィンドウの手前にフォームを表示
皆様ご回答ありがとうございます。
この方法でうまく動作したのですが、最後の注意書きが気になりますね・・・。

ネットで検索したのですが、ワトソン博士が出てくることがあるという情報以外、
見つけることができませんでした。

SetParentを使ってみましたが、無記名さんのおっしゃるとおり、
タスクバーから消え、メモ帳の中にフォームが取り込まれ
しかも中途半端に非表示になってしまいました。

逆にフォームを親にした場合、CADは完全に非表示になりました。

元々、CADのI/F(C言語)からEXEをキックし、EXEが終了するまで待機させている為、
CADの画面が真っ白(しかも応答無し)になってしまうのを
防ぐための手段として検討したものですから(そもそもこちらを質問すべきだったかもしれません)
CADが非表示になるのは結果オーライです。

花ちゃんさんの方法はまだ試していませんが、
とりあえずはSetparentでやってみようと思います。

本当にありがとうございました。
今後とも宜しくお願い致します。

P.S.
ちなみに上記の応答無しを回避する方法ってあるんでしょうか??
WaitForSingleObjectを使って待機させてます。

P.S.2
一応、ソースを書いておきます。
一部、Starfishさんのサンプルを流用させて頂きました。

Private Sub Command1_Click()
    lngHwndNotepad = FindWindow("Notepad", vbNullString)
    lngRetuenValue = SetParent(lngHwndNotepad, Me.hwnd)
End Sub

Private Sub Command2_Click()
    lngRetuenValue = SetParent(lngHwndNotepad, 0)
    ShowWindow lngHwndNotepad, SW_SHOWMAXIMIZED'Windowを最大化
End Sub