★卢培培★ ── 欢迎光临卢培培(goodname008)的BLOG

人生真正的快乐,多在贫家茅舍,少在富室红楼。

卢培培ID:goodname008
78053次访问,排名1208好友0人,关注者0
[加为好友] [即时聊天] [发私信]
goodname008的文章
原创 22 篇
翻译 0 篇
转载 5 篇
评论 286 篇
卢培培的公告


只有干不成事的人
没有干不成的事


代码下载说明:请将代码下载地址的链接复制到浏览器的地址栏,按下回车即可正常下载。

最近评论
jingang123gz:在C# 中怎么屏蔽WIN键啊?????
kennylyj:我在做类似的东西的时候遇到一个问题:
由于需要将一些16位的DOS程序的输出导出,因此使用了管道,但直接CreateProcess这些程序是不行的,必须通过ComSpec这个环境变量得到命令行程序的路径并把要运行的DOS程序的路径及相关参数作为命令行程序的参数才行,或者是先运行cmd/command,然后通过标准写端口写入要启动的程序的参数
而这样做却导致系统的虚拟机程序……
mycaibo:原来可以下载呀,我还自己写了一遍,不过说KBDLLHOOKSTRUCT没有定义,也不知道是为什么,谢谢哈
jarcyju:大哥下载不了呀,麻烦发一份给我,谢谢啦
zhuyc0808@gmail.com
wuzhongyi:我认为以上的方案不好,看样子你也是做开发的。先不考虑硬盘本身的分区特点及如何得到更快的访问速度,

现在如果c:\为系统盘,而也是你常用的。那样XP安装完以后要多大?2G左右吧,那么虚拟的内存又会占用1G多,你再装点软件什么的。VS2005+msdn即使你不装在C盘,照样撑死你。
文章分类
收藏
    相册
    其它图片
    文章用图
    A.我的软件
    1.注册表大师 v2.0
    2.窗口间谍
    3.图易贴 v1.1
    B.强烈推荐
    1.VB打造超酷个性化菜单[一]
    2.VB打造超酷个性化菜单[二]
    3.VB打造超酷个性化菜单[三]
    4.剖析VC++函数调用约定
    C.有脚印的地方
    CSDN--中国软件网
    微软中国社区
    微软中文新闻组
    D.开放源代码
    1.鼠标感应器
    2.VB自绘菜单类
    3.你想要钱吗?
    E.友情链接
    1. 凝尘
    2. 羽毛羽毛
    3. 泗水寻芳
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 利用底层键盘钩子屏蔽任意按键收藏

    新一篇: MFC 4.21 类库结构图 | 旧一篇: VC无负担实现XP风格界面

         很多人都知道,如果想在系统范围内屏蔽键盘上的任意按键需要使用全局键盘钩子,然而像win键这样“倔强”的按键又不是普通的键盘钩子就能搞定的。这里我提供一种利用底层键盘钩子屏蔽任意按键(包括win键)的方法,并且作成了.dll动态链接库,方便以后使用。钩子,是一种相对复杂一点的技术,通常用来监视系统中某一类型的事件,这些事件可以与某一线程相关(线程钩子),也可以是系统中的所有线程(全局钩子)。关于钩子的理论,我不想说太多,也无法说太多,因为那不是三言两语就能说清楚的。

         本文的重点在于底层键盘钩子的应用,前些天CSDNVB版有人问如何实现屏蔽win键,说实话,这东西用VB也是可以做到的,只不过全局钩子的钩子函数必须写在标准dll中,而VB只能通过变通的方法做出标准dll,稍微有点麻烦,所以我索性用VC写了一个dll,这样VCVBDelphi等等都可以调用,而且我也留出了足够的接口,稍后就会看到。

         有一点必须得声明一下,底层键盘钩子有一个半致命的缺点,就是只能在NT及其以上系统中使用,不过好在现在用2000XP2003的人绝对不在少数,将来用LongHorn的人估计也少不了,所以这点倒是不用太担心。  :)

         好了,闲话少说,源代码在此:

     

         DLL头文件(在VC中使用这个DLL中的函数时,需要包含这个头文件,就像使用API要包含windows.h一样):

     

    /********************************************************************/

    /* 文件名: MaskKey.h                                                */

    /*                                                                  */

    /* 功能: 标准 DLL 导出函数头文件, 在使用该DLL的程序中包含此文件     */

    /*                                                                  */

    /* 作者: 卢培培 (goodname008)             时间: 2004.8.21           */

    /*                                                                  */

    /* BLOG: http://blog.csdn.net/goodname008                           */

    /********************************************************************/

     

    DECLSPEC_IMPORT

    BOOL

    WINAPI

    StartMaskKey(

         LPDWORD lpdwVirtualKey,

         int nLength,

         BOOL bDisableKeyboard = FALSE

         );

     

    DECLSPEC_IMPORT

    BOOL

    WINAPI

    StopMaskKey();

     

         DLL主文件:

     

    /********************************************************************/

    /* 文件名: MaskKey.cpp                                              */

    /*                                                                  */

    /* 功能: 标准 DLL ---- 利用底层键盘钩子实现屏蔽键盘任意按键         */

    /*                                                                  */

    /* 作者: 卢培培 (goodname008)             时间: 2004.8.21           */

    /*                                                                  */

    /* BLOG: http://blog.csdn.net/goodname008                           */

    /********************************************************************/

     

    // 导出函数列表

    // StartMaskKey

    // StopMaskKey

     

    #define _WIN32_WINNT  0x0500                   // 设置系统版本, 确保可以使用底层键盘钩子

     

    #include "windows.h"

     

    // 全局变量

    LPDWORD       g_lpdwVirtualKey = NULL;         // Keycode 数组的指针

    int           g_nLength = 0;                   // Keycode 数组的大小

    BOOL          g_bDisableKeyboard = FALSE;      // 是否屏蔽整个键盘

    HINSTANCE     g_hInstance = NULL;              // 模块实例句柄

    HHOOK         g_hHook = NULL;                  // 钩子句柄

     

    // DLL 入口函数

    BOOL APIENTRY DllMain(HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)

    {

         // 保存模块实例句柄

         g_hInstance = (HINSTANCE)hModule;

        

         // 在进程结束或线程结束时卸载钩子

         switch (ul_reason_for_call)

         {

         case DLL_PROCESS_ATTACH:

             break;

         case DLL_THREAD_ATTACH:

             break;

         case DLL_PROCESS_DETACH:

         case DLL_THREAD_DETACH:

             delete g_lpdwVirtualKey;

             if (g_hHook != NULL) UnhookWindowsHookEx(g_hHook);

             break;

         }

        return TRUE;

    }

     

    // 底层键盘钩子函数

    LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)

    {

         // 禁用键盘的某个按键, 如果 g_bDisableKeyboard TRUE 则禁用整个键盘

         if (nCode == HC_ACTION)

         {

             if (g_bDisableKeyboard) return TRUE;

             KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam;

             LPDWORD tmpVirtualKey = g_lpdwVirtualKey;

             for (int i = 0; i < g_nLength; i++)

             {

                  if (pStruct->vkCode == *tmpVirtualKey++)

                       return TRUE;

             }

            

         }

        

         // 传给系统中的下一个钩子

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

    }

     

    /********************************************************************/

    /* 开始屏蔽键盘按键                                                 */

    /*                                                                  */

    /* 参数:                                                            */

    /*            lpdwVirtualKey         Keycode 数组的指针             */

    /*            nLength                Keycode 数组的大小             */

    /*            bDisableKeyboard       是否屏蔽整个键盘               */

    /*                                                                  */

    /* 返回值:    TRUE 成功, FALSE 失败                                 */

    /********************************************************************/

    BOOL WINAPI StartMaskKey(LPDWORD lpdwVirtualKey, int nLength, BOOL bDisableKeyboard = FALSE)

    {

         // 如果已经安装键盘钩子则返回 FALSE

         if (g_hHook != NULL) return FALSE;

        

         // 将用户传来的 keycode 数组保存在全局变量中

         g_lpdwVirtualKey = (LPDWORD)malloc(sizeof(DWORD) * nLength);

         LPDWORD tmpVirtualKey = g_lpdwVirtualKey;

         for (int i = 0; i < nLength; i++)

         {

             *tmpVirtualKey++ = *lpdwVirtualKey++;

         }

         g_nLength = nLength;

         g_bDisableKeyboard = bDisableKeyboard;

        

         // 安装底层键盘钩子

         g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, g_hInstance, NULL);

         if (g_hHook == NULL) return FALSE;

         return TRUE;

        

    }

     

    /********************************************************************/

    /* 停止屏蔽键盘按键                                                 */

    /*                                                                  */

    /* 参数: ()                                                       */

    /*                                                                  */

    /* 返回值:    TRUE 成功, FALSE 失败                                 */

    /********************************************************************/

    BOOL WINAPI StopMaskKey()

    {

         // 卸载钩子

         if (UnhookWindowsHookEx(g_hHook) == 0) return FALSE;

         g_hHook = NULL;

         return TRUE;

    }

     

         DEF文件(MaskKey.def):

     

    EXPORTS

    StartMaskKey       @1

    StopMaskKey        @2

     

         上面就是DLL工程中主要的三个文件,工程类型为Win32 Dynamic-Link Library。从DEF文件可以看出,DLL共有两个导出函数:StartMaskKeyStopMaskKey

    StartMaskKey有三个参数,lpdwVirtualKey是一个指向DWORD数组的指针,该DWORD数组用来存放virtual-key codenLength是该数组的大小,bDisableKeyboard是个逻辑值,如果为TRUE表示禁用整个键盘,默认为FALSE。使用正确的参数调用StartMaskKeyDLL可以将DWORD数组中每一个virtual-key code与键盘上对应的按键屏蔽掉,按这些键将完全没有反应(包括win键)。事实上,对于virtual-key code只要一个字节就可以表示了,但KBDLLHOOKSTRUCT结构中的vkCodeDWORD型,所以为求统一我也采用4个字节(DWORD)。纵然如此,微软还是在MSDN中强调了,virtual-key code的值必须是1254之间的值,这点一定要注意。

    StopMaskKey没有参数,表示停止屏蔽键盘按键。如果在程序中没有调用StopMaskKey停止屏蔽键盘按键,在进程或线程退出时将自动停止屏蔽,恢复原来的状态。当然进程和线程一定要正常退出,如果是被别的程序以TerminateProcessTerminateThread等微软不太建议使用的野蛮手段结束进程或线程的话,就不太好办了。  :(

         下面是在VC中调用的例子:(两个Dialog的成员函数,对应两个按钮)

     

    void CMaskKeyAppDlg::OnStartmaskkey()

    {

         // 屏蔽 A, B, C, , , , 右及两个win

         DWORD dwVK[] = {'A', 'B', 'C', VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN, VK_LWIN, VK_RWIN};

         int nLength = sizeof(dwVK) / sizeof(DWORD);

         StartMaskKey(dwVK, nLength);    

        

    }

     

    void CMaskKeyAppDlg::OnStopmaskkey()

    {

         StopMaskKey();

        

    }

     

         下面是在VB中调用的例子:(在窗体上添加2CommandButton,并分别改名为cmdStartMaskcmdStopMask

     

    Option Explicit

    Private Declare Function StartMaskKey Lib "MaskKey" (lpdwVirtualKey As Long, ByVal nLength As Long, Optional ByVal bDisableKeyboard As Boolean = False) As Long

    Private Declare Function StopMaskKey Lib "MaskKey" () As Long

     

    Private Sub cmdStartMask_Click()

        ' 屏蔽 A, B, C, , , , 右及两个win

        Dim key(8) As Long

        key(0) = vbKeyA

        key(1) = vbKeyB

        key(2) = vbKeyC

        key(3) = vbKeyLeft

        key(4) = vbKeyRight

        key(5) = vbKeyUp

        key(6) = vbKeyDown

        key(7) = &H5B               ' 左边的win

        key(8) = &H5C               ' 右边的win

    StartMaskKey key(0), UBound(key) + 1

    End Sub

     

    Private Sub cmdStopMask_Click()

        StopMaskKey

    End Sub

     

         对于VB,如果是在VBIDE环境中按F5启动程序,则必须调用StopMaskKey才能使键盘恢复状态,如果没有调用,则在退出VBIDE环境时由DLL恢复键盘状态。对于编译后独立执行的VB程序,则和VC编译后的程序一样,无论是否调用StopMaskKey,都将在程序退出时由DLL自动卸载钩子,恢复键盘状态。

         其实,钩子并不是什么很深奥的技术,我写这个DLL的目的,也是为了我们在以后用到的时候,可以实行“拿来主义”。

         DLL源代码及VCVB调用例程的下载地址:http://csdngoodname008.51.net/MaskKey.zip

     

    *-------------------------------------------*

    *  转载请通知作者并注明出处,CSDN欢迎您!   *

    *  作者:卢培培(goodname008              *

    *  邮箱:goodname008@163.com                *

    *  专栏:http://blog.csdn.net/goodname008   *

    *-------------------------------------------*

    发表于 @ 2004年08月21日 14:44:00|评论(loading...)|编辑

    新一篇: MFC 4.21 类库结构图 | 旧一篇: VC无负担实现XP风格界面

    评论

    #JJ 发表于2004-08-22 12:51:00  IP: 211.156.187.*
    不错哦!!!
    #无忌孤飞 发表于2004-08-21 22:12:00  IP: 219.129.114.*
    已经用上了,正是我要的...感谢了哦!
    #biku 发表于2004-08-25 01:33:00  IP: 219.128.184.*
    能不能介绍一下在WIN9X下如何实现上面所要实现的功能呢?
    #大力 发表于2004-09-20 20:59:00  IP: 218.108.25.*
    没有free,有内存泄漏问题的存在!
    #小何 发表于2004-09-26 20:53:00  IP: 210.72.135.*
    卢大哥,你好!
    首先感谢您的指点,我收获很大!谢谢!
    我想向您提个问题:
    对键盘上的功能键不能拦截,比如键盘上的power键,有点会有.我的键盘上刚好有一个,我一按就关机了,这是不是由于这几个功能键和其它键盘上的键不一样呀!
    再次表示感谢
    祝您生活愉快!
    小何
    Lizm770@nenu.edu.cn
    #goodname008(文章作者) 发表于2004-10-02 16:23:00  IP: 61.51.129.*
    我的键盘上没有 power 键,不太好测试。
    这个问题我还真没考虑过,不过关键问题是得到它的virtual key code。
    相应的.h文件中可能没有相关值的定义,不过没关系,源代码我已经给了,可以在钩子函数中用MessageBox把key code打出来看一下,如果能打出来,说明能拦截到该键。


    to 大力:
    这确实是我的疏忽,大家加上就可以了。 :)
    #lizm770@nenu.edu.cn 发表于2004-10-05 22:01:00  IP: 61.138.177.*
    在 windows 2000 server 中不好用,请指教!急切
    #Karys Yuan 发表于2004-10-08 12:26:00  IP: 211.158.80.*
    卢大哥,你好!
    首先感谢您的指点,我收获很大!谢谢!
    我想向您请教一个问题: 我在VB中使用,屏蔽WIN,Tab,Menu和Alt等功能键,运行几分钟以后,系统自动解锁,我不知为何?
    我的系统是Win XP,在注册表中又没有LowLeverlHooksTimeout这一项,请指教,急切!
    #XIAOYUER 发表于2004-10-15 16:44:00  IP: 61.141.239.*
    卢大哥你好啊
    我今天才看到这么好的东东,
    我是重新做的,它总是说:
    error C2065: 'StartMaskKey' : undeclared identifier
    : error C2065: 'StopMaskKey' : undeclared identifier
    可是我运行了一天了都不对呀,
    我在.H中添加了 DECLSPEC_IMPORT
    BOOL WINAPI StartMaskKey(
    LPDWORD lpdwVirtualKey,
    int nLength,
    BOOL bDisableKeyboard = FALSE
    );

    DECLSPEC_IMPORT BOOL WINAPI StopMaskKey();
    这不对呀,
    我是用MFC-对话框做的一个键盘测试界面,想用这信方法来屏蔽WIN,SLEEP的响应,
    其目的是想当我们按下键盘上的WIN键时,对应的程序界面上相应按钮也按下,只是这样,但是不想让电脑真的就打开开始菜单,
    同样的按下SLEEP键,POURE键时,不想让电脑就真的SLEEP,重起了,
    麻烦你指点一下,谢谢了.
    谢谢了,


    #biku 发表于2004-10-16 22:21:00  IP: 218.16.247.*
    你好,我用VB在NT系统以上都能实现你说的功能,就是在WIN98下,我不知道该如何实现,你有没有一些思路来参考一下。谢谢!
    #鼻血 发表于2004-10-29 03:14:00  IP: 202.101.71.*
    能不能帮我处理一下,怎么屏蔽power sleep wakeUp这几颗键,我于`````````这几颗键太害人了,我是菜了,什么都不会,在册注表里能实现吗?
    我没什么联系就用我的邮箱,OK吗?谢了
    hmqtools@163.com
    #qq 发表于2004-11-09 15:46:00  IP: 210.82.53.*
    不懂
    #江恩 发表于2004-11-16 08:51:00  IP: 61.144.35.*
    我也做了同样的事情,发现底层键盘钩子是不能屏蔽Power键的,看来要另外想办法,望高手指点。
    #Fan 发表于2004-11-26 14:11:00  IP: 202.38.97.*
    Hi,培培

    我在屏蔽power键的时候出了点问题~

    好像他和其他键的vkc不属于一类呀。 :(
    #cx 发表于2004-12-06 15:45:00  IP: 218.108.31.*
    无法拦截power sleep
    #saint 发表于2004-12-08 23:07:00  IP: 61.48.135.*
    我用的是delphi7进行调用,可是由于本人的经验缺乏,发现接口定义有一点的问题,没有成功调用,请培培,帮忙写个delphi的调用例程,谢谢!
    #saint 发表于2004-12-08 23:09:00  IP: 61.48.135.*
    培培,你好!
    我用delphi调用vc的dll时遇到了一些问题,由于本人经验缺乏,希望你能够帮忙写一个delphi的调用例程,谢谢!
    #King 发表于2004-12-24 11:35:00  IP: 219.140.167.*
    win2000 Advanced server系统,怎么不能用啊?
    #蝈蝈 发表于2004-12-28 20:24:00  IP: 211.101.39.*
    不懂呀 各位大哥 大姐
    有没有弄好的插件 直接传给我们呀
    谢谢了
    lncygzc@163.com
    #thor 发表于2005-01-07 22:46:00  IP: 218.27.65.*
    卢大哥弄的那个钩子我已经下好了, 但是不知道应该怎么用啊,小弟这写东西什么都不懂,请各位能不能告诉一下,感激不尽,那个win键实在很烦人呢!
    谢谢!!
    #烈 发表于2005-01-07 22:50:00  IP: 218.27.65.*
    我用了那个屏蔽的vb文件,但是虽然是成功屏蔽了win键盘,但是好象b也被屏蔽了啊??
    还有,那个dll是怎么使用的呢?有没有办法可以一开机子就自动屏蔽,不用每次都运行程序呢?
    谢谢
    #kiyi 发表于2005-01-12 09:48:00  IP: 61.157.97.*
    大哥,你好呀,我想问你另外一个问题,就是怎样才能解除对鼠标的限制,不是上网时右銉哪一种,是左右键都不能用了
    #goodname008(文章作者)  发表于2005-01-14 13:55:00  IP: 61.51.59.*
    例程不仅屏蔽了win键,也屏蔽了 A, B, C, 上, 下, 左, 右。
    #小涛 发表于2005-01-15 13:28:00  IP: 218.9.203.*
    我只懂一点,但是也看不太明白,有没有现成的东西给我发一个好吗?谢谢你们了!
    我的邮箱 baitao0729@163.com
    #syjd@mail.com 发表于2005-04-17 01:46:00  IP: 220.165.182.*
    在VB里..如果是关上CTRL怎么做啊.
    #红飞 发表于2005-05-17 00:32:00  IP: 61.55.164.*
    没什么说的了 太谢谢了
    网吧最近效益要比以前好的多拉
    heisng_113@yahoo.com.cn
    heising113@126.com
    #vava 发表于2005-07-20 16:12:00  IP: 61.186.252.*
    我通过键盘Hook可以捕获到该键,其virtual code为255,scan code为94,但不知为什么系统仍然关机?
    #honmiz 发表于2005-12-07 18:13:00  IP: 219.136.154.*
    请问一下,我做了个小程序,想实现当我按F3时,能隐藏我当前的程序,当再按F3时又把它显示出来,如何使用,我用过钩子,可总是只有当我的程序是活动的才有响应,我想做个全局性的。不管当前活动的是何程序都有响应我这个小程序。
    #AAA 发表于2005-12-28 09:58:00  IP: 218.12.96.*
    请教:是不是CTRL+ALT+DEL 组合键不能屏蔽啊。我用了培大哥的方法别的键都能屏蔽了,这个键不能,哪位能帮忙解决一下啊?谢谢!!!!!!!!
    #applebaby 发表于2006-01-04 16:44:00  IP: 218.9.135.*
    卢大哥:你好!你的程序,看过后非常适用,解决了我苦思冥想一个月的困惑,不过我现在任有些问题想要请教,一个就是如何屏蔽CTRL+ALT+DEL和整个键盘另一个是怎样屏蔽鼠标,你的程序,可以改成键盘和鼠标一起屏蔽的吗?如能回复,不胜感激!衷心的表示感谢!我的邮箱是applebaby03@126.com
    #applebaby 发表于2006-01-04 15:00:00  IP: 218.9.135.*
    谢谢:培培大哥!你的代码很好!我已经屏蔽了一些健,但是我也是问同样的问题,怎样屏蔽CTRL+ALT+DEL和整个键盘?
    #sumo 发表于2006-06-01 20:41:00  IP: 219.144.203.*
    [求助]编程实现屏蔽并恢复windows热键和任务栏

    这是我的课程设计 我在网上找的资料看不懂
    由于还有10天就要交作业 不得已求助各位的帮助
    希望能作出比较详细的说明或有详细说明的网址发个也行
    密切关注中 在线等
    感激不尽 生当结绳,死当衔草!
    #Kane 发表于2006-08-12 04:08:00  IP: 218.4.184.*
    培培兄:

    请把现成的dll档发给我吧,我对C++ 陌生的很,我尝试编译时报错了,我也不知道怎么解决。

    mayihaveid@yahoo.com.cn 非常感谢,看来回家对C 要下功夫了。
    #感谢 发表于2006-08-19 19:54:00  IP: 221.220.169.*
    非常感谢,急死我了
    #wu8313 发表于2007-04-01 21:07:23  IP: 218.22.200.*
    下载不了,可否传来一份( for vb )。谢谢。
    #wu8313 发表于2007-04-01 21:11:04  IP: 218.22.200.*
    下载不了,可否传来一份( for vb )。谢谢。

    xchwzhy@126.com
    #realna 发表于2007-04-15 18:38:45  IP: 222.221.189.*
    源代码无法下载啊```麻烦您把源代码发给我一份 VB VC 都可以```谢谢啦
    realgame@qq.com
    #gaoming_shepherd 发表于2007-05-18 09:53:58  IP: 219.239.98.*
    卢大哥:2000 server中用不了啊,不知道为什么?
    #efang4206 发表于2007-08-17 13:17:16  IP: 61.181.75.*
    麻烦给我也发一份啊 下载不了..要一份VC的
    #lucky006 发表于2007-08-19 13:41:03  IP: 59.34.54.*
    能发那个 maskkey.zip 到我邮箱吗? 谢谢了

    lucky_06_6@hotmail.com

    我在使用的时候报错

    error C2664: 'StartMaskKey' : cannot convert parameter 3 from 'int (__stdcall *)(unsigned int,struct tagKBDLLHOOKSTRUCT *)' to 'int'
    This conversion requires a reinterpret_cast, a C-style cast or function-style cast
    #jarcyju 发表于2007-11-15 15:38:21  IP: 220.249.91.*
    大哥下载不了呀,麻烦发一份给我,谢谢啦
    zhuyc0808@gmail.com
    #jingang123gz 发表于2008-07-17 10:20:33  IP: 58.42.230.*
    在C# 中怎么屏蔽WIN键啊?????
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 卢培培