科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网安全频道隐藏当前进程

隐藏当前进程

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

恢复当前窗口的程序,由于当前进程有可能在全屏模式下运行,所以需要通过指定特定的热键使程序窗口消失,且不出现在任务栏上。下面介绍如何用Delphi实现。

作者:巧巧读书 来源:巧巧读书 2008年9月2日

关键字: 进程 隐藏进程 系统进程 进程管理

  • 评论
  • 分享微博
  • 分享邮件

  恢复当前窗口的程序,由于当前进程有可能在全屏模式下运行,所以需要通过指定特定的热键使程序窗口消失,且不出现在任务栏上。下面介绍如何用Delphi实现。主要需要解决两个问题,即隐藏窗口和设定热键。

  一. 隐藏窗口

  通过API函数GETACTIVEWINDOW获取当前窗口;函数ShowWindow(HWND,nCmdShow)的参数nCmdShow取SW_HIDE时将之隐藏,取SW_SHOW时将之显示。例如:showwindow(getactivewindow,sw_hide)。隐藏好窗体后,须记住窗体句柄以便恢复。

  二. 键盘监控

  为了实现键盘监控须用到钩子。

  以下是程序的源文件:

  ---HKHide.pas---

  unit HKHide;

  interface

  uses

  Windows, Messages, sysutils;

  var

  hNextHookHide: HHook;

  HideSaveExit: Pointer;

  hbefore:longint;

  function KeyboardHookHandler(iCode: Integer;wParam: WPARAM;

  lParam: LPARAM): LRESULT; stdcall; export;

  function EnableHideHook: BOOL; export;

  function DisableHideHook: BOOL; export;

  procedure HideHookExit; far;

  implementation

  function KeyboardHookHandler(iCode: Integer;wParam: WPARAM;

  lParam: LPARAM): LRESULT; stdcall; export;

  const _KeyPressMask = $80000000;

  var

  f:textfile;

  temp:string;

  begin

  Result := 0;

  If iCode <0 Then

  begin

  Result := CallNextHookEx(hNextHookHide, iCode, wParam, lParam);

  Exit;

  end;

  // 侦测 Ctrl + Alt + F12 组合键

  if ((lParam and _KeyPressMask) = 0) //按下时生效

  and (GetKeyState(vk_Control) <0)

  and (getkeystate(vk_menu)<0) and (wParam = vk_F12) then

  begin

  Result := 1;

  //文件不存在则创建

  if not fileexists(c:\test.txt) then

  begin

  assignfile(f,c:\test.txt);

  rewrite(f);

  writeln(f,0);

  closefile(f);

  end

  else begin

  assignfile(f,c:\test.txt);

  reset(f);

  readln(f,temp);

  hbefore:=strtoint(temp);

  begin

  hbefore:=getactivewindow;

  temp:=inttostr(hbefore);

  rewrite(f);

  writeln(f,temp);

  closefile(f);

  ShowWindow(hbefore, SW_HIDE);

  end

  else begin

  showwindow(hbefore,sw_show);

  rewrite(f);

  writeln(f,0);

  closefile(f);

  end;

  end;

  end;

  end;

  function EnableHideHook: BOOL; export;

  begin

  Result := False;

  if hNextHookHide <>0 then Exit;

  // 挂上 WH_KEYBOARD 这型的 HOOK, 同时, 传回值必须保留下

  // 来, 免得 HOOK 呼叫链结断掉

  hNextHookHide := SetWindowsHookEx(WH_KEYBOARD,

  KeyboardHookHandler,HInstance,0);

  Result := hNextHookHide <>0;

  end;

  function DisableHideHook: BOOL; export;

  begin

  if hNextHookHide <>0 then

  begin

  Result:=True;

  UnhookWindowshookEx(hNextHookHide); // 解除 Keyboard Hook

  hNextHookHide:=0;

  end

  else

  Result:=False;

  end;

  procedure HideHookExit;

  begin

  // 如果忘了解除 HOOK, 自动代理解除的动作

  if hNextHookHide <>0 then DisableHideHook;

  ExitProc := HideSaveExit;

  end;

  end.

  ---HKPHide.dpr---

  library HKPHide;

  uses

  HKHide in HKHide.pas;

  exports

  EnableHideHook,

  DisableHideHook;

  begin

  hNextHookHide := 0;

  hbefore:=0;

  HideSaveExit := ExitProc;

  ExitProc := @HideHookExit;

  end.

  文件制作好后选Build All编译成HKPHide.dll。

  新建一个工程Project1

  ---Unit1.pas---

  unit Unit1;

  interface

  uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

  type

  TForm1 = class(TForm)

  Button1: TButton;

  Button2: TButton;

  procedure Button1Click(Sender: TObject);

  procedure Button2Click(Sender: TObject);

  private

  { Private declarations }

  public

  { Public declarations }

  end;

  var

  Form1: TForm1;

  implementation

  {$R *.DFM}

  function EnableHideHook: BOOL; external HKPHide.DLL;

  function DisableHideHook: BOOL; external HKPHide.DLL;

  procedure TForm1.Button1Click(Sender: TObject);

  begin

  if EnableHideHook then

  ShowMessage(HotKey Testing...);

  end;

  procedure TForm1.Button2Click(Sender: TObject);

  begin

  if DisableHideHook then

  ShowMessage(HotKey Testing..., DONE!!);

  end;

  end.

  运行程序按Button1后启动钩子,这时运行其他程序,按Ctrl+Alt+F12可将之隐藏,再按一下则恢复。以下程序在Delphi4下通过。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章