c# 如何屏蔽win、esc等功能健?

pfworld 2008-03-20 11:15:09
在程序全屏运行时,如果按WIN健就会弹出开始菜单!!如何在C#中遮蔽这些系统案件呢?
...全文
1212 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
cctv860323 2010-11-24
  • 打赏
  • 举报
回复
我遇到一个问题,用16楼的方法屏蔽掉Ctrl+Shift组合键后,发现应用程序不响应Keyborad.PrewKeyDown事件了,请问这是什么问题?
部分代码:
if (((int)Control.ModifierKeys == ((int)Keys.Control + (int)Keys.Shift))) //Ctrl+Shift
{
return 1;
}
a09 2009-06-08
  • 打赏
  • 举报
回复
.....


我怎么就没有屏蔽任何的dd 。。。
liyoubaidu 2009-05-28
  • 打赏
  • 举报
回复
up
chinaxiaoq 2009-05-27
  • 打赏
  • 举报
回复
你的新发现好像不管用~
liuyan598178564 2008-07-28
  • 打赏
  • 举报
回复
最新发现,呵呵。来和大家分享下:
crtl+alt+delete可以用钩子函数
if ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt+(int)Keys.Delete) //截获Ctrl+Alt+Delete
{
return 1;
}
grapism 2008-07-28
  • 打赏
  • 举报
回复
学习
liuyan598178564 2008-07-28
  • 打赏
  • 举报
回复
Ctrl+Alt+Delete 用修改 注册表来屏蔽,无法用钩子函数屏蔽.

try
{
RegistryKey r = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", true);
r.SetValue("DisableTaskMgr", "1"); //屏蔽任务管理器
}
catch
{
RegistryKey r = Registry.CurrentUser.CreateSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System");
r.SetValue("DisableTaskMgr", "0");
}
cnming 2008-03-26
  • 打赏
  • 举报
回复
mark
shinaterry 2008-03-26
  • 打赏
  • 举报
回复
^ō^ 据我所知, C#是无法屏蔽系统热键(Ctrl+Alt+Delete)..
ericzhangbo1982111 2008-03-26
  • 打赏
  • 举报
回复
这样比较详细了

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Diagnostics;

namespace WindowsApplication1
{
/// <summary>
/// Description of MainForm.
/// </summary>
public partial class Form4 : Form
{
//委托
public delegate int HookProc(int nCode, int wParam, IntPtr lParam);
static int hHook = 0;
public const int WH_KEYBOARD_LL = 13;
//LowLevel键盘截获,如果是WH_KEYBOARD=2,并不能对系统键盘截取,Acrobat Reader会在你截取之前获得键盘。
HookProc KeyBoardHookProcedure;
//键盘Hook结构函数
[StructLayout(LayoutKind.Sequential)]
public class KeyBoardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
#region DllImport
//设置钩子
[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);

#endregion
#region 自定义事件
public void Hook_Start()
{
// 安装键盘钩子
if (hHook == 0)
{
KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);

//hHook = SetWindowsHookEx(2,
// KeyBoardHookProcedure,
// GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), GetCurrentThreadId());

hHook = SetWindowsHookEx(WH_KEYBOARD_LL,
KeyBoardHookProcedure,
GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);

//如果设置钩子失败.
if (hHook == 0)
{
Hook_Clear();
//throw new Exception("设置Hook失败!");
}
}
}

//取消钩子事件
public void Hook_Clear()
{
bool retKeyboard = true;
if (hHook != 0)
{
retKeyboard = UnhookWindowsHookEx(hHook);
hHook = 0;
}
//如果去掉钩子失败.
if (!retKeyboard) throw new Exception("UnhookWindowsHookEx failed.");
}

//这里可以添加自己想要的信息处理
public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
{
if (nCode >= 0)
{
KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
if (kbh.vkCode == (int)Keys.S && (int)Control.ModifierKeys == (int)Keys.Control) // 截获F8
{
MessageBox.Show("快捷键已拦截!不能保存!");
return 1;

}
if (kbh.vkCode == (int)Keys.Y
&& (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt) //截获Ctrl+Alt+Y
{

//MessageBox.Show("不能全部保存!");
return 1;
}
if (kbh.vkCode == (int)Keys.X)
{
MessageBox.Show("不能全部保存!");
return 1;
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
#endregion

public Form4()
{

InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Hook_Start();
}

private void button2_Click(object sender, EventArgs e)
{
Hook_Clear();
}







}
}
pfworld 2008-03-25
  • 打赏
  • 举报
回复
public void KillCtrlAltDelete()
{
RegistryKey regkey;
string keyValueInt = "1";
string subKey = @"Software\Microsoft\Windows\CurrentVersion\Policies\System";

try
{
regkey = Registry.CurrentUser.CreateSubKey(subKey);
regkey.SetValue("DisableTaskMgr", keyValueInt);
regkey.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}

在国外论坛找了一个方法,不过是通过修改注册表来禁止Ctrl + Alt +Delect 组合健的!
pfworld 2008-03-25
  • 打赏
  • 举报
回复
panyee 十分感谢你提供的代码,经测试的确可以遮蔽!WIN健!

而且十分环保!不像使用注册表屏蔽方法,影响正常使用!!

不过如何可以使其屏蔽Ctrl + Alt +Delect 组合健呢?我使着屏蔽单独的Ctrl健好像不起作用!!然后遮蔽组合健值好像也不起作用!!请你指点其中解决方法!!关于钩子不是很懂!
panyee 2008-03-24
  • 打赏
  • 举报
回复
用全局键盘钩子可以做到这点。
前几年有个记录键盘事件的程序比较流行,我把它再发出来。函数做了一处改动。

UserActivityHook.cs 代码:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Reflection;

namespace WindowsApplication3
{
public class UserActivityHook
{
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);

[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);

[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
public static extern bool UnhookWindowsHookEx(int idHook);

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

// Fields
private static int hKeyboardHook;
private HookProc KeyboardHookProcedure;
public const int WH_KEYBOARD_LL = 13;

// Methods
static UserActivityHook()
{
hKeyboardHook = 0;
}

private int code = 0;

public UserActivityHook(int keyCode)
{
this.Start();
this.code = keyCode;
}

private int KeyboardHookProc(int nCode, int wParam, IntPtr lParam)
{
KeyboardHookStruct struct2 = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
KeyEventArgs args = new KeyEventArgs((Keys)struct2.vkCode);
Console.WriteLine(args.KeyValue.ToString());
if (args.KeyValue == code)//prevent which key code, $$$$$$$$
{
return 1;
}
return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
}

public void Start()
{
if (hKeyboardHook == 0)
{
this.KeyboardHookProcedure = new HookProc(this.KeyboardHookProc);
Module m = Assembly.GetExecutingAssembly().GetModules()[0];
IntPtr p = Marshal.GetHINSTANCE(m);
hKeyboardHook = SetWindowsHookEx(13, this.KeyboardHookProcedure, p, 0);
if (hKeyboardHook == 0)
{
this.Stop();
throw new Exception("SetWindowsHookEx ist failed.");
}
}
}

public void Stop()
{
bool flag = true;
if (hKeyboardHook != 0)
{
flag = UnhookWindowsHookEx(hKeyboardHook);
hKeyboardHook = 0;
}
if (!flag)
{
throw new Exception("UnhookWindowsHookEx failed.");
}
}


~UserActivityHook()
{
this.Stop();
}


[StructLayout(LayoutKind.Sequential)]
public class KeyboardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;

public KeyboardHookStruct()
{
}
}
}
}

调用:
UserActivityHook actHook = null;
this.actHook = new UserActivityHook(91);//91 ==> win键的keyCode


mine 2008-03-24
  • 打赏
  • 举报
回复
up
pfworld 2008-03-24
  • 打赏
  • 举报
回复
UP
shinaterry 2008-03-22
  • 打赏
  • 举报
回复
^ō^ 试了4L的方法, 在XP之下无效(2003未知)
  • 打赏
  • 举报
回复
如果要屏蔽Ctrl+Alt+Delete,仅依靠键盘钩子是没有用的;但你可以通过向WINLOGON.EXE进程中注入你的dll代码,在dll代码里找到SAS窗口,然后用SetWindowlong修改SAS窗口的消息处理函数为你自己的处理函数,然后在你自己的消息处理函数里捕捉wm_hotkey函数,根据WM_HOTKEY消息的参数来判断按键应该执行什么操作
如果说只是在你的程序中的某些地方要屏蔽这些键的话,还是挺简单的,在主窗体的keyPress事件中捕捉是哪个键,就可以啦
lao_bulls 2008-03-22
  • 打赏
  • 举报
回复
4楼的,能不能在我win 2003,xp中屏蔽Ctrl + Alt + Del 键 ?
pfworld 2008-03-22
  • 打赏
  • 举报
回复
如果实在没有通过程序屏蔽的方法,那么只有使用注册表方法了。

REGEDIT4

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"= hex: 00,00,00,00,00,00,00,00,03,00,00,00,00,00,5b,e0,00,00,5c,e0,00,00,00,00
pfworld 2008-03-22
  • 打赏
  • 举报
回复
XP低下如何屏蔽呢?WIN健好像不好屏蔽!
加载更多回复(5)

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧