在那遥远的MSDN上,有那么一只被隐藏的函数,它掌管着Windows内核威力不容小觑~
本教程仅作为学习研究,禁止其他用途!
富强、*、文明、和谐, *、平等、公正、法治, 爱国、敬业、诚信、友善
一、准备工作
首先我们需要准备4只dll:需要引用using System.Runtime.InteropServices;
[DllImport("ntdll.dll")]
private static extern uint NtSuspendProcess([In] IntPtr processHandle);//冻结术 [DllImport("ntdll.dll")]
private static extern uint NtResumeProcess([In] IntPtr processHandle);//解冻术 [DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr OpenProcess(
uint desiredAccess,
bool inheritHandle,
int processId);//打开线程并获取Handle [DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool CloseHandle([In] IntPtr handle);//释放之前的OpenProcess
接下来我们把它封装起来
public static void SuspendProcess(int processId)
{
IntPtr hProc = IntPtr.Zero;
hProc = OpenProcess(0x800, false, processId);
if (hProc != IntPtr.Zero) {
NtSuspendProcess(hProc);
CloseHandle(hProc);
}
} public static void ResumeProcess(int processId)
{
IntPtr hProc = IntPtr.Zero;
hProc = OpenProcess(0x800, false, processId);
if (hProc != IntPtr.Zero){
NtResumeProcess(hProc);
CloseHandle(hProc);
}
}
二、编码工作
以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 { } }
三、运行调试
千万不能在VisualStudio里调试
千万不能在VisualStudio里调试
千万不能在VisualStudio里调试
因为程序也会冻结VS,而VS关联这程序,所以冻结vs自己也动不了了
但如果你想在vs里调试可以在上方加入if判断
前方高能
好了,我要关电脑了。。。
感兴趣的小伙伴可以自己下载来玩一玩:https://github.com/TwilightLemon/Freeze