2011-12-17 17 views
2

私はパワーポイントのスライドショーの上に留まるべきウィンドウを持っています。それはすべての窓の上にあるはずです。私はこれをLib "user32"を使ってVB 6を使って簡単にしましたが、VB.netとは異なると思われます。すべてのウィンドウの上に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 

これもエラーです! ご迷惑をおかけして申し訳ございません。事前に おかげで、

よろしく

マンジューラ

+1

いただきましたエラー、あなたは私達にあなたがAPIを呼び出すために使用して.NETコードを表示することができますか? –

+1

この宣言文はvb6にのみ適しています。 vb.net –

答えて

12

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

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

最後の文は、より良い方法があることを示すはずです。 Windowsには、トップレベルのウィンドウ(つまり、常に他のウィンドウの上に表示されるウィンドウ)のサポートが組み込まれています。これらは、の最上部のというウィンドウです。これはまさにあなたが望むものです。一番上のウィンドウは、常に上端以外のウィンドウの上に表示されます。

レイモンド・チェンは混乱の一部を説明しようとしていますon his blog。この場合、HWND_TOPBringWindowToTopに相当します。代わりに、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 
+0

の正しいものを見つけるためにpinvoke.netを使用してください、うわー、コディグレイ!優れた説明と素敵な例。魅力のように働いて、最も重要なことは、私はそれがどのように機能するのか理解した。どうもありがとうございました。 – manjulapra

+0

@fedmich [あなたの編集](http://stackoverflow.com/review/suggested-edits/1997464)は、私がそれを見直す前に他の人によって拒否されました。あなたが正しいとわたしは答えを編集しました。 'SetWindowPos'は文字列引数を受け付けないので、' CharSet'属性は不要です。しかし、将来の参照のために、他の人のコードに変更を受け入れることは非常に難しいです。あなたは、査読者があなたが正しいかどうかを知るために十分に言語を知ることを期待できません。あなたはただコメントを残す必要があります。彼らがあなたに同意するならば、ほとんどのユーザーはそれを修正します。 –

+0

司会者は知識がない場合は編集を審査すべきではありません。 – Mayhem

関連する問題