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 twebbrowser打开paypal出错

Delphi unidac 连接mdb access 数据库

Delphi tms web core 从js调用pascal函数

Delphi tstringlist的用法

Delphi tnotification android通知

Delphi 泛型数组 strsplit 字符串分割

Delphi listview1 加载文件列表用法

Delphi 字符串定界符

Delphi获取本地全部盘符并存如combobox1

cnwizards cnpack ide 专家包

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



打赏

取消

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

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

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

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

评论

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