win2000下如何屏蔽win+D键,高手请进,吐血300分,谢绝拷贝论坛老帖子灌水 (300分)

  • 主题发起人 主题发起人 NetBird
  • 开始时间 开始时间
N

NetBird

Unregistered / Unconfirmed
GUEST, unregistred user!
[red]我编了小的应用软件,完成后可以免费给大家用,但是现在有一个问题始终没有解决,就是屏蔽win+d组合键禁止切换到桌面的问题,论坛上的贴子我已经看过了,好像都没有很好的解决这个问题,屏蔽其它任何键我都能实现,请各位富翁只回答屏蔽win+d这一个问题,其它的键怎么屏蔽我知道,先谢了。[/red]
 
屏蔽系统按键<br>也许你希望程序在运行时不想让用户按系统按键 Alt-Tab 或 Ctrl-Alt-Del,那么可以通过以下的程序来屏蔽这些按键。  <br>procedure TForm1.FormCreate(Sender: TObject);   var tmp,Flag :integer;<br>begin<br>  tmp := 0;<br>Flag := 1;<br>  //屏蔽 Alt-Tab<br>  SystemParametersInfo( SPI_SETFASTTA-SKSWITCH, Flag, @tmp, 0);<br>  //屏蔽 Ctrl-Alt-Del<br>  SystemParametersInfo( SPI_SCREENSAVERRU-NNING,Flag, @tmp, 0);  <br>end;<br>  当你要恢复功能键时用以下代码:<br>Flag := 0;<br>SystemParametersInfo(SPI_SCREENSAVERRU-NNING,Flag,@temp,0);_____________________________________________________________________隐藏和显示Windows的任务条如何隐藏和显示Windows的任务条?仅仅调用以下的函数就可以。本程序的思路实际上就是先找到标题条的句柄,然后向它发送相应消息(SW_HIDE/SW_RESTORE)即可<br>procedure hideTaskbar;<br>//隐藏<br>var wndHandle : THandle;<br>wndClass : array[0..50] of Char;<br>begin<br>StrPCopy(@wndClass[0], 'Shell_TrayWnd');<br>wndHandle := FindWindow(@wndClass[0], nil);<br>ShowWindow(wndHandle, SW_HIDE);<br>End;<br>procedure showTaskbar;<br>var wndHandle : THandle;<br>wndClass : array[0..50] of Char;<br>begin<br>StrPCopy(@wndClass[0], 'Shell_TrayWnd');<br>wndHandle := FindWindow(@wndClass[0], nil);<br>ShowWindow(wndHandle, SW_RESTORE);<br>end; <br>
 
我是说屏蔽掉win键,以前的贴子大多在2000下都不能实现,所以请不要把以前的贴子再贴上来,拜托
 
什么是win键?
 
我有这个DEMO,你留个EMAIL下来吧,Win9x/WinNT/Win2000/WinME下运行都没问题
 
看这段文字,我从csdn上摘的:<br><br>如果你是基于Windows操作系统做系统集成的,你可能希望你的最终产品独占系统资源。你希望规范用户行为,比如你不希望用户通过按Ctrl+Alt+Del终止某个进程,或者按下Win键弹出开始菜单,或者按下Alt+Tab组合键切换到别的应用程序。笔者已有相关一篇文章《Win2K/NT下屏蔽Ctrl+Alt+Del的响应》,介绍了如何通过GINA编程接口屏蔽Ctrl+Alt+Del的响应。作为续篇,本文将继续介绍屏蔽Win键和Alt+Tab组合键的方法。 &nbsp;<br>&nbsp;<br>由于这些按键的响应是系统级的,我们不可能简单地通过某个程序来控制它们。因此,我们需要使用微软提供的另外一种编程接口——钩子(Hook)。大家可能已经对钩子很了解了(网上有很多介绍钩子技术和应用的文章)。简单来说,钩子是一种通过替换系统提供的标准接口来截获特定的事件(消息),最终达到改变或增强系统默认行为目的的技术。我们现在的任务,就是要在用户按下Win键或Alt+Tab组合键、但系统还没有响应之前截获它们,然后改变系统的默认行为。很显然,我们要做一个全局钩子(钩子函数放在独立的DLL中实现),而且是个低级键盘钩子(Low &nbsp;Level &nbsp;Keyboard &nbsp; &nbsp;hook)。 &nbsp;<br>&nbsp;<br>第一步,钩子DLL的实现。我们首先要定义一个全局数据区(记住这是一个全局钩子),如下(放在cpp文件的上头): &nbsp;<br>#pragma &nbsp;data_seg("mydata") &nbsp;<br>HHOOK &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;glhHook &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= &nbsp;NULL; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;安装的鼠标钩子句柄 &nbsp;<br>HINSTANCE &nbsp; &nbsp;glhInstance &nbsp; &nbsp;= &nbsp;NULL; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;DLL实例句柄 &nbsp;<br>#pragma &nbsp;data_seg() &nbsp;<br>然后在.def文件中声明这个数据区,如下: &nbsp;<br>SECTIONS &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;mydata &nbsp;READ &nbsp;WRITE &nbsp;SHARED &nbsp;<br>当这个DLL被某个进程载入时,程序从WinMain进入,此时我们需要把模块句柄保存下来,如下: &nbsp;<br>glhInstance &nbsp;= &nbsp;(HINSTANCE) &nbsp;hModule; &nbsp;<br>接下去,我们就要定义两个导出函数,以及钩子的处理函数。我们重点看一下这个钩子处理函数(另外两个导出函数比较简单,只是通过调用SetWindowsHookEx和UnhookWindowsHookEx实现安装/卸载钩子函数;只需注意SetWindowsHookEx第一个参数为WH_KEYBOARD_LL,第四个参数为0)。 &nbsp;<br>// &nbsp;低级键盘钩子处理函数 &nbsp;<br>LRESULT &nbsp;CALLBACK &nbsp;LowLevelKeyboardProc(int &nbsp;nCode, &nbsp;WPARAM &nbsp;wParam, &nbsp;LPARAM &nbsp;lParam) &nbsp;<br>{ &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;BOOL &nbsp;fEatKeystroke &nbsp;= &nbsp;FALSE; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;PKBDLLHOOKSTRUCT &nbsp;p &nbsp;= &nbsp;NULL; &nbsp;<br>&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;if &nbsp;(nCode &nbsp;== &nbsp;HC_ACTION) &nbsp; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;{ &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;p &nbsp;= &nbsp;(PKBDLLHOOKSTRUCT) &nbsp;lParam; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;switch &nbsp;(wParam) &nbsp; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case &nbsp;WM_KEYDOWN: &nbsp; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case &nbsp;WM_SYSKEYDOWN: &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case &nbsp;WM_KEYUP: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case &nbsp;WM_SYSKEYUP: &nbsp; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fEatKeystroke &nbsp;= &nbsp;(p-&gt;vkCode &nbsp;== &nbsp;VK_LWIN) &nbsp; &nbsp;&amp;brvbar; &nbsp;&amp;brvbar; &nbsp;(p-&gt;vkCode &nbsp;== &nbsp;VK_RWIN) &nbsp; &nbsp;&amp;brvbar; &nbsp;&amp;brvbar; &nbsp; &nbsp;// &nbsp;屏蔽Win &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;屏蔽Alt+Tab &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;((p-&gt;vkCode &nbsp;== &nbsp;VK_TAB) &nbsp;&amp;&amp; &nbsp;((p-&gt;flags &nbsp;&amp; &nbsp;LLKHF_ALTDOWN) &nbsp;!= &nbsp;0)) &nbsp; &nbsp;&amp;brvbar; &nbsp;&amp;brvbar; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;屏蔽Alt+Esc &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;((p-&gt;vkCode &nbsp;== &nbsp;VK_ESCAPE) &nbsp;&amp;&amp; &nbsp;((p-&gt;flags &nbsp;&amp; &nbsp;LLKHF_ALTDOWN) &nbsp;!= &nbsp;0)) &nbsp; &nbsp;&amp;brvbar; &nbsp;&amp;brvbar; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;屏蔽Ctrl+Esc &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;((p-&gt;vkCode &nbsp;== &nbsp;VK_ESCAPE) &nbsp;&amp;&amp; &nbsp;((GetKeyState(VK_CONTROL) &nbsp;&amp; &nbsp;0x8000) &nbsp;!= &nbsp;0)); &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;default: &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;} &nbsp;<br>&nbsp;<br>&nbsp; &nbsp;return &nbsp;(fEatKeystroke &nbsp;? &nbsp;TRUE &nbsp;: &nbsp;CallNextHookEx(glhHook,nCode,wParam,lParam)); &nbsp;<br>} &nbsp;<br>大家可以看到,当程序发现按下的是Win键或者Alt+Tab组合键,就不再调用CallNextHookEx函数将这个消息传递下去。以此,我们做到了屏蔽这些按键的响应。 &nbsp;<br>&nbsp;<br>第二步,钩子DLL的测试程序。在VC中创建一个基于对话框的应用程序。通过调用LoadLibrary("KeyMask.dll")载入钩子DLL,通过GetProcAddress(m_hDll,"StartKeyMask")和GetProcAddress(m_hDll,"StopKeyMask")导入两个安装/卸载钩子的函数。在主对话框上定义两个按钮分别调用这两个函数,如下: &nbsp;<br>&nbsp;<br>当按下“Start_Hook”按钮,我们的钩子函数就起作用了。试一下Win键,或者Alt+Tab组合键,没反应了吧?!“Stop_Hook”按钮可以解除这个钩子。 &nbsp;<br>&nbsp;<br>讲到这,大家可能觉得钩子其实也是很容易的东西。是的,钩子容易使用,而且功能强大。但是,笔者建议,如果不是十分必要,请尽量少用钩子。因为钩子在实现强大功能的同时,可能也会严重降低你系统的性能。有时候是得不偿失的! &nbsp;<br>
 
希望对你的问题有帮助<br>
 
在原码上看了一个程序用钩子的<br>tagKBDLLHOOKSTRUCT = packed record<br>&nbsp; vkCode: DWORD;//虚拟键值<br>&nbsp; scanCode: DWORD;//扫描码值(没有用过,我也不懂^_^)<br>&nbsp; {一些扩展标志,这个值比较麻烦,MSDN上说得也不太明白,但是<br>&nbsp; 根据这个程序,这个标志值的第六位数(二进制)为1时ALT键按下为0相反。}<br>&nbsp; flags: DWORD;<br>&nbsp; time: DWORD;//消息时间戳<br>&nbsp; dwExtraInfo: DWORD;//和消息相关的扩展信息<br>end;<br>&nbsp;KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;<br>&nbsp;PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;<br><br>//这个是低级键盘钩子的索引值,Delphi中没有,必须自己定义<br>const WH_KEYBOARD_LL = 13;<br>//定义一个常量好和上面哪个结构中的flags比较而得出ALT键是否按下<br>const LLKHF_ALTDOWN = $20;<br>var<br>hhkLowLevelKybd: HHOOK = 0;<br>function LowLevelKeyboardProc(nCode: Integer;<br>&nbsp; WParam: WPARAM;LParam: LPARAM):LRESULT; stdcall;<br>var<br>&nbsp; fEatKeystroke: BOOL;<br>&nbsp; p: PKBDLLHOOKSTRUCT;<br>begin<br>&nbsp; Result := 0;<br>&nbsp; fEatKeystroke := FALSE;<br>&nbsp; p := PKBDLLHOOKSTRUCT (lParam);<br>//nCode值为HC_ACTION时表示WParam和LParam参数包涵了按键消息<br>&nbsp; if (nCode = HC_ACTION) then<br>&nbsp; begin<br>&nbsp; &nbsp;case wParam of<br>&nbsp; &nbsp; &nbsp; WM_KEYDOWN,<br>&nbsp; &nbsp; &nbsp; WM_SYSKEYDOWN: begin<br>&nbsp; &nbsp; &nbsp;// WM_KEYUP,<br>&nbsp; &nbsp; // &nbsp;WM_SYSKEYUP: begin<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ((p.flags and LLKHF_ALTDOWN) &lt;&gt; 0)or(p.vkCode=38)or(p.vkCode=40)<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; or ((p.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000) &lt;&gt; 0))<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; or(p.vkCode=vk_lwin)or(p.vkCode=vk_rwin)<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;then fEatKeystroke :=true;<br>&nbsp; &nbsp; &nbsp;end;<br>&nbsp; &nbsp; end;<br>&nbsp; end;<br>&nbsp; if fEatKeystroke = True then<br>&nbsp; &nbsp; Result := 1;<br>&nbsp; if nCode &lt;&gt; 0 then<br>&nbsp; &nbsp; &nbsp;Result := CallNextHookEx(0, nCode, wParam, lParam);<br>end;
 
论坛上有,以下转载,作者不详!<br>===============================================================================<br><br>function LowLevelKeyboardProc(nCode:integer;WParam:WPARAM;LParam:LPARAM):LRESULT;stdcall;<br>&nbsp; var<br>&nbsp; &nbsp; fEatKeystroke:BOOL;<br>&nbsp; &nbsp; p:PKBDLLHOOKSTRUCT;<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; result:=0;<br>&nbsp; &nbsp; fEatKeystroke := false;<br>&nbsp; &nbsp; p:=PKBDLLHOOKSTRUCT(lparam);<br>&nbsp; &nbsp; if (ncode=HC_ACTION) then<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; case wparam of<br>&nbsp; &nbsp; WM_KEYDOWN,<br>&nbsp; &nbsp; WM_SYSKEYDOWN,<br>&nbsp; &nbsp; WM_KEYUP,<br>&nbsp; &nbsp; WM_SYSKEYUP:<br>&nbsp; &nbsp; featkeystroke :=(p.vkcode = VK_Lwin) or (p.vkcode = VK_Rwin)or (p.vkcode = VK_apps);<br>&nbsp; &nbsp; end;<br>&nbsp; &nbsp; end;<br>&nbsp; &nbsp; if featkeystroke = true then<br>&nbsp; &nbsp; result:=1;<br>&nbsp; &nbsp; if ncode &lt;&gt; 0 then<br>&nbsp; &nbsp; result := callnexthookex(0,ncode,wparam,lparam);<br>&nbsp; &nbsp; end;<br><br>procedure form1.lock;<br>const<br>&nbsp; wh_keyboard_ll = 13;<br>begin<br>&nbsp; hhklowlevelkybd := setwindowshookexw(wh_keyboard_ll,LowlevelKeyboardproc,hinstance,0);<br>end;<br>锁住左右win键和application键<br>用的是低级键盘hook
 
AAAAAAAAAAAAAAAAAAAAAAAAA
 
上面的代码我试了,都不行,还有没有人知道?帮帮忙啊
 
那你都不想看看我的例程,我也没办法呀 &nbsp;:(
 
Form 的 OnkeyDown 事件.
 
to app2001,我的邮件是guigangli@sohu.com,如果调试成功,300分全部奉上,谢谢
 
用钩子!
 
to app2001:<br>到现在还没有收到,请再发一次。<br>这个问题应该不难,为什么这么少的人知道?
 
你再给一个EMAIL吧,我发到这来,被退回来了
 
to app2001:<br>&nbsp; 天哪,费了好大的劲重新申请了一个,原来的那个确实接受不了了。<br>&nbsp; 新的是:look_here@163.com &nbsp; 急切盼望中。。。。。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
698
import
I
后退
顶部