C# 通过Hook的方法 屏蔽快捷键

#region 屏蔽Windows功能键(快捷键)

public delegate int HookProc(int nCode, int wParam, IntPtr lParam);

private static int hHook = 0;

public const int WH_KEYBOARD_LL = 13;

//LowLevel键盘截获,如果是WH_KEYBOARD=2,并不能对系统键盘截取,会在你截取之前获得键盘。

private static HookProc KeyBoardHookProcedure;

//键盘Hook结构函数

[StructLayout(LayoutKind.Sequential)]

public class KeyBoardHookStruct

{

public int vkCode;

public int scanCode;

public int flags;

public int time;

public int dwExtraInfo;

}

//设置钩子

[DllImport("user32.dll")]

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")]

//调用下一个钩子

public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);

[DllImport("kernel32.dll")]

public static extern int GetCurrentThreadId();

[DllImport("kernel32.dll")]

public static extern IntPtr GetModuleHandle(string name);

//如果函数执行成功,返回值不为0。

//如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。

[DllImport("user32.dll", SetLastError = true)]

public static extern bool RegisterHotKey(

IntPtr hWnd,                //要定义热键的窗口的句柄

int id,                     //定义热键ID(不能与其它ID重复)

int fsModifiers,   //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效

Keys vk                     //定义热键的内容

);

[DllImport("user32.dll", SetLastError = true)]

public static extern bool UnregisterHotKey(

IntPtr hWnd,                //要取消热键的窗口的句柄

int id                      //要取消热键的ID

);

public static void Hook_Start()

{

// 安装键盘钩子

if (hHook == 0)

{

KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);

hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure,

GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);

//如果设置钩子失败.

if (hHook == 0)

{

Hook_Clear();

}

}

}

//取消钩子事件

public static void Hook_Clear()

{

bool retKeyboard = true;

if (hHook != 0)

{

retKeyboard = UnhookWindowsHookEx(hHook);

hHook = 0;

}

//如果去掉钩子失败.

if (!retKeyboard) throw new Exception("Hook去除失败");

}

//这里可以添加自己想要的信息处理

private static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)

{

if (nCode >= 0)

{

KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));

if (kbh.vkCode == 91) // 截获左win(开始菜单键)

{

return 1;

}

if (kbh.vkCode == 92)// 截获右win(开始菜单键)

{

return 1;

}

if (kbh.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control) //截获Ctrl+Esc

{

return 1;

}

if (kbh.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Alt) //截获Alt+Esc

{

return 1;

}

if (kbh.vkCode == (int)Keys.F4 && (int)Control.ModifierKeys == (int)Keys.Alt) //截获alt+f4

{

return 1;

}

if (kbh.vkCode == (int)Keys.Tab && (int)Control.ModifierKeys == (int)Keys.Alt) //截获alt+tab

{

return 1;

}

if (kbh.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Shift) //截获Ctrl+Shift+Esc

{

return 1;

}

if (kbh.vkCode == (int)Keys.Space && (int)Control.ModifierKeys == (int)Keys.Alt) //截获alt+空格

{

return 1;

}

if (kbh.vkCode == 241) //截获F1

{

return 1;

}

if ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt + (int)Keys.Delete)      //截获Ctrl+Alt+Delete

{

return 1;

}

if ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Shift) //截获Ctrl+Shift

{

return 1;

}

if (kbh.vkCode == (int)Keys.Space && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt) //截获Ctrl+Alt+空格

{

return 1;

}

if (kbh.vkCode == (int)Keys.LWin)

{

return 1;

}

if (kbh.vkCode == (int)Keys.RWin)

{

} return 1;

}

return CallNextHookEx(hHook, nCode, wParam, lParam);

}

/// <summary>

/// 开打任务管理器快捷键为Windows底层按键

/// </summary>

/// <param name="bLock"></param>

public static void TaskMgrLocking(bool bLock)

{

if (bLock)//屏蔽任务管理器、并且不出现windows提示信息“任务管理器已被管理员禁用”

{

Process p = new Process();

p.StartInfo.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System);

p.StartInfo.FileName = "taskmgr.exe";

p.StartInfo.CreateNoWindow = true;

p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

p.Start();

}

else//设置任务管理器为可启动状态

{

Process[] p = Process.GetProcesses();

foreach (Process p1 in p)

{

try

{

if (p1.ProcessName.ToLower().Trim() == "taskmgr")//这里判断是任务管理器

{

p1.Kill();

RegistryKey r = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", true);

r.SetValue("DisableTaskmgr", "0"); //设置任务管理器为可启动状态

Registry.CurrentUser.DeleteSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System");

}

}

catch

{

return;

}

}

}

}

#endregion

//调用

private void button1_Click(object sender, EventArgs e)

{

//启动钩子,处理钩子事件

Hook_Start();

//屏蔽任务管理器

TaskMgrLocking(true);

}

/// <summary>

/// 关闭窗口时事件

/// </summary>

//private void Form1_FormClosing(object sender, FormClosingEventArgs e)

//{   //注销Id号为100的热键设定

//    UnregisterHotKey(Handle, 100);   //注销Id号为101的热键设定

//    UnregisterHotKey(Handle, 101);   //注销Id号为102的热键设定

//    UnregisterHotKey(Handle, 102);   //注销Id号为103的热键设定

//    UnregisterHotKey(Handle, 103);

//    Hook_Clear();

//    TaskMgrLocking(false);

//  }

时间: 2024-10-10 14:32:30

C# 通过Hook的方法 屏蔽快捷键的相关文章

深入分析C#键盘勾子(Hook)拦截器,屏蔽键盘活动的详解

钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的.当消息到达后,在目标窗口处理函数之前处理它.钩子机制允许应用程序截获处理window消息或特定事件. 钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统.每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权.这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的

photoshop脚本切图方法(习惯快捷键的朋友可以用,很方便)

photoshop脚本切图方法(习惯快捷键的朋友可以用,很方便) by  伍雪颖 其实脚本切图的原理是跟安装插件切图是一样的, 不过像安装DevRocket这种插件特麻烦,还经常装不成功,于是直接用脚本. #target photoshop function main(){ var doc = app.activeDocument; var psdPath = app.activeDocument.path; var outFolderName="pngExport"; var two

c# 屏蔽快捷键

前言 有时候开发会遇到这样一个需求,软件需要屏蔽用户的组合快捷键或某些按键,避免强制退出软件,防止勿操作等. 原理 1.要实现组合键,按键拦截,需要用到user32.dll中的SetWindowsHookEx. 2.要拦截ctrl+alt+del,需要使用ntdll.dll的ZwSuspendProcess函数挂起winlogon程序,退出之后使用ZwResumeProcess恢复winlogon程序. 3.软件需要开启topMost,以及全屏,否则离开软件则拦截无效. 4.如果要实现热键监听(

Android插件化开发之Hook StartActivity方法

第一步.先爆项目demo照片,代码不多,不要怕 第二步.应该知道Java反射相关知识 如果不知道或者忘记的小伙伴请猛搓这里,Android插件化开发基础之Java反射机制研究 http://blog.csdn.net/u011068702/article/details/49863931 第三步.应该知道Java静态代理知识 如果不知道或者忘记的小伙伴请猛搓这里,Android插件化开发基础之静态代理模式 http://blog.csdn.net/u011068702/article/detai

mindmanager使用方法和快捷键

MindManager的基础使用方法 选中主题(Central Topic),按Enter键(或者在空白处双击鼠标)插入主题: 选取中主题,按Inter键插入子主题: 选取中主题,点附注主题按钮或按Ctrl+Shift+Enter插入附注主题: 在空白处单击鼠标,插入浮动主题,然后直接输入文字: 用光标或鼠标选择主题,直接编辑主题: 选中主题,用鼠标拖动主题到适当位置: 根据需要,从右键或主题菜单使用图标和图像: 选中主题,右键单击格式化主题或格式菜单,设置文本.形状.背景.连接线等: 插入关联

Eclipse的各种查找,类的查找,方法查找快捷键

eclipse开发中,查找会是一个经常用到的功能所以总结一下1,查找一个类 Shift + Ctrl + h 这种方式能快速的定位接口,类还有注解在那个包里面2.综合查找 Ctrl + H 这是一种综合查找 ,可以用来查找 一个方法的引用,或者某些特殊的标识,还可以通过注释里面的关键字查到想要的内容3,CTRL + F 这种查找是单页面的 查找某些特定的字符 查找到字符然后 替换4.跳转到方法的引用处 ctrl + shift +G 和ctrl+alt + h选中方法名按组合键 原文地址:htt

frida Hook 重载方法

用overload("int") import frida, sys jscode = """ Java.perform(function () { var utils = Java.use('com.xiaojianbang.app.Utils'); utils.getCalc.implementation = function (a, b) { console.log("Hook Start..."); send(arguments

IDEA中方法的快捷键及自定义方法

1. 字母组合联想到对应的方法 ·ps联想到public static方法和成员 ·输入psvm联想到主方法 ·输入psf联想到用public static final 等 · pc联想到clone和hashcode(ph也可以) ·pe联想到equals方法 ·输入sou联想到 2.字母组合联想固定结构 ·输入for生成for循环 ·输入fori生成for i 循环 ·fore生成增强for循环 ·数字.for生成 for 100循环 100.fori 100.forr 3.自定义模板 依次点

Java怎样对一个属性设置set或get方法的快捷键

具体步骤如下: 首页,在testApp.java 类中定义属性,例如:public Sting name; 其次,Alt+Shift+S,  选择Generate Getters and Setter...这一项,然后如图 就能得到 public String getName() { return name; } public void setName(String name) { this.name = name; } 下面是使用demo public class testApp { publ