首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

呼叫 rundll32.exe 執行系統功能 — 鎖定工作站、控制台項目、對話框完整指令表

     編輯:關於.NET

前言

許多開發者需要在程式中「鎖定電腦」、「開啟控制台項目」、「顯示系統對話框」,第一反應常是 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 <資料夾名稱>:開啟特殊資料夾 (字型、印表機…)

C# 封裝類別 — 直接可用

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,,2Windows 元件
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,,3CD 音樂
特殊資料夾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");

注意事項與限制

  1. 64 位元系統:rundll32.exe 位於 C:\Windows\System32 (64-bit) 與 C:\Windows\SysWOW64 (32-bit)。Process.Start 會自動導向正確版本。
  2. UAC 提權:部分指令 (如裝置管理員、系統屬性) 需管理員權限。啟動參數加上 psi.Verb = "runas" 可觸發 UAC 提示。
  3. 非標準 EntryPoint:部分舊文獻使用 user.exe、shell32.dll,Control_RunDLL 非公開進入點,Windows 版本間可能差異,建議測試後再部署。
  4. 替代方案:.NET Core / .NET 5+ 可直接 P/Invoke user32.dll LockWorkStation(),無需建立進程,效能更好。

P/Invoke 直呼版 (無進程開銷)


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());
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved