隐藏当前进程

豆豆网   技术应用频道   2006年07月30日  【字号: 收藏本文

本文详细介绍隐藏当前进程

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

责编:豆豆技术应用

正在加载评论...