当我运行Form程序的时候,我想禁用该热键
(1)能不能用MessageFilter或winPrc 截获该热键值并处理?
(2)如果不能,用键盘钩子该怎么实现?
 (3) 有没有其它的方法?

解决方案 »

  1.   

    http://www.cnblogs.com/chami/archive/2008/10/30/1322926.html
      

  2.   

    protected override bool ProcessKeyEventArgs(ref Message m)
    {
    return base.ProcessKeyEventArgs (ref m);
    }
      

  3.   

    只能用Hook了,但在C#里使用好Hoot的方法是使用VC++写一个非托管的DLL,在DLL中使用API来调用Hook。然后在C#里再调用这个DLL中的方法。
      

  4.   

    三楼的你的很有创意,可是好象这样不能判断按下的是Ctrl+ Alt+ Delete键值吧!
      

  5.   

    http://hi.baidu.com/jj2zz/blog/item/698ed8cae17e3440f31fe75d.html 
    参考下这个
      

  6.   

    你这个是任务管理器吧!引用hideSysKey(true)还是可是使用这个热键!另外,我发现 ProcessKeyEventArgs中是不会响应Delete这样的热键值的,看来只用用钩子了!
      

  7.   

    我用钩子可以屏蔽其它的热键,可就是屏蔽不了这个Ctrl+Alt+Delete热键,忘高手指点.
      

  8.   

    现在已经知道的是: 
    (1)用键盘钩子是不能屏蔽Ctrl+Alt+Delete热键的.
    (2)用KeyEventArgs是检测不了Delete这样的热键的.
    期待高手指点!
      

  9.   

    http://www.programfan.com/club/showpost.asp?id=26415&t=o
      

  10.   

    呵呵.楼上的还弄个gina啊.楼主只是想禁用一下而已.没必要动那么大的手术~~~~
      

  11.   

    Dill在那里? 方法在什么地方?
      

  12.   

    我发现 ProcessKeyEventArgs中是不会响应Delete这样的热键值的,看来只用用钩子了! 
     
    我同意这个说法!!
      

  13.   


      Const   SPI_SCREENSAVERRUNNING   =   97   
      Private   Declare   Function   SystemParametersInfo   Lib   "user32"   Alias   _   
      "SystemParametersInfoA"   (ByVal   uAction   As   Long,   ByVal   uParam   As   Long,   _   
      lpvParam   As   Any,   ByVal   fuWinIni   As   Long)   As   Long   
      使用:   
      '禁止   
      Dim   pOld   As   Boolean   
      Call   SystemParametersInfo(SPI_SCREENSAVERRUNNING,   True,   pOld,   0)   
      '开启   
      Dim   pOld   As   Boolean   
      Call   SystemParametersInfo(SPI_SCREENSAVERRUNNING,   False,   pOld,   0)我看人家VB是这么实现的,不知道能不能转换成C#
      

  14.   

    我发消息给你了.来取DLL吧.哈~~
      

  15.   

    你给的那个VB的代码是不能实现的.至少在XP系统上是无效的.
      

  16.   


    谢谢你提供的资料,但是你的Dll有两个问题,代码如下:.
    (1)设置为False的时候,不能解除屏蔽;
    (2)点击两次就会报出异常,说Dll里面的托管代码正在运行,需要结束程序才能再次运行!
    public partial class Form1 : Form
        {  
            public Form1()
            {
                InitializeComponent();
            }
            [DllImport("Kernel32")]
            public static extern int GetProcAddress(int handle, String funcname);
            [DllImport("Kernel32")]
            public static extern int LoadLibrary(String funcname);
            [DllImport("Kernel32")]
            public static extern int FreeLibrary(int handle);        public delegate bool FuckSysKey(bool enAble);        private static Delegate GetAddress(int dllModule, string functionname, Type t)
            {
                int addr = GetProcAddress(dllModule, functionname);
                if (addr == 0)
                    return null;
                else
                    return Marshal.GetDelegateForFunctionPointer(new IntPtr(addr), t);
            }
            private void button1_Click(object sender, EventArgs e)
            {
                int huser32 = 0;
                huser32 = LoadLibrary("native.dll");
                FuckSysKey mykey = (FuckSysKey)GetAddress(huser32, "FuckSysKey", typeof(FuckSysKey));
                mykey(false);
                FreeLibrary(huser32);
            }
            private void button2_Click(object sender, EventArgs e)
            {
                int huser32 = 0;
                huser32 = LoadLibrary("native.dll");
                FuckSysKey mykey = (FuckSysKey)GetAddress(huser32, "FuckSysKey", typeof(FuckSysKey));
                mykey(true);
                FreeLibrary(huser32);
            }
        }
      

  17.   

    最简单的方法是用二进制打开taskmgr.exe不关闭,不共享访问。最理想的方法要自己写个dll注入到winlogon.exe。方法比较麻烦。
      

  18.   

    晕,是我想的太多了,直接静态调用就可以解决问题了,谢谢(ttzyanswer)提供的Dll,结贴!        public Form1()
            {
                InitializeComponent();
            }
            [DllImport(@"native.dll", EntryPoint = "FuckSysKey")]
            private extern static bool FuckSysKey(bool enAble);        private void button1_Click(object sender, EventArgs e)
            {
                FuckSysKey(false);
            }
            private void button2_Click(object sender, EventArgs e)
            {
                FuckSysKey(true);
            }
      

  19.   

    呵呵.我刚想回帖跟你说这个问题呢.想不到你已经发现了.呵呵.我写那些话是要告诉别人不用C#的调用方式的.你既然都上C#了前两步就可以直接pass过去了.呵呵.
      

  20.   

    dll我传上了 ,大家要自觉用于正当的途径呀,下载地址:
    http://download.csdn.net/source/1311907
      

  21.   

    果然~win7下无效~浪费俺10个下载分
      

  22.   

    谢谢楼主,谢谢ttzyanswer同志~~~
      

  23.   

    可以说下为什么windows 7 下无效吗?
      

  24.   

    怎么没人说话了哦,为什么Windows7 无效呀。
      

  25.   

    我知道了,Windows7 压根就没有ScreenSaver了。
      

  26.   

    不是只是禁止打开资源管理器么,那代码Ctrl+Alt+Delete还是有生效。。还是达到不了锁住键盘的目的。