您现在的位置:首页 >> 硬件系统 >> 硬件系统 >> 内容

在Delphi中隐藏程序进程的方法[1]最简洁的方法

时间:2011/9/3 15:20:47 点击:

  核心提示:主要需要解决两个问题,即隐藏窗口和设定热键。一. 隐藏窗口 通过API函数GETACTIVEWINDOW获取当前窗口;函数ShowWindow(HWND,nCmdShow)的参数nCmdShow取SW...

主要需要解决两个问题,即隐藏窗口和设定热键。
一. 隐藏窗口
     通过API函数GETACTIVEWINDOW获取当前窗口;函数ShowWindow(HWND,nCmdShow)的参数nCmdShow取SW_HIDE时将之隐藏,取SW_SHOW时将之显示。例如:showwindow(getactivewindow,sw_hide)。隐藏好窗体后,须记住窗体句柄以便恢复。
二. 键盘监控
     为了实现键盘监控须用到钩子。

以下是程序的源文件:

一、创建一个动态链接库
unit HKHide; //链接库中的Unit文件

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;
     end; //end if FileExists(....)
   end
   else begin
     showwindow(hbefore,SW_SHOW);
     rewrite(f);
     writeln(f,0);
     closefile(f);
   end;//end if Ctrl+Alt+F12按键
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.

library HKPHide; //动态链接库工程文件

uses
   HKHide in HKHide.pas;

exports
   EnableHideHook,
   DisableHideHook;

begin
   hNextHookHide := 0;
   hbefore:=0;
   HideSaveExit := ExitProc;
   ExitProc := @HideHookExit;
end.

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

二、新建一个测试工程TestPrj
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.

作者:网络 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 盒子文章(www.2ccc.com) © 2022 版权所有 All Rights Reserved.
  • 沪ICP备05001939号