Desktop manager for Windows
- Multiple desktops with separate files and icons
- Icon position saving for each desktop
- Hotkeys for quick switching
- Autostart with Windows
- System tray support
Kimi combines two approaches:
| Approach | Description |
|---|---|
| Virtual Desktops | Uses Windows Virtual Desktops (Win+Tab) for desktop switching and window management |
| Separate Folders | Each desktop has its own folder with files and saved icon positions |
- Windows 10/11
- Administrator rights
| Kimi | Dexpot | |
|---|---|---|
| Technology | Native Windows API + Rust | Legacy COM hooks |
| Virtual Desktops | Uses built-in Windows 10/11 virtual desktops | Custom implementation, conflicts with Windows |
| Icon positions | Saved per desktop, restored instantly | Often loses positions, lags |
| CPU | 0% idle | 1-5% constantly |
| Memory | ~10 MB | ~50-100 MB |
| Size | 9.5 MB | ~30 MB |
| Updates | Active development | Abandoned since 2017 |
Kimi uses low-level Windows API for reliable desktop management.
Changing Desktop Path
// shell.rs — switching system Desktop folder
SHSetKnownFolderPath(
&FOLDERID_Desktop,
KF_FLAG_DONT_UNEXPAND.0 as u32,
HANDLE::default(),
PCWSTR::from_raw(wide_path.as_ptr()),
)Virtual Desktop Switching
// api.rs — using winvd crate for Windows Virtual Desktops
pub fn switch_to_desktop(index: usize) -> Result<(), String> {
winvd::go_to_desktop(index).map_err(|e| format!("{:?}", e))
}
pub fn move_window(hwnd: isize, desktop: usize) -> Result<(), String> {
winvd::move_window_to_desktop(hwnd as u32, desktop)
.map_err(|e| format!("{:?}", e))
}Refreshing Explorer
// shell.rs — sending F5 to desktop ListView
unsafe fn send_f5(hwnd: HWND) {
PostMessageW(hwnd, WM_KEYDOWN, WPARAM(VK_F5), LPARAM(0));
std::thread::sleep(std::time::Duration::from_millis(50));
PostMessageW(hwnd, WM_KEYUP, WPARAM(VK_F5), LPARAM(0));
}Icon Position Storage
// storage.rs — saving positions to hidden file
pub fn save_icon_positions(desktop_path: &Path, layout: &DesktopIconsLayout) {
let coords_file = desktop_path.join("coords.kimi");
let content = serde_json::to_string_pretty(layout)?;
fs::write(&coords_file, content)?;
hide_file(&coords_file); // FILE_ATTRIBUTE_HIDDEN
}git clone https://github.com/Masonik2080/kimi.git
cd kimi
npm install
npm run tauri buildCC0 1.0 — Public Domain


