簡體   English   中英

C#如何使隱藏的窗口保持重繪並准備快速顯示?

[英]C# How to make hidden window keep repainting and be ready to fast show?

我有一扇窗戶,大部分時間都被藏起來了。 用戶有時會通過全局熱鍵顯示它,並且他希望它很快變得可見。 但是窗口有許多控件,每個隱藏->可見過渡都會調用整個窗口重繪。 在速度較慢的CPU上,這是非常明顯的。 我想使該窗口即使在隱藏狀態下也總是被繪制。 然后,我認為將需要很短的時間來展示它。

更新

我不確定你看到了什么。 我看到的和令人討厭的是,當ClipAngel的表單顯示在與隱藏的表單不同的位置時(根據您的定位邏輯),我可以在舊位置看到表單的“閃爍”。 在AFAIU中,這是由應用程序本身完成的,但由DWM(桌面窗口管理器)完成的,根據Raymond Chen的說法,您可以使用DwmSetWindowAttributeDWMWA_TRANSITIONS_FORCEDISABLED為您的表單禁用它

    private const int DWMWA_TRANSITIONS_FORCEDISABLED = 3;
    private const int S_OK = 0;

    [DllImport("dwmapi", PreserveSig = true)]
    static extern int DwmSetWindowAttribute(IntPtr hWnd, int attr, ref int value, int attrLen);

    private void ShowForPaste()
    {
        if (Environment.OSVersion.Version.Major >= 6)
        {
            int boolForceDisable = 1;
            int hresult = DwmSetWindowAttribute(this.Handle, DWMWA_TRANSITIONS_FORCEDISABLED, ref boolForceDisable, Marshal.SizeOf(boolForceDisable));

            if (S_OK != hresult)
            {
                // log somewhere?
            }
        }
        ...

還要注意,當我在配置了16位顏色的計算機上嘗試這種hack時,由於某種原因它沒有幫助,並且DwmIsCompositionEnabled始終返回false。


舊答案

為什么會有許多“隱藏->可見過渡”? 另外,我認為雙緩沖可能會對您有所幫助,請參見Winforms雙緩沖

我提出了一些復雜的棘手解決方案。 簡而言之,解決方案是將窗口移到屏幕外(TOP = -10000),而不是關閉並最小化並在激活時將其移回。 它的工作速度非常快。 負面影響是,必須始終在任務欄中顯示/隱藏窗口,否則窗口將在每個任務欄圖標“隱藏”->“顯示的更改”上重新繪制。 您可以在方法Main.WndProc,Main_Closing,Main_Activated,Main_Deactivate,ShowForPaste,RestoreWindowIfMinimized的Main形式http://sourceforge.net/p/clip-angel/code的源代碼中找到它。

暫無
暫無

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

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