2014-05-14 55 views
1

我試圖創建始終位於頂部的透明,可點擊的表單,並且純粹用於繪製不會丟失焦點的信息,因此它是總是顯示在最上面。這個想法是能夠在我的屏幕上繪製信息,該信息將始終位於每個其他窗口的頂部,很可能只是簡單的文本,但並不妨礙我在仍然可見的情況下與其餘的程序進行交互。始終保持最佳狀態的可點擊的表單

我遇到的麻煩是讓表單始終處於頂端,儘管其他程序都是關注焦點。我嘗試過使用TopMost屬性,但這似乎不起作用,並且已經開始讓窗口重新聚焦於不重點,但看起來有點草率,並且無論如何都不起作用。我在Windows 8.1上,如果它重要。

任何回覆非常感謝,謝謝。

+0

您是否期待它位於其他程序的頂部?始終處於最佳狀態,還是隻處於未設置爲最佳狀態的程序之上?前者你無法真正做到,後者當然。 – Servy

+0

最好在每個程序之上,但是在未設置爲始終處於最前的程序之上可能也會起作用。 – user3599771

+0

當你說設置「TopMost」不起作用時,它以什麼方式不起作用,因爲那應該完全符合你的需求? – Servy

回答

-1

您必須使用擴展窗口樣式,此代碼顯示如何執行此操作。

該表單將鼠標交互傳遞給它後面的表單,並且即使其他Top Top窗口處於活動狀態,也會顯示爲TopMost。

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    const int GWL_EXSTYLE = -20; 
    const int WS_EX_TRANSPARENT = 0x20; 

    [DllImport("user32.dll", CharSet=CharSet.Auto)] 
    extern static int GetWindowLong(IntPtr hWnd, int nIndex); 

    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    extern static int SetWindowLong(IntPtr hWnd, int nIndex, int nStyle); 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     var style = GetWindowLong(this.Handle, GWL_EXSTYLE); 
     var newStyle = style | WS_EX_TRANSPARENT; 

     SetWindowLong(this.Handle, GWL_EXSTYLE, newStyle); 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     this.BringToFront(); 
    } 
} 

這將是一個小技巧,爲用戶與表單交互,必須提供更多的細節你正在試圖做什麼,所以我們可以提供幫助。

爲了始終顯示您的窗口在上面,放置一個間隔爲100ms的計時器,並將表單屬性TopMost設置爲true。

+0

[正如Raymond Chen所描述](http://blogs.msdn.com/b/oldnewthing/archive/2011/03/10/10138969.aspx),這既不能確保窗口始終處於頂層,從一開始就嘗試這樣做也不是富有成效的。這是其中唯一一次勝出的動作不能玩的遊戲之一。 – Servy

+0

只要玩這個代碼。 ** WS_EX_TRANSPARENT **使窗口的鼠標事件進入窗口後面的窗口(按要求點擊可通過)。它確實有效,請創建一個表單併爲自己嘗試,如果它不起作用,我會刪除答案。 – LawfulHacker

+0

這個問題表明,OP已經*已經*能夠使他的形式透明。他的形式是最重要的形式,他有問題。這就是問題所在。 – Servy

相關問題