//截取消息,进行处理
protected override void WndProc(ref Message m)
{
switch(m.Msg)
{
case 17:
MessageBox.Show("哈哈,你不能关闭计算机!")
m.Result=(IntPtr)0
break
case 513:
MessageBox.Show("哈哈,你不能点击左键!")
m.Result=(IntPtr)0
break
case 516:
MessageBox.Show("哈哈,你不能点击右键!")
m.Result=(IntPtr)0
break
default:
base.WndProc(ref m)
break
}
}
以上方法是截获系统关机时发送给各个进程的关机消息,如果这种方法没用的话,可以用windows系统钩子来进行消息获取,一旦设置了系统钩子,它将先于任何消息捕捉机制而第一个捕捉到消息,用到系统钩子必须从系统DLL导入以下方法。
//装置钩子的函数
[DllImport("user32.dll ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId)
//卸下钩子的函数
[DllImport("user32.dll ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook)
//下一个钩挂的函数
[DllImport("user32.dll ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam)
具体的用法,可以去网上搜索,网上有很多的。英文叫windows hook。
在x64环境下,分为x86进程和x64进程,所以要写两个模块。临时想到几个方法:
1.遍历进程,远程线程注入模块,模块负责HOOK。
2.全局钩子(SetWindowsHookEx)注入,再HOOK,但不能注入没有窗口的进程。
3.记得WinLogon相关的注册表好像可以自动注入,不知道和谐了没。
4.通过方法1注入现有的进程,再找csrss注入,因为每一个新进程创建的时候都要通知它,具体Hook点记不清了,好像很麻烦。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)