全屏程序的系统功能屏蔽处理
作者:彭学周(Favory.Peng)
我们在编写全屏应用程序时有时不希望受到一些系统功能的影响,例如:左右的“WIN键”,“Ctrl+ESC”,“Atl+F 4 ” ,任务栏,桌面菜单以及桌面右键菜单等等;因此我们需要通过代码屏蔽这些功能;
本文代码编辑环境: Delphi 7.0
所涉及到的技术:键盘HOOK,系统窗口查找与隐藏,消息过滤
1、屏蔽和开启任务栏和系统桌面以及桌面右键菜单
procedure ShowTrayBarAndDesktop(const YesNo:boolean);
var
h,wndHandle:THandle;
OldValue:Longbool;
begin
h:=FindWindow('ProgMan',nil);
h:=GetWindow(h,GW_CHILD);
wndHandle:=FindWindow('Shell_TrayWnd',nil);
if (YesNo=True) then
begin //显示
ShowWindow(h,SW_SHOW);
ShowWindow(wndHandle,SW_SHOW);
SystemParametersInfo(Spi_screensaverrunning,0,@OldValue,0); //开启按键
end
else begin //隐藏
ShowWindow(h,SW_HIDE);
ShowWindow(wndHandle,SW_HIDE);
SystemParametersInfo(Spi_screensaverrunning,1,@OldValue,0); //屏蔽按键
end;
end;
关键函数:FindWindow,GetWindow,ShowWindow。
2、屏蔽按键“Atl+F 4 ” ,此处可以不必使用HOOK技术,直接过滤消息就可以实现
编写消息响应函数相同参数的过程:
procedure Tinitializing.AppMessage(var Msg:TMsg;var Handled:Boolean);
begin
Handled:=False;
case Msg.message of
WM_SYSKEYDOWN:
if (Msg.wParam=VK_F4) then
Handled:=True;
end;
end;
在窗口创建事件中加入:
Application.OnMessage:=AppMessage;
3、屏蔽“WIN键”,“Ctrl+ESC”,“ALT+TAB”系统功能按钮,利用键盘HOOK处理
定义数据结构:
type
PKBDLLHOOKSTRUCT = ^TKBDLLHOOKSTRUCT;
TKBDLLHOOKSTRUCT = record
vkCode,
scanCode,
flags,
time: DWORD;
dwExtraInfo: Pointer;
end;
const
WH_KEYBOARD_ll = 13;
定义键盘HOOK处理函数:
function LowLevelKeyBoardPro(nCode:integer;WParam:WPARAM;LParam:LPARAM):LRESULT;stdcall;
var
fEatKeystroke:BOOL;
p:PKBDLLHOOKSTRUCT;
begin
Result:=0;
fEatKeystroke := False;
p:=PKBDLLHOOKSTRUCT(LParam);
if (nCode=HC_ACTION) then
begin
case wparam of
WM_KEYDOWN,
WM_SYSKEYDOWN,
WM_KEYUP,
WM_SYSKEYUP: featkeystroke:=(p.vkcode=VK_Lwin)or(p.vkcode=VK_Rwin)or(p.vkcode=VK_apps)or(p.vkcode=VK_ESCAPE)or(p.vkcode=VK_TAB);
end;
end;
if featkeystroke=true then
result:=1;
if ncode <>0 then
result := callnexthookex(0,ncode,wparam,lparam);
end;
在窗口创建事件中加入:
var
hhklowlevelkybd:HHOOK;
begin
hhklowlevelkybd := SetWindowsHookEx(WH_KEYBOARD_ll,LowLevelKeyBoardPro,HInstance,0);
end;
4、让程序随Windows系统启动
Uses 中加入: Registry;
在窗口创建事件中加入:
var
reg:TRegistry;
begin
reg := TRegistry.Create;
try
reg.RootKey := HKEY_LOCAL_MACHINE;
if reg.OpenKey('/Software/Microsoft/Windows/CurrentVersion/Run',False) then
begin
reg.WriteString('FavoryAPP','"' + ParamStr(0) + '"');
reg.CloseKey;
end;
finally
reg.Free;
end;
end;
对于全屏程序的系统功能屏蔽我就提出这几点,希望对大家有所帮助!同时也希望大家能积极补充!与大家分享你的经验!
//=================================================
作者:Favory.Peng(彭学周) 2008-10-09
本文到此结束,有不足之处,希望各位高手指教,谢谢!