在那遙遠的MSDN上,有那麼一隻被隱藏的函數,它掌管着Windows內核威力不容小覷~git
本教程僅做爲學習研究,禁止其餘用途!github
富強、民主、文明、和諧, 自由、平等、公正、法治, 愛國、敬業、誠信、友善函數
首先咱們須要準備4只dll:須要引用using System.Runtime.InteropServices;學習
1 [DllImport("ntdll.dll")] 2 private static extern uint NtSuspendProcess([In] IntPtr processHandle);//凍結術 3 4 [DllImport("ntdll.dll")] 5 private static extern uint NtResumeProcess([In] IntPtr processHandle);//解凍術 6 7 [DllImport("kernel32.dll", SetLastError = true)] 8 private static extern IntPtr OpenProcess( 9 uint desiredAccess, 10 bool inheritHandle, 11 int processId);//打開線程並獲取Handle 12 13 [DllImport("kernel32.dll", SetLastError = true)] 14 [return: MarshalAs(UnmanagedType.Bool)] 15 private static extern bool CloseHandle([In] IntPtr handle);//釋放以前的OpenProcess
接下來咱們把它封裝起來ui
1 public static void SuspendProcess(int processId) 2 { 3 IntPtr hProc = IntPtr.Zero; 4 hProc = OpenProcess(0x800, false, processId); 5 if (hProc != IntPtr.Zero) { 6 NtSuspendProcess(hProc); 7 CloseHandle(hProc); 8 } 9 } 10 11 public static void ResumeProcess(int processId) 12 { 13 IntPtr hProc = IntPtr.Zero; 14 hProc = OpenProcess(0x800, false, processId); 15 if (hProc != IntPtr.Zero){ 16 NtResumeProcess(hProc); 17 CloseHandle(hProc); 18 } 19 }
以C#WinForm爲例,將這段代碼放在Form的Loaded或Button_Click事件裏編碼
var data = Process.GetProcesses();//獲取全部進程 foreach (var p in data) { try { if (p.ProcessName != "Freeze") //注意不要把本身凍結了!!此處「Freeze」能夠換成你的進程名,通常就是項目名稱 ProcessMgr.SuspendProcess(p.Id);//[滑稽]凍結大法 } catch { } }
由於程序也會凍結VS,而VS關聯這程序,因此凍結vs本身也動不了了spa
但若是你想在vs裏調試能夠在上方加入if判斷線程
前方高能調試
好了,我要關電腦了。。。code
感興趣的小夥伴能夠本身下載來玩一玩:https://github.com/TwilightLemon/Freeze