2011-12-17 68 views
2

我有一個窗口應該保持在Powerpoint幻燈片上。所以它應該在所有窗口之上。我使用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。使用pinvoke.net找到正確的vb.net –

回答

12

如果你想在應用程序的窗口總是出現在不同應用程序的窗口的頂部,則BringWindowToTop功能絕對是不是你想要的。對於初學者,正如你所注意到的,你必須使用計時器反覆調用函數。這應該是你的第一個線索,它是錯誤的API。另一個問題是,它只會將窗口置於Z命令的頂部,而不是系統上運行的所有其他進程。作爲documentation解釋,

調用此功能類似於調用SetWindowPos功能改變的Z順序窗口的位置。 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 

,如果你想在運行時切換窗口的最頂部的狀態。這是行不通的。要做到這一點,你將不得不P /調用SetWindowPos函數。 P/Invoke類似於你在VB6中用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

哇,科迪灰!精湛的解釋和很好的例子。像魅力一樣工作,最重要的是我明白它的工作原理。非常感謝你。 – manjulapra

+0

@fedmich [Your edit](http://stackoverflow.com/review/suggested-edits/1997464)在我可以檢查之前被其他人拒絕。原來你是對的,我編輯了我的答案。我錯過了一些括號,因爲'SetWindowPos'不接受字符串參數,所以'CharSet'屬性是不必要的。儘管只是爲了將來的參考,但很難爲其他人的代碼接受更改。你不能指望審稿人知道這門語言是否足夠了解你是否正確。你應該留下評論。如果他們同意你的觀點,大多數用戶會自行更正。 –

+0

如果他們沒有這方面的知識,版主不應該審覈編輯。 – Mayhem