关于C#屏蔽alt+tab键的问题

Re_start 2008-06-11 02:33:23
因为做的是在线考试系统。
为了防止学生切换页面必须要屏蔽该键
但又不知功能怎么实现。
请指教
...全文
1418 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
北京的雾霾天 2008-06-12
  • 打赏
  • 举报
回复
我想使用键盘Hook是可以解决问题的,不过在VS2005中不能直接使用Hook,你可以使用VC++编写一个DLL,把Hook代码使用C++来实现,并在DLL给出使用的公开方法在C#里调用就是了。

对于上面的截获消息的方法可能无效!
Janyue 2008-06-11
  • 打赏
  • 举报
回复
用js应该都可以实现的吧,ASII码值
dayizhixiaotutu 2008-06-11
  • 打赏
  • 举报
回复

或者按下Alt Tab组合键切换到别的应用程序。笔者已有相关一篇文章《Win2K/NT下屏蔽Ctrl Alt Del的响应》,介绍了如何通过GINA编程接口屏蔽Ctrl Alt Del的响应。作为续篇,本文将继续介绍屏蔽Win键和Alt Tab组合键的方法。
  
  由于这些按键的响应是系统级的,我们不可能简单地通过某个程序来控制它们。因此,我们需要使用微软提供的另外一种编程接口——钩子(Hook)。大家可能已经对钩子很了解了(网上有很多介绍钩子技术和应用的文章)。简单来说,钩子是一种通过替换系统提供的标准接口来截获特定的事件(消息),最终达到改变或增强系统默认行为目的的技术。我们现在的任务,就是要在用户按下Win键或Alt Tab组合键、但系统还没有响应之前截获它们,然后改变系统的默认行为。很显然,我们要做一个全局钩子(钩子函数放在独立的DLL中实现),而且是个低级键盘钩子(Low Level Keyboard hook)。

字串2


  第一步,钩子DLL的实现。我们首先要定义一个全局数据区(记住这是一个全局钩子),如下(放在cpp文件的上头):

  #pragma data_seg("mydata")
  HHOOK glhHook = NULL; // 安装的鼠标钩子句柄
  HINSTANCE glhInstance = NULL; // DLL实例句柄
  #pragma data_seg()

  然后在.def文件中声明这个数据区,如下:
  SECTIONS
  mydata READ WRITE SHARED

  当这个DLL被某个进程载入时,程序从WinMain进入,此时我们需要把模块句柄保存下来,如下:
  glhInstance = (HINSTANCE) hModule;

  接下去,我们就要定义两个导出函数,以及钩子的处理函数。我们重点看一下这个钩子处理函数(另外两个导出函数比较简单,只是通过调用SetWindowsHookEx和UnhookWindowsHookEx实现安装/卸载钩子函数;只需注重SetWindowsHookEx第一个参数为WH_KEYBOARD_LL,第四个参数为0)。

  // 低级键盘钩子处理函数
  LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
  { 字串3

   BOOL fEatKeystroke = FALSE;
   PKBDLLHOOKSTRUCT p = NULL;

   if (nCode == HC_ACTION)
   {
   p = (PKBDLLHOOKSTRUCT) lParam;

   switch (wParam)
   {
   case WM_KEYDOWN:
   case WM_SYSKEYDOWN:
   case WM_KEYUP:
   case WM_SYSKEYUP:
   fEatKeystroke = (p->vkCode == VK_LWIN) ¦ ¦ (p->vkCode == VK_RWIN) ¦ ¦ // 屏蔽Win
字串6


   // 屏蔽Alt Tab
   ((p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0)) ¦ ¦
   // 屏蔽Alt Esc
   ((p->vkCode == VK_ESCAPE) && ((p->flags & LLKHF_ALTDOWN) != 0)) ¦ ¦
   // 屏蔽Ctrl Esc
   ((p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 0x8000) != 0));
   break;
   default:
   break;

   }
   }

  return (fEatKeystroke ? TRUE : CallNextHookEx(glhHook,nCode,wParam,lParam));
  }

  大家可以看到,当程序发现按下的是Win键或者Alt Tab组合键,就不再调用CallNextHookEx函数将这个消息传递下去。以此,我们做到了屏蔽这些按键的响应。
  
  第二步,钩子DLL的测试程序。在VC中创建一个基于对话框的应用程序。通过调用LoadLibrary("KeyMask.dll")载入钩子DLL,通过GetProcAddress(m_hDll,"StartKeyMask")和GetProcAddress(m_hDll,"StopKeyMask")导入两个安装/卸载钩子的函数。在主对话框上定义两个按钮分别调用这两个函数,如下: 字串8

  当按下“Start_Hook”按钮,我们的钩子函数就起作用了。试一下Win键,或者Alt Tab组合键,没反应了吧?!“Stop_Hook”按钮可以解除这个钩子
Deathsign 2008-06-11
  • 打赏
  • 举报
回复
重载WndProc
查WIN32里面的消息代码,如果是键盘按键的代码截获并且干掉就行了(不给base处理就OK)···
ypacyhero 2008-06-11
  • 打赏
  • 举报
回复

要用注册表才行
jstxqgb 2008-06-11
  • 打赏
  • 举报
回复
这东西在页面用script 控制就行了,google一下立马出答案
yilanwuyu123 2008-06-11
  • 打赏
  • 举报
回复
up mark

110,024

社区成员

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

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

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