大伙来帮帮小弟!!!高分请教!不够再加分

tavor 2003-10-18 04:09:03
我作了一个程序,平常你一按WIN键就会弹出开始菜单。

我想屏蔽掉它。

我想可能要在
private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)事件中作处理,可是小弟不知道怎么办,请高手指导一下。
...全文
40 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
tavor 2004-03-18
  • 打赏
  • 举报
回复
你有你的判断,我有我的判断,那就请你不要说我无耻!

再者根本没有人正确解答出来,分给谁肯定就看楼主的意思了。这个你应该没意见吧
athossmth 2004-03-17
  • 打赏
  • 举报
回复
大家各有各的判断。
tavor 2004-03-17
  • 打赏
  • 举报
回复
我没有无耻啊,因为没有人回答正确我的帖子啊,所以我就给了几个帮我回答了一些方面问题的人分,到于gump09是我朋友,我把分给他,是因为在我没分的时候可以收回答。如果你真的能回答出我的问题,我可以赠你几百,可你没这个能力啊!怨我吗?
agamem 2004-03-16
  • 打赏
  • 举报
回复
无耻!!!
Gump09 2004-03-13
  • 打赏
  • 举报
回复
up
tavor 2003-10-22
  • 打赏
  • 举报
回复
呵呵,我没说过不给分嘛!!

给分也要到问题完结了吧!帮过忙的朋友肯定会收到分的,甚至我会加分的!!!

还要高手继续指导一下!!
HNU 2003-10-21
  • 打赏
  • 举报
回复
1.复制VC代码到这里很不负责

2.楼主不给别人分数,不守信
tavor 2003-10-21
  • 打赏
  • 举报
回复
还有没有高手帮忙看看,怎么转换啊!!!!
tavor 2003-10-19
  • 打赏
  • 举报
回复
是啊,我知道可以引用,但是我就想学怎么用C#来写出这样的DLL啊,请高手指点啊
rgbcn 2003-10-19
  • 打赏
  • 举报
回复
你在c# 里可以直接引用它。
转换我也不会 :)
tavor 2003-10-19
  • 打赏
  • 举报
回复
我这里是说把上面那个dll源文件转换,还请高手指点一下啊
tavor 2003-10-19
  • 打赏
  • 举报
回复
有没有C#下的例子,小弟转换不过来,从C到C#好难转换。
o1o 2003-10-18
  • 打赏
  • 举报
回复
学到一招。
tavor 2003-10-18
  • 打赏
  • 举报
回复
呵呵,我先看看,分数好说 ^_^
rgbcn 2003-10-18
  • 打赏
  • 举报
回复
加分最好不过了,哈哈哈。
rgbcn 2003-10-18
  • 打赏
  • 举报
回复
如果你是基于Windows操作系统做系统集成的,你可能希望你的最终产品独占系统资源。你希望规范用户行为,比如你不希望用户通过按Ctrl+Alt+Del终止某个进程,或者按下Win键弹出开始菜单,或者按下Alt+Tab组合键切换到别的应用程序。笔者已有相关一篇文章《Win2K/NT下屏蔽Ctrl+Alt+Del的响应》,介绍了如何通过GINA编程接口屏蔽Ctrl+Alt+Del的响应。作为续篇,本文将继续介绍屏蔽Win键和Alt+Tab组合键的方法。

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

第一步,钩子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)
{
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
// 屏蔽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")导入两个安装/卸载钩子的函数。在主对话框上定义两个按钮分别调用这两个函数,如下:

当按下“Start_Hook”按钮,我们的钩子函数就起作用了。试一下Win键,或者Alt+Tab组合键,没反应了吧?!“Stop_Hook”按钮可以解除这个钩子。

讲到这,大家可能觉得钩子其实也是很容易的东西。是的,钩子容易使用,而且功能强大。但是,笔者建议,如果不是十分必要,请尽量少用钩子。因为钩子在实现强大功能的同时,可能也会严重降低你系统的性能。有时候是得不偿失的。
rgbcn 2003-10-18
  • 打赏
  • 举报
回复
低级键盘钩子屏蔽Win键、Alt+Tab键的响应(有源代码)

http://hqtech.nease.net/articles/WinAltTab.htm
tavor 2003-10-18
  • 打赏
  • 举报
回复
噢,那随可以提供更详细点的资料啊!

请各们高手继续指导指导小弟!
littlechang 2003-10-18
  • 打赏
  • 举报
回复
好象不行,可能要调用API。
sharpdew 2003-10-18
  • 打赏
  • 举报
回复
这个事件中怎么处理都是达不到效果的,使用键盘钩子可以,关于这个讨论你可以参考本版相关文章,搜索“键盘”关键字即可。

110,502

社区成员

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

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

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