需要在WinXp下屏蔽一些系统按键,查到一篇资料,不过是用C++写的,小弟对C++不太熟悉,
那位仁兄帮着改写成Delphi的形式.一定多多给分,只翻译出程序的主要部分也谢谢。(程序用
到了键盘钩子TaskKeyHook.dll,这个DLL的源代码没有贴出)。屏蔽任务切换键序列,这些键序列包括Alt+Tab、Ctrl+Esc、Alt+Esc、VK_LWIN/VK_RWIN以及任务栏。// TrapKeys.cpp//#include "stdafx.h"#include "resource.h"#include "StatLink.h"#include "TaskKeyMgr.h"////////////////////// 主对话框//class CMyDialog : public CDialog {public:CMyDialog(CWnd* pParent = NULL) : CDialog(IDD_MYDIALOG, pParent) { }protected:HICON m_hIcon;CStaticLink m_wndLink1;CStaticLink m_wndLink2;CStaticLink m_wndLink3;virtual BOOL OnInitDialog();// 命令/UI 的更新处理afx_msg void OnDisableTaskMgr();afx_msg void OnDisableTaskKeys();afx_msg void OnDisableTaskbar();afx_msg void OnUpdateDisableTaskMgr(CCmdUI* pCmdUI);afx_msg void OnUpdateDisableTaskKeys(CCmdUI* pCmdUI);afx_msg void OnUpdateDisableTaskbar(CCmdUI* pCmdUI);afx_msg LRESULT OnKickIdle(WPARAM,LPARAM);DECLARE_MESSAGE_MAP()};///////////////////////////////////////////////////////// 标准的MFC 对话框应用类代码。//class CMyApp : public CWinApp {public:virtual BOOL InitInstance() {// 初始化app:运行对话框CMyDialog dlg;m_pMainWnd = &dlg;dlg.DoModal();return FALSE;}virtual int ExitInstance() {// 为了按全起见,在退出程序的时候,将所有禁用的项目复原CTaskKeyMgr::Disable(CTaskKeyMgr::ALL, FALSE);return 0;}} theApp;BEGIN_MESSAGE_MAP(CMyDialog, CDialog)ON_COMMAND(IDC_DISABLE_TASKKEYS,OnDisableTaskKeys)ON_COMMAND(IDC_DISABLE_TASKBAR, OnDisableTaskbar)ON_COMMAND(IDC_DISABLE_TASKMGR, OnDisableTaskMgr)ON_UPDATE_COMMAND_UI(IDC_DISABLE_TASKKEYS, OnUpdateDisableTaskKeys)ON_UPDATE_COMMAND_UI(IDC_DISABLE_TASKBAR, OnUpdateDisableTaskbar)ON_UPDATE_COMMAND_UI(IDC_DISABLE_TASKMGR, OnUpdateDisableTaskMgr)ON_MESSAGE(WM_KICKIDLE,OnKickIdle)END_MESSAGE_MAP()///////////////////////////////////////////////// 初始化对话框:子类化超链接柄加栽图标//BOOL CMyDialog::OnInitDialog(){CDialog::OnInitDialog();// 初始化超链接m_wndLink1.SubclassDlgItem(IDC_EMAIL,this);m_wndLink2.SubclassDlgItem(IDC_VCKBASEURL,this);m_wndLink3.SubclassDlgItem(IDC_VCKBASELINK,this);// 自己设置对话框图标。MFC不会为对话框应用程序设置它m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);SetIcon(m_hIcon, TRUE); // 打图标SetIcon(m_hIcon, FALSE); // 小图标 return TRUE;}////////////////////////////////////////////////////////// 命令/UI 更新处理:写这些东西应该很轻松。void CMyDialog::OnDisableTaskKeys(){CTaskKeyMgr::Disable(CTaskKeyMgr::TASKKEYS,!CTaskKeyMgr::AreTaskKeysDisabled(), TRUE); // 蜂鸣}void CMyDialog::OnUpdateDisableTaskKeys(CCmdUI* pCmdUI){pCmdUI->SetCheck(CTaskKeyMgr::AreTaskKeysDisabled());}void CMyDialog::OnDisableTaskbar(){CTaskKeyMgr::Disable(CTaskKeyMgr::TASKBAR,!CTaskKeyMgr::IsTaskBarDisabled());}void CMyDialog::OnUpdateDisableTaskbar(CCmdUI* pCmdUI){pCmdUI->SetCheck(CTaskKeyMgr::IsTaskBarDisabled());}void CMyDialog::OnDisableTaskMgr(){CTaskKeyMgr::Disable(CTaskKeyMgr::TASKMGR,!CTaskKeyMgr::IsTaskMgrDisabled());}void CMyDialog::OnUpdateDisableTaskMgr(CCmdUI* pCmdUI){pCmdUI->SetCheck(CTaskKeyMgr::IsTaskMgrDisabled());}////////////////////////////////////////////////////////// 要想让ON_UPDATE_COMMAND_UI正常工作,这是必需的。//LRESULT CMyDialog::OnKickIdle(WPARAM wp, LPARAM lCount){UpdateDialogControls(this, TRUE);return 0;} 按上述方法尽管禁用了任务栏,但是还有一个机关没有处理,那就是按下Windows键仍然可以弹出“开始”菜单。显然在处理VK_LWIN之前,任务栏不会检查是否被启用。一般来讲,如果某个窗口被屏蔽掉,那么它就不再会处理用户在这个窗口的输入--这就是所谓的禁用(Disable)的含义。通常调用EnableWindow(FALSE)后自然就达到了这个目的。但是处理VK_LWIN/VK_RWIN按键的代码决不会去检查任务栏启用/禁用状态。对此,本文的处理办法仍然是利用键盘钩子。修改一下TaskKeyHook实现,增加对Windows键的捕获。这样按下“开始”菜单键之后什么也不会发生。希望没有漏掉其它的按键。如果哪位读者发现漏掉了什么键,请和我联系,以便把它加到键盘钩子中去。为了简单起见,我在类CTaskKeyMgr中封装了所有禁用的函数。下面是这个类的定义击实现文件:TaskKeyMgr////////////////////////////////////////// TaskKeyMgr.h//#pragma once#include "TaskKeyHook.h"/////////////////////////////////////////////////////////////////////// 使用这个类禁用任务键,任务管理器或任务栏。// 用相应的标志调用Disable,如:CTaskMgrKeys::Disable(CTaskMgrKeys::ALL);//class CTaskKeyMgr {public:enum {TASKMGR = 0x01, // 禁用任务管理器(Ctrl+Alt+Del)TASKKEYS = 0x02, //禁用任务转换键(Alt-TAB, etc)TASKBAR = 0x04, //禁用任务栏ALL=0xFFFF //禁用所有东西L};static void Disable(DWORD dwItem,BOOL bDisable,BOOL bBeep=FALSE);static BOOL IsTaskMgrDisabled();static BOOL IsTaskBarDisabled();static BOOL AreTaskKeysDisabled() {return ::AreTaskKeysDisabled(); // 调用 DLL}};CPP实现////////////////////////////////////////////////////////////////// TaskKeyMgr.cpp//#include "StdAfx.h"#include "TaskKeyMgr.h"#define HKCU HKEY_CURRENT_USER// 用于禁用任务管理器策略的注册表键值对LPCTSTR KEY_DisableTaskMgr ="Software\Microsoft\Windows\CurrentVersion\Policies\System";LPCTSTR VAL_DisableTaskMgr = "DisableTaskMgr";///////////////////////////////////////////// 禁用相关的任务键//// dwFlags = 表示禁用什么// bDisable = 禁用为 (TRUE) ,否则为启用 (FALSE)// bBeep = 按下非法键是否蜂鸣(指针对任务键)//void CTaskKeyMgr::Disable(DWORD dwFlags, BOOL bDisable, BOOL bBeep){// 任务管理器 (Ctrl+Alt+Del)if (dwFlags & TASKMGR) {HKEY hk;if (RegOpenKey(HKCU, KEY_DisableTaskMgr,&hk)!=ERROR_SUCCESS)RegCreateKey(HKCU, KEY_DisableTaskMgr, &hk);if (bDisable) { // 禁用任务管理器(disable TM): set policy = 1DWORD val=1;RegSetValueEx(hk, VAL_DisableTaskMgr, NULL,REG_DWORD, (BYTE*)&val, sizeof(val));} else { // 启用任务管理器(enable TM)RegDeleteValue(hk,VAL_DisableTaskMgr);}}// 任务键 (Alt-TAB etc)if (dwFlags & TASKKEYS)::DisableTaskKeys(bDisable,bBeep); // 安装键盘钩// 任务栏if (dwFlags & TASKBAR) {HWND hwnd = FindWindow("Shell_traywnd", NULL);EnableWindow(hwnd, !bDisable);}}BOOL CTaskKeyMgr::IsTaskBarDisabled(){HWND hwnd = FindWindow("Shell_traywnd", NULL);return IsWindow(hwnd) ? !IsWindowEnabled(hwnd) : TRUE;}BOOL CTaskKeyMgr::IsTaskMgrDisabled(){HKEY hk;if (RegOpenKey(HKCU, KEY_DisableTaskMgr, &hk)!=ERROR_SUCCESS)return FALSE; // 没有此键,不禁用DWORD val=0;DWORD len=4;return RegQueryValueEx(hk, VAL_DisableTaskMgr,NULL, NULL, (BYTE*)&val, &len)==ERROR_SUCCESS && val==1;} 这个类中的函数都是静态的,实际上CTaskKeyMgr完全就是一个名字空间。你可以在自己的程序中随心所欲地使用它。例如,禁用任务转换按键和任务栏,但是不禁用Ctrl+Alt+Del:CTaskKeyMgr::Disable(CTaskKeyMgr::TASKKEYS |CTaskKeyMgr::TASKBAR, TRUE); 此外,还有几个函数是用来检查当前禁用了哪些东西,甚至可以在用户按下禁用键时发出蜂鸣声!

解决方案 »

  1.   

    禁止和允许键盘,需要一个DLL来做到这一点: 
    Library KillKB;Uses Wintypes, WinProcs{$IFNDEF VER80},Win31{$ENDIF};VaroldHook: HHook;Function KbHook( code: Integer; wparam: Word; lparam: LongInt ): LongInt;export;BeginIf code < 0 ThenKbHook := CallNextHookEx( oldHook, code, wparam, lparam )ElseKbHook := 1;End; { KbHook }Function DisableKeyboard: Boolean; export;BeginoldHook := SetWindowsHookEx( WH_KEYBOARD, KbHook, HInstance, 0 );DisableKeyboard := oldHook <> 0;End;Procedure EnableKeyboard; export;BeginIf oldHook <> 0 Then BeginUnhookWindowshookEx( oldHook );oldHook := 0;End; { If }End;exportsDisableKeyboard index 1,EnableKeyboard index 2;BeginoldHook := 0;End.
      

  2.   

    我只是屏蔽一些系统键,并不锁定键盘。
    是在2000/XP 下。也不想换Gina,谢谢
      

  3.   

    www.google.com
    可以搜索到delphi的啊。
      

  4.   

    我也想屏避“POWER”键,我表弟(6岁)他似乎对那个键情有独钟,高人助我屏避这个该死的键吧!
    [email protected]
      

  5.   

    //以下代码仅供参考
    {
    This component for hide/show your application in control+alt+delete
    Control+alt+delete tuslarina bastiginizda uygulamanizin gozukmesini
    istemiyorsaniz bu component size gore...
    izzet uslu
    istanbul-TURKEY
    http://members.xoom.com/izus
    [email protected]
    }
    unit HSApp;interfaceuses
     Windows, Messages, Classes, Controls, Forms, dsgnintf;type TAboutProperty = class(TPropertyEditor)
     private
      procedure Edit; override;
      function GetAttributes: TPropertyAttributes; override;
      function GetValue: string; override;
     end; THideShowApp = class(TComponent)
     private
      { Private declarations }
      FAbout:TAboutProperty;
     protected
      { Protected declarations }
     public
      procedure Hide;
      procedure Show;
     published
      { Published declarations }
      property About : TAboutProperty read FAbout write FAbout;
     end;procedure Register;function RegisterServiceProcess(
    dwProcessID, dwType: Integer): Integer; stdcall; external &apos;KERNEL32.DLL&apos;;implementation{$R HSAPP.RES}procedure THideShowApp.Hide;
    begin
     RegisterServiceProcess(GetCurrentProcessID, 1);
    end;procedure THideShowApp.Show;
    begin
     RegisterServiceProcess(GetCurrentProcessID, 0);
    end;{ TAboutProperty }procedure TAboutProperty.Edit;
    begin
     Application.MessageBox(&apos;By izzet uslu - 2000&apos;#13#13&apos;E-Mail : [email protected]&apos;#13&apos;WEB : http://members.xoom.com/izus&apos;,&apos;HideShow component version 1.0&apos;, MB_OK+ MB_ICONINFORMATION);
    end;function TAboutProperty.GetAttributes: TPropertyAttributes;
    begin
     GetAttributes:=[paDialog, paReadOnly];
    end;function TAboutProperty.GetValue: string;
    begin
     GetValue:=&apos;(About)&apos;;
    end;
    procedure Register;
    begin
     RegisterComponents(&apos;izus&apos;, [THideShowApp]);
     RegisterPropertyEditor(TypeInfo(TAboutProperty), THideShowApp, &apos;ABOUT&apos;, TAboutProperty);
    end;end. 
      

  6.   

    http://expert.csdn.net/Expert/topic/1508/1508975.xml?temp=.8100244
      

  7.   

    没有解决对Ctrl+Alt+Del、Alt+ Tab功能键呀?有没有Windows Api函数呢?下面这个是不是呢?
       //屏蔽 Alt-Tab
        SystemParametersInfo( SPI_SETFASTTASKSWITCH, i, @temp, 0);
      //屏蔽Ctrl+Alt+Del
        SystemParametersInfo(Spi_screensaverrunning,i,@temp,0);Win98 系统下可以使用,但是Win2000好像是不好用。
      

  8.   

    我也在位这个问题头痛,
      //屏蔽 Alt-Tab
        SystemParametersInfo( SPI_SETFASTTASKSWITCH, i, @temp, 0);
      //屏蔽Ctrl+Alt+Del
        SystemParametersInfo(Spi_screensaverrunning,i,@temp,0);
    这两个函数,只能在Win9x下使用,NT/2000不能用。如果有答案,麻烦通知我一下,难兄难弟。[email protected]
      

  9.   

    {说明:屏蔽了除ctrl+alt+del外的所有系统热键,如果不想让用户使用任务管理器建议你使用最笨的方法:隐藏任务管理器窗体,呵呵,因为我找不到别的方法了 !其实这个程序也是我改别人的,欢迎继续修改传播 - 凌风 }
    unit disp;interfaceuses
    Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,
    Dialogs, StdCtrls;
    {按键消息的结构,Delphi中没有。
    注意:这个结构在Windows NT 4 sp3以上系统
    中才能使用}
    type
    tagKBDLLHOOKSTRUCT = packed record
    vkCode: DWORD;//虚拟键值
    scanCode: DWORD;//扫描码值(没有用过)
    {一些扩展标志,这个值比较麻烦,MSDN上说得也不太明白,但是
    根据这个程序,这个标志值的第六位数(二进制)为1时ALT键按下为0相反。}
    flags: DWORD;
    time: DWORD;//消息时间戳
    dwExtraInfo: DWORD;//和消息相关的扩展信息
    end;
    KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
    PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;//这个是低级键盘钩子的索引值,Delphi中没有,必须自己定义
    const WH_KEYBOARD_LL = 13;
    //定义一个常量好和上面哪个结构中的flags比较而得出ALT键是否按下
    const LLKHF_ALTDOWN = $20;
    //----声明各个函数-------------
     function LowLevelKeyboardProc(nCode: Integer;
    WParam: WPARAM;LParam: LPARAM):LRESULT; stdcall;
     procedure hookstar; //设置钩子
     procedure hookend;
    var
    hhkLowLevelKybd: HHOOK;
    implementation
    {
    功能:低级键盘钩子的回调函数,在里面过滤消息
    参数:nCode 是Hook的标志
    WParam 表示消息的类型
    LParam 是一个指向我们在上面定义的哪个结构KBDLLHOOKSTRUCT的指针
    返回值:如果不是0的话windows就把这个消息丢掉,程序就不会再收到这个消息了。
    }
    function LowLevelKeyboardProc(nCode: Integer;
    WParam: WPARAM;LParam: LPARAM):LRESULT; stdcall;
    var
    fEatKeystroke: BOOL;
    p: PKBDLLHOOKSTRUCT;
    begin
    Result := 0;
    fEatKeystroke := FALSE;
    p := PKBDLLHOOKSTRUCT (lParam);
    //nCode值为HC_ACTION时表示WParam和LParam参数包涵了按键消息
    if (nCode = HC_ACTION) then
    begin
    //拦截按键消息并测试是否是Ctrl+Esc、Alt+Tab、和Alt+Esc功能键。
    case wParam of
    WM_KEYDOWN,
    WM_SYSKEYDOWN,
    WM_KEYUP,
    WM_SYSKEYUP:
    fEatKeystroke :=
    ((p.vkCode = VK_TAB) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or // Alt+Tab
    ((p.vkCode = VK_ESCAPE) and ((p.flags and LLKHF_ALTDOWN) <> 0))or //
    (p.vkCode = VK_Lwin) or (p.vkCode = VK_Rwin)or (p.vkCode = VK_apps) or  //上面是屏蔽WIN按键
    //((p.vkCode = VK_CONTROL) and (P.vkCode = LLKHF_ALTDOWN) and (P.vkCode = VK_Delete)) or
    ((p.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000) <> 0))  or
    ((p.vkCode = VK_F4) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or
    ((p.vkCode = VK_SPACE) and ((p.flags and LLKHF_ALTDOWN) <> 0)) OR
    (((p.vkCode = VK_CONTROL) and (P.vkCode = LLKHF_ALTDOWN and p.flags) and (P.vkCode = VK_Delete))) //AND (p.flags = true) ;
    end;
    end;if fEatKeystroke = True then
    Result := 1;
    if nCode <> 0 then
    Result := CallNextHookEx(0, nCode, wParam, lParam);
    end;
    //----------------------回调函数结束-----------------------------------------procedure hookstar; //设置钩子
    begin
    //设置键盘钩子
    if hhkLowLevelKybd = 0 then
    begin
    hhkLowLevelKybd := SetWindowsHookExW(WH_KEYBOARD_LL,
                                           LowLevelKeyboardProc,
                                           Hinstance,
                                            0);
    if hhkLowLevelKybd <> 0 then
     //MessageBox(0, '键盘钩子设置成功!', '提示', MB_OK)
    else
      MessageBox(0, '键盘钩子设置失败!', '提示', MB_OK);
    end
    else
      //MessageBox(Handle, '键盘钩子已设置!', '提示', MB_OK);
    end;
    //---------------------设置钩子完成-----------------procedure hookend;//卸载键盘钩子
    begin
    if hhkLowLevelKybd <> 0 then
    if UnhookWindowsHookEx(hhkLowLevelKybd) <> False then
    begin
    //MessageBox(0, '系统热键恢复使用!', '提示', MB_OK);
    hhkLowLevelKybd := 0;
    end
    else
    //MessageBox(Handle, '键盘钩子卸载失败!', '提示', MB_OK)
    else
    //MessageBox(Handle, '没有发现键盘钩子!', '提示', MB_OK);
    end;
    //-------------卸载键盘钩子完成-------------------------end.//-------------------修改分辨率的问题--------------------
    function DynamicResolution(X, Y: word): BOOL;
    var
      lpDevMode: TDeviceMode;
    begin
      Result := EnumDisplaySettings(nil, 0, lpDevMode);
      if Result then
      begin
        lpDevMode.dmFields := DM_PELSWIDTH Or DM_PELSHEIGHT;
        lpDevMode.dmPelsWidth := X;
        lpDevMode.dmPelsHeight := Y;
        lpDevMode.dmDisplayFrequency := 75;//刷新率
         Result := ChangeDisplaySettings(lpDevMode, CDS_UPDATEREGISTRY) = DISP_CHANGE_SUCCESSFUL;
      //CDS_UPDATEREGISTRY  必须写,呵呵,要不就有你好看的(任务栏不变 )
      end;
      end;