2

パワー ポイントのスライド ショーの上に表示されるウィンドウがあります。したがって、すべてのウィンドウの上にある必要があります。Lib "user32"を使用してVB 6を使用してこれを簡単に実行しましたが、VB.netでは難しいようです。

Me.TopMost = True

これはプログラム内でのみ機能するため、機能していないようです。

  Private Declare Function BringWindowToTop Lib "user32" Alias "BringWindowToTop" (ByVal hwnd As Long) As Long
    Private Sub frmTmr_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
        BringWindowToTop(Me.Handle)
    End Sub

これもエラーになります!どんな助けでも大歓迎です!前もって感謝します、

よろしく

マンジュラ

4

1 に答える 1

12

アプリケーションのウィンドウを常にのアプリケーションのウィンドウの上に表示したい場合、その機能は間違いなくあなたが望むものではありません. まず、お気づきのように、タイマーを使用して関数を繰り返し呼び出す必要があります。それが間違った API であるという最初の手がかりになるはずです。別の問題は、システムで実行されている他のすべてのプロセスではなく、そのプロセスの Z オーダーの先頭にウィンドウを移動するだけであることです。ドキュメントで説明されているように、BringWindowToTop

SetWindowPosこの関数を呼び出すことは、Z オーダーでウィンドウの位置を変更する関数を呼び出すことに似ています。BringWindowToTopウィンドウをトップレベル ウィンドウにしません。

その最後の文は、より良い方法があることを示しているはずです。Windows には、最上位ウィンドウ (つまり、常に他のウィンドウの上に表示されるウィンドウ) のサポートが組み込まれています。これらは最上位ウィンドウと呼ばれます。これはまさにあなたが望むものです。最上位のウィンドウは常に最上位以外のウィンドウの上に表示されます。

Raymond Chen は、彼のブログで混乱の一部を説明しようとしています。この場合、HWND_TOPは と同等であることに注意してくださいBringWindowToTop。代わりに、必要ですHWND_TOPMOST

ウィンドウを最前面にする最も簡単な方法は、ウィンドウWS_EX_TOPMOSTを作成するときにフラグを指定することです。.NET Framework は、ほとんどのウィンドウ作成作業を舞台裏で隠しますが、フォーム クラスのCreateParamsプロパティをオーバーライドすることで、必要に応じてパラメーターをカスタマイズできます。

フォームを常に一番上に表示するサンプル コードを次に示します。

Protected Overrides ReadOnly Property CreateParams() As CreateParams
    Get
        Const WS_EX_TOPMOST As Integer = &H00000008

        Dim cp As CreateParams = MyBase.CreateParams
        cp.ExStyle = cp.ExStyle Or WS_EX_TOPMOST
        Return cp
    End Get
End Property

実行時にウィンドウの最上位の状態を切り替えたい場合、これは機能しません。そのためには、関数を P/Invoke する必要がありSetWindowPosます。P/Invoke は、ステートメントを使用して VB6 で行っていたものと似ていますが、.NET の世界ではセマンティクスがわずかに変更されています。そのため、古い VB6ステートメントを VB.NET でDeclare使用することはできません。Declare

VB.NET のコードは次のようになります。

<DllImport("user32.dll", SetLastError:=True)> _
Private Shared Function SetWindowPos(ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As Integer) As Boolean
End Function

Private Const SWP_NOSIZE As Integer = &H1
Private Const SWP_NOMOVE As Integer = &H2

Private Shared ReadOnly HWND_TOPMOST As New IntPtr(-1)
Private Shared ReadOnly HWND_NOTOPMOST As New IntPtr(-2)

Public Function MakeTopMost()
    SetWindowPos(Me.Handle(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Function

Public Function MakeNormal()
    SetWindowPos(Me.Handle(), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Function
于 2011-12-17T10:39:53.087 に答える