在那遥远的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