全屏程序的系统功能屏蔽处理

全屏程序的系统功能屏蔽处理

作者:彭学周(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;

关键函数:FindWindowGetWindowShowWindow

 

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

本文到此结束,有不足之处,希望各位高手指教,谢谢!

 

你可能感兴趣的:(全屏程序的系统功能屏蔽处理)