簡體   English   中英

桌面上的全屏覆蓋

[英]Fullscreen overlay over desktop

我正在嘗試在整個屏幕上創建一個全屏覆蓋,這將改變整個屏幕的顏色/飽和度等,並添加一些文本和效果。 基本上我想“替換”整個屏幕,而用戶仍然可以與Windows正常交互。

解決方案1

然而問題是,如果我只是在整個屏幕上創建一個TopMost窗口,用戶將無法與該窗口下方的任何內容進行交互。

解決方案2

簡單地在桌面緩沖區上繪圖也不能解決問題。 移動窗口時會產生令人討厭的效果,也會導致嚴重的運動模糊效果。 這永遠不會好看。

解決方案3

在 C# 中無法掛鈎“桌面繪制事件”,因為我必須將 DLL 注入到 explorer.exe 中。 這根本不是一個很好的解決方案,並且不適用於 C#。 此外,防病毒程序可能會將其檢測為有害的東西。


我看到的最接近的是this ,但用戶將無法“點擊”覆蓋層。 在示例中,覆蓋層大部分是完全透明的。 使用透明度鍵以外的顏色會導致解決方案 1的問題。

問題:如何有效地覆蓋整個屏幕?

未經測試

聽起來你的問題是點擊。 為了傳遞您的鼠標消息,您是否考慮過攔截頂部窗口上的鼠標單擊(假設這已設置為透明窗口),然后隱藏您的窗口,使用 user32 import SendMessage 觸發相同的鼠標消息,然后再次顯示您的窗口? 如果您不想隱藏您的窗口,您可以直接調用 SendMessage 到各種其他窗口句柄。

以下鏈接顯示了如何循環瀏覽應用程序桌面上的窗口:

http://support.microsoft.com/kb/183009

如果您已經使表單透明,我認為您也可以覆蓋 CreateParams。 這樣做可能會允許鼠標事件通過。

// This may be even simpler
protected override CreateParams CreateParams
{
    get
    {
        CreateParams createParams = base.CreateParams;
        createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT

        return createParams;
    }
}

您可以在較新的 Windows 窗體中使窗體本身透明,例如:

public void MakeSeeThru()
{
   frmTransparentForm.Opacity = 0.83;
}

以上僅適用於表單。 要在子控件上執行此操作需要更多的工作。 首先,您必須將樣式設置為支持透明背景色。

public TransparentControl()
{
    SetStyle(ControlStyles.SupportsTransparentBackColor, true);
    this.BackColor = Color.Transparent.
}

如果控件是透明的,這不會阻止您覆蓋 OnPaintBackground 和 OnPaint 方法並根據需要進行自定義繪圖。 它只是使用默認值作為透明背景繪制。

我以前做過這個,如果它四處移動就會有點模糊。 但是,如果整個事物是覆蓋桌面的巨大透明形式,則應該沒有運動模糊。

如果存在性能問題並且您想自定義繪制桌面,則可以抓取如下屏幕截圖:

ScreenCapture sc = new ScreenCapture();
// capture entire screen, and save it to a file
Image img = sc.CaptureScreen();

不過,您需要先隱藏表單,否則可能會導致閃爍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM