あなたは常に異なるアプリケーションのウィンドウの上部に表示されるあなたアプリケーションでウィンドウをしたい場合は、BringWindowToTop
機能は間違いなくありますあなたが望むものではありません。初心者の方には気づいたように、タイマーを使用して関数を繰り返し呼び出す必要があります。それが間違ったAPIだというあなたの最初の手掛かりになるはずです。もう1つの問題は、ウィンドウをプロセスのZ順番の先頭に移動するだけで、システム上で実行されている他のすべてのプロセスは移動しないということです。 documentationが説明するように、この関数を呼び出す
は、Zの順にウィンドウの位置を変更しSetWindowPos
関数を呼び出すことに似ています。 BringWindowToTop
は、ウィンドウをトップレベルウィンドウにしません。
最後の文は、より良い方法があることを示すはずです。 Windowsには、トップレベルのウィンドウ(つまり、常に他のウィンドウの上に表示されるウィンドウ)のサポートが組み込まれています。これらは、の最上部のというウィンドウです。これはまさにあなたが望むものです。一番上のウィンドウは、常に上端以外のウィンドウの上に表示されます。
レイモンド・チェンは混乱の一部を説明しようとしていますon his blog。この場合、HWND_TOP
はBringWindowToTop
に相当します。代わりに、HWND_TOPMOST
が必要です。
ウィンドウを一番上にする最も簡単な方法は、ウィンドウを作成するときにWS_EX_TOPMOST
フラグを指定することです。 .NET Frameworkはほとんどのウィンドウ作成作業を隠していますが、フォームクラスのCreateParams
propertyをオーバーライドして必要なときにパラメータをカスタマイズできます。
はここで、フォームを作るためにいくつかのサンプルコードです常に最上位:
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
あなたは実行時にウィンドウの一番上の状態を切り替えたい場合、これは動作しません。これを行うには、SetWindowPos
関数をP/Invokeする必要があります。 P/InvokeはVB2でDeclare
ステートメントで行った操作と似ていますが、.NETの世界ではセマンティクスが少し変更されています。そのため、VB.NETで古いVB6 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
いただきましたエラー、あなたは私達にあなたがAPIを呼び出すために使用して.NETコードを表示することができますか? –
この宣言文はvb6にのみ適しています。 vb.net –