注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

BCB-DG's Blog

...

 
 
 

日志

 
 

Delphi隐藏当前进程  

2008-01-08 09:06:02|  分类: Delphi |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

//作者:dareny  2007-12-02 10:12

http://hi.baidu.com/dareny/blog/item/9b1d4cd35c3f65033af3cfba.html

主要需要解决两个问题,即隐藏窗口和设定热键。
一. 隐藏窗口
  通过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下通过

  评论这张
 
阅读(1101)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017