[英]C# How to make hidden window keep repainting and be ready to fast show?
我有一扇窗戶,大部分時間都被藏起來了。 用戶有時會通過全局熱鍵顯示它,並且他希望它很快變得可見。 但是窗口有許多控件,每個隱藏->可見過渡都會調用整個窗口重繪。 在速度較慢的CPU上,這是非常明顯的。 我想使該窗口即使在隱藏狀態下也總是被繪制。 然后,我認為將需要很短的時間來展示它。
更新
我不確定你看到了什么。 我看到的和令人討厭的是,當ClipAngel的表單顯示在與隱藏的表單不同的位置時(根據您的定位邏輯),我可以在舊位置看到表單的“閃爍”。 在AFAIU中,這是由應用程序本身完成的,但由DWM(桌面窗口管理器)完成的,根據Raymond Chen的說法,您可以使用DwmSetWindowAttribute
和DWMWA_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.