需要在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); 此外,还有几个函数是用来检查当前禁用了哪些东西,甚至可以在用户按下禁用键时发出蜂鸣声!
那位仁兄帮着改写成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); 此外,还有几个函数是用来检查当前禁用了哪些东西,甚至可以在用户按下禁用键时发出蜂鸣声!
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.
是在2000/XP 下。也不想换Gina,谢谢
可以搜索到delphi的啊。
[email protected]
{
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 'KERNEL32.DLL';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('By izzet uslu - 2000'#13#13'E-Mail : [email protected]'#13'WEB : http://members.xoom.com/izus','HideShow component version 1.0', MB_OK+ MB_ICONINFORMATION);
end;function TAboutProperty.GetAttributes: TPropertyAttributes;
begin
GetAttributes:=[paDialog, paReadOnly];
end;function TAboutProperty.GetValue: string;
begin
GetValue:='(About)';
end;
procedure Register;
begin
RegisterComponents('izus', [THideShowApp]);
RegisterPropertyEditor(TypeInfo(TAboutProperty), THideShowApp, 'ABOUT', TAboutProperty);
end;end.
//屏蔽 Alt-Tab
SystemParametersInfo( SPI_SETFASTTASKSWITCH, i, @temp, 0);
//屏蔽Ctrl+Alt+Del
SystemParametersInfo(Spi_screensaverrunning,i,@temp,0);Win98 系统下可以使用,但是Win2000好像是不好用。
//屏蔽 Alt-Tab
SystemParametersInfo( SPI_SETFASTTASKSWITCH, i, @temp, 0);
//屏蔽Ctrl+Alt+Del
SystemParametersInfo(Spi_screensaverrunning,i,@temp,0);
这两个函数,只能在Win9x下使用,NT/2000不能用。如果有答案,麻烦通知我一下,难兄难弟。[email protected]
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;