刚接触这样的问题不知道有什么好方法解决!
比如计算机机房管理的时候  要刷卡才能上机,刷卡后要利用用户登陆才能使用计算机,这样就要屏蔽一些热键,如 ctrl+alt+del 要不然可以饶过这样的阻碍。
  由于刚接触,不知道怎么弄。一开始我是在c#.net里 我利用在form里根据 按键 的事件下判断按键的 ascii是多少,再决定做什么事情。但是好象有什么 勾子函数 hook 不知道怎么使用。找的资料也不合自己的意愿。
请高手赐教!提供一些资料例题,代码。

解决方案 »

  1.   

    可以替换gina,或者hook sas,这个用c#好像没见过,我可以用delphi,bcb或vc实现
      

  2.   

    using System;
    using System.Runtime.InteropServices;
    using System.IO;
    using System.Reflection;
    using System.Windows.Forms;
    namespace HookTest
    {
    /// <summary>
    /// Hook 的摘要说明。
    /// </summary>
    public class Hook
    {
    public Hook()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    }
    // 安装钩子
    public const int WH_KEYBOARD = 13;
    public const int WH_MOUSE_LL = 14; [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);   // 取得当前线程编号 [DllImport("kernel32.dll")]
    static extern int GetCurrentThreadId();  //定义委托
    public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
      static int hKeyboardHook = 0; 
    HookProc KeyboardHookProcedure; //处理
    private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam) { KeyMSG m = (KeyMSG) Marshal.PtrToStructure(lParam, typeof(KeyMSG));
    if ((int) m.vkCode == 91) { //textbox1.Text = “A”
    //MessageBox.Show(wParam.ToString(),"dd");
    return 1; }

    return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam); 
    }
    // 安装钩子
    public void HookStart() { if(hKeyboardHook == 0) { // 创建HookProc实例 KeyboardHookProcedure = new HookProc(KeyboardHookProc); // 设置线程钩子 //hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardHookProcedure, IntPtr.Zero,  // GetCurrentThreadId());
    hKeyboardHook = SetWindowsHookEx( WH_KEYBOARD,KeyboardHookProcedure,   Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0); // 如果设置钩子失败 if(hKeyboardHook == 0 )     { HookStop(); throw new Exception("SetWindowsHookEx failedeeeeeeee."); } } } // 卸载钩子 public void HookStop() { bool retKeyboard = true; if(hKeyboardHook != 0) { retKeyboard = UnhookWindowsHookEx(hKeyboardHook); hKeyboardHook = 0; }  if (!(retKeyboard)) 
    {
    throw new Exception("UnhookWindowsHookEx  failedsssss.");

    }
    }
    public struct KeyMSG { public int vkCode;   public int scanCode;  public int flags;   public int time;  public int dwExtraInfo;  }
    }
    }
      

  3.   

    if ((int) m.vkCode == 91)上面的这个例子是拦截 win键 的钩子,使之无效,这个是全局钩子
    你可以改一下改成你需要的使用的时候 
    直接调用 HookStart()即可
      

  4.   

    键盘钩子抓不到ctrl+alt+del的
    对于你的需求,我想用微软的智能卡SDK就可以了
      

  5.   

    Ctrl + Alt + Del应该是任何应用程序不能截获、拦截、屏蔽的。
      

  6.   

    回复人: Ivony() ( ) 信誉:100  2005-08-19 10:17:00  得分: 0  
     
     
       Ctrl + Alt + Del应该是任何应用程序不能截获、拦截、屏蔽的。
      
     
      

  7.   

    不是抓不到,只是要注入代码到系统进程才可以。但是根据他的要求,用智能卡SDK比较合适。
      

  8.   

    是的
    这个代码是Borland C++Builder 6.0 Patch4下编写的,用是线程注入
    如果搂住需要的话
    留个邮箱
    我发给你
    我用C#调用了,并成功了
      

  9.   

    [email protected]
    那就麻烦你了
    我现在遇了一些麻烦 
    总解决不好
      

  10.   

    在2000或XP下原则上说是不可能阻止ctrl+alt+del的,但是可以换一种思路,就像现在很
      

  11.   

    不好意思,刚才出问题了,没打完在2000或XP下原则上说是不可能阻止ctrl+alt+del的,但是可以换一种思路,就像现在很多网吧管理软件一样,在后台扫描全局窗口,如果一但发现TaskManager(也就是任务管理器)的窗口出现,就将其强制关闭,这样同样可以做到不让用户去结束其它的进程