全脑瘫IT时代(五)

Windows 7 有一个臭名卓著的bug。什么?你不知道?只要搜“windows7 explorer double click scroll”,排在结果第一的就是。

OK, let's show it.

运行资源管理器,展开一些文件夹,让左边的树列表滚动条充满,找一个子文件夹比较多的文件夹,就比如c:\windows,双击windows,很大概率滚动条跑到上面去了,你双击的文件夹被放在了屏幕最下面。

我们双击一个文件夹展开它基本上是因为我们想看到它的子文件夹,如今却被滚动到看不到的位置,每次双击都要手工去调整滚动条的位置。

这是一个几乎每天都会遇到,甚至可以说是如影随形的bug,但是却一直没有被修正(注意只有windows7才有这个问题)。

Update,现在有一个解决办法,使用开源的 Classic Shell:

CodeProject

SourceForge

问题的原因:

Explorer 向 TreeView 发送了两次 TVM_ENSUREVISIBLE,第一次发送给顶层Item,第二次发送给选中的Item。发送给顶层是没有什么意义的,这导致了bug,但是不知道微软这样做的意义。

解决的办法可以参考 Classic Shell 的源代码,ExplorerBHO.cpp line 39:

    if (uMsg==TVM_ENSUREVISIBLE && (dwRefData&1))
    {
        // HACK! there is a bug in Win7 Explorer and when the selected folder is expanded for the first time it sends TVM_ENSUREVISIBLE for
        // the root tree item. This causes the navigation pane to scroll up. To work around the bug we ignore TVM_ENSUREVISIBLE if it tries
        // to show the root item and it is not selected
        HTREEITEM hItem=(HTREEITEM)lParam;
        if (!TreeView_GetParent(hWnd,hItem) && !(TreeView_GetItemState(hWnd,hItem,TVIS_SELECTED)&TVIS_SELECTED))
            return 0;
    }

原文地址:https://www.cnblogs.com/skogkatt/p/4163376.html