天天看点

新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

const _KeyPressMask = $80000000;

 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

  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

   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);

    writeln(f,0);

   end;

  end;

end;

 Result := False;

 if hNextHookHide <> 0 then Exit;

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

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

 hNextHookHide := SetWindowsHookEx(WH_KEYBOARD,

 KeyboardHookHandler,HInstance,0);

 Result := hNextHookHide <> 0;

 if hNextHookHide <> 0 then

  Result:=True;

  UnhookWindowshookEx(hNextHookHide); // 解除 Keyboard Hook

  hNextHookHide:=0;

 end

 else

  Result:=False;

procedure HideHookExit;

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

 if hNextHookHide <> 0 then DisableHideHook;

 ExitProc := HideSaveExit;

end.

---HKPHide.dpr---

library HKPHide;

 HKHide in HKHide.pas;

exports

 EnableHideHook,

 DisableHideHook;

 hNextHookHide := 0;

 hbefore:=0;

 HideSaveExit := ExitProc;

 ExitProc := @HideHookExit;

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

新建一个工程Project1

---Unit1.pas---

unit Unit1;

 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 }

 Form1: TForm1;

{$R *.DFM}

function EnableHideHook: BOOL; external HKPHide.DLL;

function DisableHideHook: BOOL; external HKPHide.DLL;

procedure TForm1.Button1Click(Sender: TObject);

 if EnableHideHook then

 ShowMessage(HotKey Testing...);

procedure TForm1.Button2Click(Sender: TObject);

 if DisableHideHook then

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

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