許多開發者需要在程式中「鎖定電腦」、「開啟控制台項目」、「顯示系統對話框」,第一反應常是 SendKeys.Send("^(L)") 模擬 Win+L,但這不可靠 (需焦點、可能被攔截、UAC 干擾)。正解是直接呼叫 rundll32.exe 執行 user32.dll、shell32.dll 等系統 DLL 匯出函式。本文提供完整、可直接複製使用的指令對照表與 C# 封裝類別。
rundll32.exe , [參數]
user32.dll, LockWorkStation:鎖定工作站 (等同 Win+L)shell32.dll, Control_RunDLL <.cpl檔> [,頁籤索引]:開啟控制台項目shell32.dll, SHHelpShortcuts_RunDLL <資料夾名稱>:開啟特殊資料夾 (字型、印表機…)using System;
using System.Diagnostics;
using System.ComponentModel;
public static class SystemCommands
{
/// 鎖定工作站 (Win+L 效果)
public static void LockWorkStation()
{
Run("user32.dll", "LockWorkStation");
}
/// 開啟控制台項目
/// .cpl 檔名 (不含路徑),如 "desk.cpl"
/// 頁籤索引 (0-based),-1 表示預設
public static void OpenControlPanel(string cplFile, int tabIndex = -1)
{
string args = tabIndex >= 0 ? $"{cplFile},,{tabIndex}" : cplFile;
Run("shell32.dll", "Control_RunDLL", args);
}
/// 開啟特殊資料夾
public static void OpenSpecialFolder(string folderName)
{
Run("shell32.dll", "SHHelpShortcuts_RunDLL", folderName);
}
/// 執行 rundll32 指令
private static void Run(string dll, string entryPoint, string args = "")
{
var psi = new ProcessStartInfo
{
FileName = "rundll32.exe",
Arguments = $"{dll},{entryPoint} {args}".Trim(),
UseShellExecute = false,
CreateNoWindow = true,
WorkingDirectory = Environment.SystemDirectory
};
Process.Start(psi);
}
// --- 常用快捷方法 ---
public static void ShowDisplayProperties(int tab = 0) => OpenControlPanel("desk.cpl", tab); // 0=背景 1=螢幕保護 2=外觀 3=設定
public static void ShowMouseProperties(int tab = 0) => OpenControlPanel("main.cpl", tab);
public static void ShowKeyboardProperties(int tab = 0) => OpenControlPanel("main.cpl", tab == 0 ? 1 : tab); // main.cpl @1 = 鍵盤
public static void ShowDateTimeProperties(int tab = 0) => OpenControlPanel("timedate.cpl", tab);
public static void ShowNetworkConnections() => Run("shell32.dll", "Control_RunDLL", "ncpa.cpl");
public static void ShowAddHardwareWizard() => Run("shell32.dll", "Control_RunDLL", "sysdm.cpl @1");
public static void ShowFontsFolder() => OpenSpecialFolder("FontsFolder");
public static void ShowPrintersFolder() => OpenSpecialFolder("PrintersFolder");
public static void ShowFormatDriveDialog() => Run("shell32.dll", "SHFormatDrive");
public static void ShowAddPrinterWizard() => Run("shell32.dll", "SHHelpShortcuts_RunDLL", "AddPrinter");
public static void ShowCreateShortcutDialog(string path) => Run("shell32.dll", "SHHelpShortcuts_RunDLL", $"CreateShortcut \"{path}\"");
}
| 功能分類 | 指令 | 說明 |
|---|---|---|
| 系統電源 | rundll32.exe user32.dll,LockWorkStation | 鎖定工作站 (Win+L) |
| rundll32.exe user32.dll,ExitWindowsEx | 登出/關機/重啟 (需參數) | |
| rundll32.exe powrprof.dll,SetSuspendState | 睡眠/休眠 | |
| 顯示/桌面 | rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0 | 桌面背景 |
| rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,1 | 螢幕保護程式 | |
| rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,2 | 外觀/視窗色彩 | |
| rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,3 | 顯示設定/解析度 | |
| rundll32.exe desk.cpl,InstallScreenSaver "檔案.scr" | 安裝螢幕保護程式 | |
| 滑鼠/鍵盤 | rundll32.exe shell32.dll,Control_RunDLL main.cpl @0 | 滑鼠屬性 |
| rundll32.exe shell32.dll,Control_RunDLL main.cpl @1 | 鍵盤屬性 (速度) | |
| rundll32.exe shell32.dll,Control_RunDLL main.cpl @1,,1 | 鍵盤屬性 (語言/輸入法) | |
| rundll32.exe shell32.dll,Control_RunDLL access.cpl,,1..5 | 輔助功能選項 (1=鍵盤 2=聲音 3=顯示 4=滑鼠 5=一般) | |
| 日期/時間/區域 | rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,0 | 日期與時間 |
| rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,1 | 時區 | |
| rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,0..4 | 區域選項 (0=一般 1=數字 2=貨幣 3=時間 4=日期) | |
| 網路/連線 | rundll32.exe shell32.dll,Control_RunDLL ncpa.cpl | 網路連線 |
| rundll32.exe shell32.dll,Control_RunDLL netcpl.cpl | 網際網路選項 | |
| rundll32.exe rnaui.dll,RnaDial "連線名稱" | 撥號連線對話框 | |
| 系統/裝置 | rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,0 | 系統屬性 (一般) |
| rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,1 | 裝置管理員 | |
| rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,3 | 效能/虛擬記憶體 | |
| 新增/移除程式 | rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,1 | 安裝/解除安裝 |
| rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,2 | Windows 元件 | |
| rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,3 | 開機磁碟 | |
| 多媒體/聲音 | rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,0 | 音訊 |
| rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl @1 | 聲音/音效配置 | |
| rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,3 | CD 音樂 | |
| 特殊資料夾 | rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL FontsFolder | 字型資料夾 |
| rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL PrintersFolder | 印表機資料夾 | |
| rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL AddPrinter | 新增印表機精靈 | |
| 其他常用 | rundll32.exe shell32.dll,Control_RunDLL password.cpl | 密碼/使用者帳號 |
| rundll32.exe shell32.dll,Control_RunDLL powercfg.cpl | 電源選項 | |
| rundll32.exe shell32.dll,Control_RunDLL telephon.cpl | 電話/撥號選項 | |
| 檔案操作 | rundll32.exe shell32.dll,OpenAs_RunDLL "檔案完整路徑" | 「開啟方式」對話框 |
| rundll32.exe shell32.dll,SHFormatDrive | 格式化磁碟對話框 | |
| 主題/桌面 | rundll32.exe shell32.dll,Control_RunDLL themes.cpl | 桌面主題 |
| rundll32.exe mshtml.dll,PrintHTML "檔案.htm" | 列印 HTML 檔案 |
// 開啟「滑鼠」屬性 → 「指標」頁籤 (索引 1)
SystemCommands.OpenControlPanel("main.cpl", 1);
// 開啟「鍵盤」屬性 → 「硬體」頁籤 (main.cpl @1 為鍵盤,再加頁籤)
Run("shell32.dll", "Control_RunDLL", "main.cpl @1,,2");
rundll32.exe 位於 C:\Windows\System32 (64-bit) 與 C:\Windows\SysWOW64 (32-bit)。Process.Start 會自動導向正確版本。psi.Verb = "runas" 可觸發 UAC 提示。user.exe、shell32.dll,Control_RunDLL 非公開進入點,Windows 版本間可能差異,建議測試後再部署。user32.dll LockWorkStation(),無需建立進程,效能更好。
using System.Runtime.InteropServices;
public static class NativeMethods
{
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool LockWorkStation();
// 使用範例
public static void LockNow()
{
if (!LockWorkStation())
throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());
}
}