在 Windows Vista 和 Windows 7 中以编程方式将桌面图标调整为小列表






4.56/5 (8投票s)
在 Vista 和 Windows 7 中体验小型紧凑的桌面图标视图。
引言
本文介绍了一个简单的技巧,可以自动调整 Vista 和 Windows 7 中较大的桌面图标的大小,并将其显示为列表。
背景
有时我们需要将桌面图标调整为更小的尺寸,以获得更简洁或更舒适的外观。 在 Windows Vista 和 Windows 7 中,有一种方法可以做到这一点 - 通过单击桌面区域上的任意位置将桌面设置为焦点,然后按住 Control 键并向上或向下滚动鼠标滚轮。 您将看到图标会随着您的滚动而调整大小。 但是,此方法需要用户干预,另一个问题是,它只是调整它们的大小,但不会将它们合并在一起以节省更多桌面空间。
解决方案
桌面区域实际上是一个 ListView 控件,因此主要的技巧是获取该控件的窗口句柄,然后发送适当的窗口消息来应用更改。
第一步:搜索 ListView 控件的句柄
使用 EnumWindows
和 FindWindowEx
API
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
HWND hChild = FindWindowEx( hwnd, NULL, _T("SHELLDLL_DefView"), NULL );
if( hChild )
{
HWND hDesk = FindWindowEx( hChild, NULL, _T("SysListView32"), NULL );
if( hDesk )
{
*(reinterpret_cast<HWND*>(lParam)) = hDesk;
return FALSE;
}
}
return TRUE;
}
HWND hWnd = NULL;
EnumWindows( EnumWindowsProc, (LPARAM)&hWnd );
if( hWnd )
{
return SetDeskIcon( hWnd, size );
}
上面的代码将首先使用 EnumWindows
API 枚举屏幕上的所有顶级窗口。 对于每个窗口,它将获取句柄并将其传递给指定的回调。 在回调下,我们使用句柄来搜索子窗口或控件。
使用 FindWindowEx
API,我们通过窗口名称或类名称搜索我们要查找的窗口。 但是在搜索之前,我们需要知道要搜索的名称。
Visual Studio 附带安装了一个名为 Spy++ 的工具,它能够显示当前运行的所有窗口的信息。 使用其“搜索窗口”功能,我们可以通过将其 Finder 工具拖到窗口或控件上,然后按 OK 轻松访问我们想要的窗口或控件的属性。 完成后,您将看到 ListView 控件位于一个类名为 SHELLDLL_DefView
的子窗口下,ListView 控件的类名将为 SysListView32
。
第二步:执行调整大小
如上所述,调整桌面图标大小的一种方法是使用 Control 键和鼠标滚轮的组合。 我们可以通过向列表视图发送窗口消息来自动模拟此操作。 通过使用我们从搜索中检索到的窗口句柄,我们发送以下消息
调整图标大小以使其更小。 我们反复调用此操作,直到获得所需的大小
SendMessage( hWnd, WM_MOUSEWHEEL, MAKEWPARAM(MK_CONTROL, -WHEEL_DELTA), MAKELPARAM(0, 0) );
调整图标大小以使其更大。 我们反复调用此操作,直到获得所需的大小
SendMessage( hWnd, WM_MOUSEWHEEL, MAKEWPARAM(MK_CONTROL, WHEEL_DELTA), MAKELPARAM(0, 0) );
第三步:将显示样式设置为小图标视图
通过应用此样式,图标将合并在一起并显示为列表。 通过此步骤,我们将获得更多的桌面空间。 同样,通过使用相同的句柄
STYLESTRUCT Styles;
Styles.styleOld = GetWindowLong( hWnd, GWL_STYLE );
Styles.styleNew = Styles.styleOld & (~LVS_TYPEMASK);
Styles.styleOld = Styles.styleNew;
if ( size == DeskIconSmall )
{
Styles.styleNew |= LVS_SMALLICON;
Styles.styleOld |= LVS_ICON;
}
else
{
Styles.styleNew |= LVS_ICON;
Styles.styleOld |= LVS_SMALLICON;
}
// Set the new style
SetWindowLong( hWnd, GWL_STYLE, Styles.styleNew );
SendMessage( hWnd, WM_STYLECHANGED, GWL_STYLE, (LONG)(&Styles) );
SendMessage( hWnd, WM_KILLFOCUS, 0, 0 );
// Refresh control
UpdateWindow( hWnd );
ShowWindow( hWnd, SW_HIDE );
ShowWindow( hWnd, SW_SHOWNORMAL );
就这样! 请查看提供的示例源代码。 该示例是一个控制台应用程序,它接受以下参数:/SMALL - 将图标大小设置为最小并显示为列表,或 /BIG - 将它们恢复为正常大小。
基本上,上面的代码也适用于 Windows XP。 但是,我们不再需要执行步骤 2,因为它仅适用于 Vista 和 Windows 7。
您可能还想尝试我创建的示例应用程序(作为 DeskIconSetup.zip 附件),该应用程序具有相同的功能。 还有一个安装程序,它提供了一个选项,可以在启动时自动缩小桌面图标。 此外,它还将创建“开始”菜单快捷方式,以便您能够将它们恢复为正常大小或反之亦然。