none
WS_EX_LAYERED导致一部分 win10 系统卡顿 RRS feed

  • 问题

  • 采用 C# Winform开发。 窗体加了WS_EX_LAYERED 样式,通过UpdateLayeredWindow呈现。窗体上加几个控件。如果对这几个控件做多次尺寸调整或者位移,比如用这个API做鼠标拖拽控件移动的操作。             

    NativeMethods.ReleaseCapture();
                NativeMethods.SendMessage(handle, WindowMessages.WM_SYSCOMMAND, WindowMessages.SC_MOVE + WindowMessages.HTCAPTION, 0);

    做这些操作之后,在部分win10中就会出现整个系统卡顿,界面显示缓慢的情况。比如桌面右键菜单要过好几秒才能显示。几乎所有程序界面都显示卡顿,切换程序窗口的过程中还会出现界面透明镂空,过一会才会显示完整界面。右下角托盘弹窗里的图标会无法显示,只能显示毛玻璃或者一个小框框。卡顿的时候CPU,内存这些资源占用不高,还是正常的量。

    把我的程序退出了依旧不能恢复。必须注销系统,或者结束dwm.exe的进程,或者禁用核心显卡再启用才能恢复。

    假如在卡顿的时候,有程序在不停的桌面截图或者桌面录制的时候就不会卡顿。比如写代码不断调用 Graphics.CopyFromScreen或者 打开QQ远程桌面。在这不断桌面截图过程中是不会卡顿的,一旦关闭或者停止截图就会卡。 如果是TeamViewer的远程桌面还是会卡,好像TeamViewer不是用桌面截图实现的。

    这个卡顿问题只有一部分win10才会,更新显卡驱动也没用。和win10版本好像也没关系,之前我的win10版本比他们的更旧都不会出现这个问题,更新系统比他们的更新也没出现卡顿情况。不知道是不是某个驱动或者什么系统设置的关系。

    假如我对窗体中的所有子控件也加上WS_EX_LAYERED 样式(win8之后是支持子控件加WS_EX_LAYERED的)就不会出现系统卡顿的情况了,但是会出现另外一个问题,如果子控件比较多,有几十上百个以上,这个时候窗体移动会变的非常缓慢,越多越慢。鼠标拖动窗体,鼠标松开了,窗体还在慢慢移动,就像有很大的延迟一样。

    2019年4月30日 4:20

全部回复


  • Hi 小红帽'_', 

    >>把我的程序退出了依旧不能恢复。必须注销系统,或者结束dwm.exe的进程,或者禁用核心显卡再启用才能恢复

    >>这个卡顿问题只有一部分win10才会,更新显卡驱动也没用。和win10版本好像也没关系,之前我的win10版本比他们的更旧都不会出现这个问题,更新系统比他们的更新也没出现卡顿情况。不知道是不是某个驱动或者什么系统设置的关系。

    不是很清楚这个具体的原因是什么,也许可能有些程序需要使用dwm.exe的时候,没有获得相应的权限,导致卡顿。 感觉跟代码相关小,感觉跟系统或者驱动或者一些程序有关。 

    我建议尝试重装系统试试。

    Best Regards

    Yong Lu

    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年5月1日 3:10
    版主