Implementation var Hwnd:THandle; Tmp:integer; procedure TForm1.Button1Click(Sender: TObject); begin Hwnd:=FindWindow('Shell_TrayWnd',nil); if Hwnd<>0 then ShowWindow(Hwnd,SW_HIDE); //隐藏任务栏 SystemParametersInfo(SPI_SCREENSAVERRUNNING,1,@Tmp,0); //屏蔽Ctrl+Alt+Del和Alt+Tab等系统热键 end;procedure TForm1.Button2Click(Sender: TObject); begin Hwnd:=FindWindow('Shell_TrayWnd',nil); ShowWindow(Hwnd,SW_SHOW); //恢复任务栏 SystemParametersInfo(SPI_SCREENSAVERRUNNING,0,@Tmp,0);//恢复系统热键 end;屏蔽Alt+F4 需要捕捉WM_SYSCOMMAND消息,然后作出判断。 procedure WMSysCommand(var Msg: TMessage); begin if Msg.wParam <> SC_CLOSE then inherited; end;
to extcsdn(Studing VB now) : 不能屏蔽 掉Ctrl+Alt+Del和win键
var
Hwnd:THandle;
Tmp:integer;
procedure TForm1.Button1Click(Sender: TObject);
begin
Hwnd:=FindWindow('Shell_TrayWnd',nil);
if Hwnd<>0 then ShowWindow(Hwnd,SW_HIDE); //隐藏任务栏
SystemParametersInfo(SPI_SCREENSAVERRUNNING,1,@Tmp,0); //屏蔽Ctrl+Alt+Del和Alt+Tab等系统热键
end;procedure TForm1.Button2Click(Sender: TObject);
begin
Hwnd:=FindWindow('Shell_TrayWnd',nil);
ShowWindow(Hwnd,SW_SHOW); //恢复任务栏
SystemParametersInfo(SPI_SCREENSAVERRUNNING,0,@Tmp,0);//恢复系统热键
end;屏蔽Alt+F4 需要捕捉WM_SYSCOMMAND消息,然后作出判断。
procedure WMSysCommand(var Msg: TMessage);
begin
if Msg.wParam <> SC_CLOSE then inherited;
end;
不能屏蔽
掉Ctrl+Alt+Del和win键
这只能在九八上用。
猛料上好像介绍的有。楼主找找.
信 誉 值: 100
所属论坛: Delphi Win32 SDK/API
问题点数: 100
回复次数: 20
发表时间: 2003-10-16 15:25:23
好不容易在网上查到了屏蔽2000下CAD键的方法,可惜是vc版的,本人费时1天编写sdk并在2003 d6下调试通过。
原理,替换系统GINA DLL中有关CAD的处理函数,其他不变,
vc sdk为winwlx.h
现免费发布,up,gz均给分,目的是提前帖子1、编辑动态链接库
library dWINWLX;uses
SysUtils,
Classes,
uMain in 'uMain.pas';{$R *.res}exports
WlxNegotiate,
WlxInitialize,
WlxDisplaySASNotice,
WlxLoggedOutSAS,
WlxActivateUserShell,
prcWlxLoggedOnSAS,
WlxLoggedOnSAS,
WlxDisplayLockedNotice,
WlxWkstaLockedSAS,
WlxIsLockOk,
WlxIsLogoffOk,
WlxLogoff,
WlxShutdown,
WlxScreenSaverNotify,
WlxStartApplication,
WlxNetworkProviderLoad;end.
-----------------------------------------
unit uMain;interface
uses
Windows, Messages, SysUtils, Variants, Classes;const
MSGINADLL='msgina.dll';const
WLX_VERSION_1_0 =$00010000;
WLX_VERSION_1_1 =$00010001;
WLX_CURRENT_VERSION =WLX_VERSION_1_1;
WLX_SAS_TYPE_TIMEOUT =0;
WLX_SAS_TYPE_CTRL_ALT_DEL =1;
WLX_SAS_TYPE_SCRNSVR_TIMEOUT =2;
WLX_SAS_TYPE_SCRNSVR_ACTIVITY =3;
WLX_SAS_TYPE_USER_LOGOFF =4;
WLX_SAS_TYPE_MAX_MSFT_VALUE =127;
WLX_LOGON_OPT_NO_PROFILE =$00000001;
WLX_LOGON_OPT_USE_GROUPPOLICY =$00000002;
WLX_PROFILE_TYPE_V1_0 =1;
WLX_PROFILE_TYPE_V2_0 =2;
WLX_SAS_ACTION_LOGON =1;
WLX_SAS_ACTION_NONE =2;
WLX_SAS_ACTION_LOCK_WKSTA =3;
WLX_SAS_ACTION_LOGOFF =4;
WLX_SAS_ACTION_SHUTDOWN =5;
WLX_SAS_ACTION_PWD_CHANGED =6;
WLX_SAS_ACTION_TASKLIST =7;
WLX_SAS_ACTION_UNLOCK_WKSTA =8;
WLX_SAS_ACTION_FORCE_LOGOFF =9;
WLX_SAS_ACTION_SHUTDOWN_POWER_OFF =10;
WLX_SAS_ACTION_SHUTDOWN_REBOOT =11;
WLX_SAS_ACTION_SHUTDOWN_SLEEP =12;
WLX_SAS_ACTION_SHUTDOWN_SLEEP2 =13;
WLX_SAS_ACTION_SHUTDOWN_HIBERNATE =14;
WLX_WM_SAS =WM_USER + 601;
WLX_DLG_SAS =101;
WLX_DLG_INPUT_TIMEOUT =102; // Input (keys, etc) timed out
WLX_DLG_SCREEN_SAVER_TIMEOUT =103; // Screen Saver activated
WLX_DLG_USER_LOGOFF =104; // User logged offtype
PVOID=Pointer;
PPVOID=^PVOID;
_LUID=packed record
LowPart:DWORD;
HighPart:int64;
end;
LUID=_LUID;
PLUID=^_LUID; _WLX_PROFILE_V1_0=packed record
dwType :DWORD;
pszProfile :PWord;
end;
WLX_PROFILE_V1_0 =_WLX_PROFILE_V1_0;
PWLX_PROFILE_V1_0 =^_WLX_PROFILE_V1_0; _WLX_PROFILE_V2_0 =packed record
dwType :DWORD;
pszProfile :PWord;
pszPolicy :PWord;
pszNetworkDefaultUserProfile :PWord;
pszServerName :PWord;
pszEnvironment :PWord;
end;
WLX_PROFILE_V2_0 =_WLX_PROFILE_V2_0;
PWLX_PROFILE_V2_0 =^_WLX_PROFILE_V2_0; _WLX_MPR_NOTIFY_INFO =packed record
pszUserName :PWord;
pszDomain :PWord;
pszPassword :PWord;
pszOldPassword :PWord;
END;
WLX_MPR_NOTIFY_INFO=_WLX_MPR_NOTIFY_INFO;
PWLX_MPR_NOTIFY_INFO=^_WLX_MPR_NOTIFY_INFO; function WlxNegotiate(dwWinlogonVersion:DWORD;pdwDllVersion:PDWORD):Longbool;stdcall; function WlxInitialize(
lpWinsta :PWORD;
hWlx :THandle;
pvReserved :PVOID;
pWinlogonFunctions:PVOID;
pWlxContext :PPVOID
):LongBool;stdcall; procedure WlxDisplaySASNotice(
pWlxContext:PVOID
);stdcall;
function WlxLoggedOutSAS(
pWlxContext:PVOID;
dwSasType:DWORD;
pAuthenticationId:PLUID;
pLogonSid:PVOID;
pdwOptions:PWORD;
phToken:PHandle;
pNprNotifyInfo:PWLX_MPR_NOTIFY_INFO;
pProfile:PPVOID
):Integer;stdcall; function WlxActivateUserShell(
pWlxContext:PVOID;
pszDesktopName:PWORD;
pszMprLogonScript:PWORD;
pEnvironment:PVOID
):LongBool;stdcall; function prcWlxLoggedOnSAS(
pWlxContext:PVOID;
dwSasType:DWORD;
pReserved:PVOID
):Integer; stdcall;
pWlxContext:PVOID;
dwSasType:DWORD;
pReserved:PVOID
):Integer; stdcall; procedure WlxDisplayLockedNotice(
pWlxContext:PVOID
);stdcall; function WlxWkstaLockedSAS(
pWlxContext:PVOID;
dwSasType:DWORD
):Integer;stdcall; function WlxIsLockOk(
pWlxContext:PVOID
):LongBool;stdcall; function WlxIsLogoffOk(
pWlxContext:PVOID
):LongBool;stdcall; procedure WlxLogoff(
pWlxContext:PVOID
);stdcall; procedure WlxShutdown(
pWlxContext:PVOID;
ShutdownType:DWORD
);stdcall
//
// NEW for version 1.1
//
function WlxScreenSaverNotify(
pWlxContext:PVOID;
pSecure:PBool):Bool;stdcall; function WlxStartApplication(
pWlxContext:PVOID;
pszDesktopName:PWORD;
pEnvironment:PVOID;
pszCmdLine:PWORD
):Bool;stdcall; function WlxNetworkProviderLoad(
pWlxContext:PVOID;
pNprNotifyInfo:PWLX_MPR_NOTIFY_INFO
):bool;stdcall; 回复人: micher_yan(小学没毕业) ( ) 信誉:100 2003-10-16 15:32:00 得分:0
////////////////////////////////////////////////////////////////////////
// //
// Services that Winlogon provides //
// //
////////////////////////////////////////////////////////////////////////
const
WLX_DESKTOP_NAME =$00000001; // Name present
WLX_DESKTOP_HANDLE =$00000002; // Handle present
type
_WLX_DESKTOP=packed record
Size:DWORD;
Flags:DWORD;
hDesktop:HDESK;
pszDesktopName:PWORD;
end;
DLGTEMPLATE=packed record
_Style:DWORD ;
dwExtendedStyle:DWORD ;
cdit:WORD ;
x:short ;
y:short ;
cx:short ;
cy:short ;
end;
LPCDLGTEMPLATE=^DLGTEMPLATE;
////
//typedef BOOL (CALLBACK* DLGPROC)(HWND, UINT, WPARAM, LPARAM);
DLGPROC=function(w1:HWND;w2:Longword;w3:wParam;w4:lParam):Bool;stdcall; WLX_DESKTOP=_WLX_DESKTOP;
PWLX_DESKTOP=^_WLX_DESKTOP;
PPWLX_DESKTOP=^PWLX_DESKTOP;
PWLX_USE_CTRL_ALT_DEL=procedure(hWlx:THandle);stdcall;
PWLX_SET_CONTEXT_POINTER=procedure(hWlx:THandle;pWlxContext:PVOID);stdcall;
PWLX_SAS_NOTIFY=procedure(hWlx:THandle;dwSasType:DWORD);stdcall;
PWLX_SET_TIMEOUT=function(hWlx:THandle;Timeout:DWORD):Bool;stdcall;
PWLX_ASSIGN_SHELL_PROTECTION=function(hWlx,hToken,hProcess,hThread:THandle):Integer;stdcall;
PWLX_MESSAGE_BOX=function(hWlx:THandle;hwndOwner:HWND;
lpszText,lpszTitle:LPWSTR;fuStyle:LongWord):Integer;Stdcall;
PWLX_DIALOG_BOX=function(hWlx,hInst:THandle;lpszTemplate:LPWSTR;
hwndOwner:HWND;dlgprc:DLGPROC):Integer;stdcall;
PWLX_DIALOG_BOX_INDIRECT=function(hWlx,hInst:THandle;hDialogTemplate:LPCDLGTEMPLATE;
hwndOwner:HWND;dlgprc:DLGPROC):Integer;stdcall; PWLX_DIALOG_BOX_PARAM=function(hWlx,hInst:THandle;lpszTemplate:LPWSTR;
hwndOwner:HWND;dlgprc:DLGPROC;dwInitParam:LPARAM):Integer;stdcall; PWLX_DIALOG_BOX_INDIRECT_PARAM=function(hWlx,hInst:THandle;
hDialogTemplate:LPCDLGTEMPLATE;hwndOwner:HWND;dlgprc:DLGPROC;
dwInitParam:LPARAM):Integer;stdcall; PWLX_SWITCH_DESKTOP_TO_USER=function(hWlx:THandle):Integer;stdcall;
PWLX_SWITCH_DESKTOP_TO_WINLOGON=function(hWlx:THandle):Integer;stdcall; PWLX_CHANGE_PASSWORD_NOTIFY=function(hWlx:THandle;pMprInfo:PWLX_MPR_NOTIFY_INFO;
dwChangeInfo:DWORD):Integer;stdcall; PWLX_GET_SOURCE_DESKTOP=function(hWlx:THandle;ppDesktop:PPWLX_DESKTOP):bool;stdcall; PWLX_SET_RETURN_DESKTOP=function(hWlx:THandle;pDesktop:PWLX_DESKTOP):Bool;stdcall;
PWLX_CREATE_USER_DESKTOP=function(hWlx,hToken:THandle;Flags:DWORD;
pszDesktopName:short;ppDesktop:PPWLX_DESKTOP):bool;stdcall;const
WLX_CREATE_INSTANCE_ONLY =$00000001;
WLX_CREATE_USER =$00000002;type
PWLX_CHANGE_PASSWORD_NOTIFY_EX=function(
hWlx:THandle;
pMprInfo:PWLX_MPR_NOTIFY_INFO;
dwChangeInfo:DWORD;
ProviderName:short;
Reserved:PVOID):Integer;stdcall;Top
回复人: micher_yan(小学没毕业) ( ) 信誉:100 2003-10-16 15:33:00 得分:0
////////////////////////////////////////////////////////////////////////
// //
// Function dispatch tables. //
// One of the following tables will be passed to the GINA DLL //
// in the WlxInitialize() call during initialization. //
// //
// NOTE: FOR THIS REVISION THERE IS ONLY ONE TABLE. DEVELOPERS //
// SHOULD EXPECT MORE IN FUTURE RELEASE. //
// //
//////////////////////////////////////////////////////////////////////////
// Dispatch table for version WLX_VERSION_1_0
// _WLX_DISPATCH_VERSION_1_0=packed record
WlxUseCtrlAltDel :PWLX_USE_CTRL_ALT_DEL ;
WlxSetContextPointer :PWLX_SET_CONTEXT_POINTER ;
WlxSasNotify :PWLX_SAS_NOTIFY ;
WlxSetTimeout :PWLX_SET_TIMEOUT ;
WlxAssignShellProtection :PWLX_ASSIGN_SHELL_PROTECTION ;
WlxMessageBox :PWLX_MESSAGE_BOX ;
WlxDialogBox :PWLX_DIALOG_BOX ;
WlxDialogBoxParam :PWLX_DIALOG_BOX_PARAM ;
WlxDialogBoxIndirect :PWLX_DIALOG_BOX_INDIRECT ;
WlxDialogBoxIndirectParam :PWLX_DIALOG_BOX_INDIRECT_PARAM ;
WlxSwitchDesktopToUser :PWLX_SWITCH_DESKTOP_TO_USER ;
WlxSwitchDesktopToWinlogon :PWLX_SWITCH_DESKTOP_TO_WINLOGON ;
WlxChangePasswordNotify :PWLX_CHANGE_PASSWORD_NOTIFY ;
end;
WLX_DISPATCH_VERSION_1_0=_WLX_DISPATCH_VERSION_1_0;
PWLX_DISPATCH_VERSION_1_0=^_WLX_DISPATCH_VERSION_1_0; _WLX_DISPATCH_VERSION_1_1=packed record
WlxUseCtrlAltDel :PWLX_USE_CTRL_ALT_DEL ;
WlxSetContextPointer :PWLX_SET_CONTEXT_POINTER ;
WlxSasNotify :PWLX_SAS_NOTIFY ;
WlxSetTimeout :PWLX_SET_TIMEOUT ;
WlxAssignShellProtection :PWLX_ASSIGN_SHELL_PROTECTION ;
WlxMessageBox :PWLX_MESSAGE_BOX ;
WlxDialogBox :PWLX_DIALOG_BOX ;
WlxDialogBoxParam :PWLX_DIALOG_BOX_PARAM ;
WlxDialogBoxIndirect :PWLX_DIALOG_BOX_INDIRECT ;
WlxDialogBoxIndirectParam :PWLX_DIALOG_BOX_INDIRECT_PARAM ;
WlxSwitchDesktopToUser :PWLX_SWITCH_DESKTOP_TO_USER ;
WlxSwitchDesktopToWinlogon :PWLX_SWITCH_DESKTOP_TO_WINLOGON ;
WlxChangePasswordNotify :PWLX_CHANGE_PASSWORD_NOTIFY ;
WlxGetSourceDesktop :PWLX_GET_SOURCE_DESKTOP ;
WlxSetReturnDesktop :PWLX_SET_RETURN_DESKTOP ;
WlxCreateUserDesktop :PWLX_CREATE_USER_DESKTOP ;
WlxChangePasswordNotifyEx :PWLX_CHANGE_PASSWORD_NOTIFY_EX ;
end;
WLX_DISPATCH_VERSION_1_1=_WLX_DISPATCH_VERSION_1_1;
PWLX_DISPATCH_VERSION_1_1=^_WLX_DISPATCH_VERSION_1_1;
function WlxNegotiate; external MSGINADLL name 'WlxNegotiate';
function WlxInitialize; external MSGINADLL name 'WlxInitialize';
procedure WlxDisplaySASNotice; external MSGINADLL name 'WlxDisplaySASNotice';
function WlxLoggedOutSAS; external MSGINADLL name 'WlxLoggedOutSAS';
function WlxActivateUserShell; external MSGINADLL name 'WlxActivateUserShell';
function prcWlxLoggedOnSAS; external MSGINADLL name 'WlxLoggedOnSAS';
function WlxLoggedOnSAS(pWlxContext:PVOID;dwSasType:DWORD;pReserved:PVOID
):Integer; stdcall;
var
hMutex: THandle;
begin
//WriteInfo("WlxLoggedOnSAS \r\n"); //用于记录信息
//屏蔽CTRL_ALT_DEL,也可以根据特定条件来决定是否要屏蔽
//我采用了Mutex来控制是否屏蔽,(注意:要用unicode) if dwSasType = WLX_SAS_TYPE_CTRL_ALT_DEL then
begin
hMutex := OpenMutex(MUTEX_ALL_ACCESS, FALSE, '_my_disable_CTRL_ALT_DEL');
if hMutex<>0 then
begin
CloseHandle(hMutex);
//WriteInfo("disble CTRL+ALT+DEL \r\n");
//Result:= WLX_SAS_ACTION_NONE; //将屏幕切换到应用程序桌面,屏蔽掉CTRL+ALT+DEL
Result:= 99;//99是非法返回值
end
else
Result:= prcWlxLoggedOnSAS ( //这是我从MSGINA.DLL中获取的函数。
pWlxContext,
dwSasType,
pReserved);
end else
begin
//WriteInfo("not disble CTRL+ALT+DEL \r\n");
Result:= prcWlxLoggedOnSAS ( //这是我从MSGINA.DLL中获取的函数。
pWlxContext,
dwSasType,
pReserved);
end;
end; procedure WlxDisplayLockedNotice; external MSGINADLL name 'WlxDisplayLockedNotice';
function WlxWkstaLockedSAS; external MSGINADLL name 'WlxWkstaLockedSAS';
function WlxIsLockOk; external MSGINADLL name 'WlxIsLockOk';
function WlxIsLogoffOk; external MSGINADLL name 'WlxIsLogoffOk';
procedure WlxLogoff; external MSGINADLL name 'WlxLogoff';
procedure WlxShutdown; external MSGINADLL name 'WlxShutdown';
function WlxScreenSaverNotify; external MSGINADLL name 'WlxScreenSaverNotify';
function WlxStartApplication; external MSGINADLL name 'WlxStartApplication';
function WlxNetworkProviderLoad; external MSGINADLL name 'WlxNetworkProviderLoad';end.
------------------------------
2、使用方法,
GINA DLL的安装:
键名 : \HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon
变量名 : GinaDLL
变量类型 : [REG_SZ]
内容 : "你的GINA DLL的名称" 如:"dWINWLX.DLL"
在任意以程序中创建mutex即可,如:
createMutex(nil,false,pchar('_my_disable_CTRL_ALT_DEL'));
3、存在问题:屏蔽热键之后按CAD键时屏幕有闪烁情况,如有解决的,还请发布,感激不尽:)Top
回复人: WWWWA(aaaa) ( ) 信誉:130 2003-10-16 15:34:00 得分:0
试试Top
回复人: Commander007(一招半式闯江湖) ( ) 信誉:100 2003-10-16 17:44:00 得分:0
强!收藏,学习ing.....Top
回复人: pankun(剑神一笑) ( ) 信誉:105 2003-10-16 17:47:00 得分:0
嗯,支持楼主的精神.Top
回复人: BearSinba(雨晴) ( ) 信誉:100 2003-10-16 17:48:00 得分:0
高。Top
回复人: pankun(剑神一笑) ( ) 信誉:105 2003-10-16 17:49:00 得分:0
对了,用拦载热键消息的办法可以做到无闪烁(按下CAD时会发送WM_HOTKEY到一个特定的系统窗口中的).这个办法比改GINA要好实现一些Top
回复人: hbqinlei(漫步者) ( ) 信誉:100 2003-10-16 18:21:00 得分:0
支持!
收藏,学习!Top
回复人: qufo(飞) ( ) 信誉:100 2003-10-16 19:47:00 得分:0
学习中。Top
回复人: Storm2008($$天冰$$) ( ) 信誉:103 2003-10-16 19:51:00 得分:0
高人!
学习Top
回复人: reallike(认真学习Cpp用Cpp考虑delphi) ( ) 信誉:102 2003-10-16 19:52:00 得分:0
E,是一种方法。试试看。Top
回复人: dickeybird888(于伟刚) ( ) 信誉:110 2003-10-16 19:53:00 得分:0
学习一下(·¥·)Top
回复人: reallike(认真学习Cpp用Cpp考虑delphi) ( ) 信誉:102 2003-10-16 20:00:00 得分:0
http://www.reallysoft.com.cn/software/dWINWLX.pas楼主,看看我这个文件有没有需要补充的?Top
回复人: pankun(剑神一笑) ( ) 信誉:105 2003-10-16 20:07:00 得分:0
呵呵,不错,我把这贴子放到专题去了,也希望其它朋友也能把自己的经验和技术写出来和大家共享.Top
回复人: 303(吴志坤) ( ) 信誉:88 2003-10-16 20:20:00 得分:0
好东西,谢谢楼主!!!!!!!!Top
回复人: hwyang80(Dwei) ( ) 信誉:98 2003-10-16 22:05:00 得分:0
谢谢楼主,接分!!!!Top
回复人: micher_yan(小学没毕业) ( ) 信誉:100 2003-10-17 10:54:00 得分:0
代码更正说明:
//我采用了Mutex来控制是否屏蔽,(注意:要用unicode) if dwSasType = WLX_SAS_TYPE_CTRL_ALT_DEL then
begin
hMutex := OpenMutex(MUTEX_ALL_ACCESS, FALSE, '_my_disable_CTRL_ALT_DEL');
if hMutex<>0 then
begin
CloseHandle(hMutex);
//WriteInfo("disble CTRL+ALT+DEL \r\n");
Result:= WLX_SAS_ACTION_NONE; //将屏幕切换到应用程序桌面,屏蔽掉CTRL+ALT+DEL
//Result:= 99;//99是非法返回值请注意后三行!!!
我在测试通过以后,发现闪屏,因此想测试返回一个非法值会有什么结果,忘了改回来就直接发布了,请大家注意!sorry
这个错误我是看了reallike(认真学习Cpp用Cpp考虑delphi) 的文件才发现的。感谢reallike(认真学习Cpp用Cpp考虑delphi)Top
回复人: micher_yan(小学没毕业) ( ) 信誉:100 2003-10-17 10:58:00 得分:0
pankun(剑神一笑) :要是方便请把你实现拦截CAD的方法贴出,共同学习嘛,我用过使用键盘钩子拦截除了CAD以外的任何系统热键,但您说的“按下CAD时会发送WM_HOTKEY到一个特定的系统窗口中的”还请详细提示
Top
回复人: reallike(认真学习Cpp用Cpp考虑delphi) ( ) 信誉:102 2003-10-17 11:02:00 得分:0
嗬嗬,没啥。发布东西最好找个地方弄成文件包再给大家。贴上来断断续续的。不太理解的人会搞混乱。Top
回复人: bat800(傻瓜明) ( ) 信誉:100 2003-10-17 11:07:00 得分:0
学习