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可将之隐藏,再按一下则恢复。以下程序在Delphi 4下通过。

相关阅读 >>

Delphi simple resource api replacement

Delphi 闪盘小偷

Delphi开发桌面图标列表查看程序

Delphi webbrowser1 querystatuswb

Delphi整理四(程序控制结构)

Delphi android实例-红外线操作(xe10.2+小米5)

Delphi settextbuf

Delphi 监控其它进程

Delphi求数组最大\最小值

Delphi unidac 连接mdb access 数据库

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...