none
アプリケーションの最下位レベル RRS feed

  • 質問

  • お世話になります。

    現在、VB.NETでアプリケーションを作成しているのですが、

    作成したアプリケーションを、最背面(デスクトップの上のレベル)で、表示したいのですが、

    良い方法はありますでしょうか?

    2006年4月4日 9:33

すべての返信

  • 常に最背面かどうかわかりませんが、以下を見てみてください。

    常に最背面に表示されるウインドウ
    http://f57.aaa.livedoor.jp/~jeanne/bbs/faq.cgi?mode=al2&namber=419&KLOG=3

    2006年4月4日 9:50
    モデレータ
  • この例だと、同じアプリケーションの中での話だと思います。

    System.Diagnostics.Process.Start(StartInfo)

    別プロセスを立ち上げた時、必ず別プロセスより下のレベルで表示したいです。

    VB6の時は、常にデスクトップの上に表示するように、

    SetParent Me.hwnd, FindWindow("Progman", "Program Manager")を使用していました。


     

    2006年4月4日 10:13
  • VB.NETでも同じようにしたいということでいいんでしょうか?

    ウィンドウの最背面表示について
    http://dobon.net/vb/bbs/log3-2/938.html

    2006年4月4日 10:54
    モデレータ
  • VB.NETでも同じように、アプリケーションの下に隠したいのですが、

    >ウィンドウの最背面表示について
    ttp://dobon.net/vb/bbs/log3-2/938.html

    この例の通りやったら、画面から消えてしまいました。

    現在、メニュープログラムを作成しており、メニューから呼ばれたプログラムより

    上に来てしまい、こっまています。

    2006年4月5日 0:16
  • 私は問題なくできましたが...
    それにしても、あの例はおかしいですね。

    2006年4月5日 2:25
  • 私のプログラムの作りが悪いのだと思うのですが、

            winhdl = FindWindow(vbNullString, "Program Manager")
            i = SetParent(Me.Handle.ToInt32, winhdl)
    この例の通りやると、デスクトップの下にまでいってしまったのか分からないのですが、

    フォームが消えてしまいます。

    他の方法はありますでしょうか?

    2006年4月5日 7:25
  • vbNullString はおかしいですよね、Nothing じゃないですかね?

    Me.Handle.ToInt32 も、最初から IntPtr にすべきですし。
    繰り返しますが、あのサンプルはちょっとおかしいように思います。

    2006年4月5日 9:22
  • じゃんぬさん、いつもありがとうございます。

    VBNULLSTRINGではなくNothingにして、最初からintPtrにしているのでが、

    動きがおかしいです。画面表示された時は、

    デスクトップの上に表示されているようなのですが、

    違うフォームをshowdialogして、表示したフォームをcloseしたと同時に

    画面からきえてしまいます。デバッグ実行してる時は消えないのですが・・・

    SetParentを使用しない方法で何か良い方法はありますでしょうか?

     

    2006年4月6日 0:55
  • とりあえず、ミニマムテストからやって原因を探らないと...
    多分、Parent が勝手にすりかえられて消えちゃうんだと思いますけど。



        <System.Runtime.InteropServices.DllImport("USER32.DLL", CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
        Private Shared Function FindWindow( _
            ByVal lpClassName  As String, _
            ByVal lpWindowName As String) As System.IntPtr
        End Function

        <System.Runtime.InteropServices.DllImport("USER32.DLL", CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
        Private Shared Function SetParent( _
            ByVal hWndChild     As System.IntPtr, _
            ByVAl hWndNewParent As System.IntPtr) As System.IntPtr
        End Function

        Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim programManagerHandle As System.IntPtr = FindWindow(Nothing, "Program Manager")

            If Not programManagerHandle.Equals(System.IntPtr.Zero) Then
                SetParent(Me.Handle, programManagerHandle)
            End If
        End Sub

     

    2006年4月7日 3:32
  • じゃんぬさん、ありがとうございました。

    原因を探ってみて、解決しました。

    助かりました。いつもありがとうございます。

    2006年4月7日 4:23
  • 是非、その原因についての詳細をフィードバックしてください。
    同じ悩みを持つ、第三者が辿りついて解決できるようになります。

    このように、インターネット リソースを作っていくのが、フォーラムの役目だとも思っています。

      フィードバックができる質問者さん

    回答者でなくとも質問者はこのように、不特定多数の方に貢献できます。

    2006年4月7日 4:48
  • すみませんでした。確かにどのように解決したか書かないと、

    後で見た人に伝わりませんね。

    原因は、いろいろ試していた際に、消し忘れたロジックの

     SendToBack()を実行していた事でした。

     


     

    2006年4月7日 5:24