如何用VB实现隐藏程序窗口?
换而言之就是把这个Delphi改写成VB。unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, jpeg, ShellApi;type
  TForm1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
    {热键标识ID}
     id1,id2,id3,ID4: Integer;
     aboutme:string;     {保存窗体句柄}
     savehwnd:hwnd;
     windowhwnd:array[0..50] of hwnd;
     windowhwndnum:integer;
     taf:bool;     procedure WMHotKey(var Msg : TWMHotKey); message WM_HOTKEY;
     procedure revisewindow;
     procedure hidewindow;
     procedure showwindow;
     procedure hidewindowx;
     procedure showwindowx;
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementationconst RSP_SIMPLE_SERVICE=1; 
function RegisterServiceProcess (dwProcessID, dwType: DWord) : DWord; stdcall; external 'KERNEL32.DLL'; {$R *.DFM}//获取当前激活窗体的标题文字---开始
function fwindows:string;
var hw:hwnd;
    buffer:array [0..1000] of char;begin
hw:=GetForegroundwindow;
GetWindowText(hw,buffer,1000);
result:=buffer;
end;
//获取当前激活窗体的标题文字---结束
{捕获热键消息} 
procedure TForm1.WMHotKey (var Msg : TWMHotKey); 
begin
if msg.HotKey = id1 then
   if taf then
   begin
   hidewindow;
   taf:=false;
   end;IF msg.hotkey = id2 then
   if not taf then
   begin
   showwindow;
   taf:=true;
   end;
IF msg.hotkey = id3 then
MESSAGEBOX(FORM1.HANDLE,pchar(ABOUTME),'关于... ...',MB_OK);
//showmessage(aboutme);//IF msg.hotkey = id4 then
//SHOWwindowX;form1.Visible :=true;
end;//改变窗体风格---开始
procedure tform1.revisewindow;
var hw:hwnd;
begin
hw:=GetForegroundwindow;
//setwindowpos(hw,hwnd_topmost,0,0,800,600,swp_drawframe);
enddeferwindowpos(deferwindowpos(begindeferwindowpos(1),hw,hwnd_top,0,0,800,600,SWP_DRAWFRAME));
end;
//改变窗体风格---结束
//隐藏窗体---开始
procedure tform1.hidewindow;
var hw:hwnd;
begin
hw:=GetForegroundwindow;
savehwnd:=hw;
setwindowpos(hw,hwnd_top,0,0,800,600,SWP_HIDEWINDOW OR SWP_NOMOVE OR SWP_NOSIZE OR SWP_NOZORDER);
//enddeferwindowpos(deferwindowpos(begindeferwindowpos(1),hw,hwnd_top,0,0,800,600,SWP_hidewindow));
end;
//隐藏窗体---结束
//显示窗体---开始
procedure tform1.showwindow;
var hw:hwnd;
begin
hw:=savehwnd;
setwindowpos(hw,hwnd_top,0,0,800,600,SWP_SHOWWINDOW OR SWP_NOMOVE OR SWP_NOSIZE OR SWP_NOOWNERZORDER);
SetForegroundWindow(hw);
//enddeferwindowpos(deferwindowpos(begindeferwindowpos(1),hw,hwnd_top,0,0,500,500,SWP_SHOWWINDOW));
end;
//显示窗体---结束
//隐藏窗体(群)---开始
procedure tform1.hidewindowX;
var i:integer;
    hw,thw:hwnd;
    wintext:array[0..1000] of char;
begin
windowhwndnum:=0;
hw:=GetForegroundwindow;
thw:=getdesktopwindow;
while hw<>thw do
      begin
      setwindowpos(hw,hwnd_topmost,0,0,800,600,SWP_HIDEWINDOW OR SWP_NOMOVE OR SWP_NOSIZE OR SWP_NOZORDER);
      //enddeferwindowpos(deferwindowpos(begindeferwindowpos(1),hw,hwnd_top,0,0,800,600,SWP_hidewindow));
      sleep(300);
      windowhwnd[windowhwndnum]:=hw;
      windowhwndnum:=windowhwndnum+1;
      hw:=GetForegroundwindow;
      end;end;
//隐藏窗体(群)---结束
//显示窗体(群)---开始
procedure tform1.SHOWwindowX;
var hw,thw:hwnd;
    wintext:array[0..1000] of char;
    i:integer;
begin
for i:=0 to windowhwndnum do
setwindowpos(windowhwnd,hwnd_topmost,0,0,800,600,SWP_SHOWWINDOW OR SWP_NOMOVE OR SWP_NOSIZE OR SWP_NOZORDER);
//enddeferwindowpos(deferwindowpos(begindeferwindowpos(1),hw,hwnd_top,0,0,800,600,SWP_SHOWwindow));end;
//显示窗体(群)---结束
procedure TForm1.FormCreate(Sender: TObject);
Const 
{ALT、CTRL和R键的虚拟键值} 
MOD_ALT = 1; 
MOD_CONTROL = 2;VK_R = 82;
VK_C = 67;
VK_A = 65;
VK_H = 72;
VK_S = 83;
VK_P = 80;beginaboutme:='软件名称:窗明几净'+#13+
         '软件作者:普小红(Pch)'+#13+
         '软件版本:20040816'+#13+
         '软件类型:免费使用'+#13+
         '使用说明:软件使用非常简单:'+#13+
         '          Alt + H   隐藏当前窗体'+#13+
         '          Alt + S   显示被隐藏窗体'+#13+#13+
         '          公司领导决心整顿劳动纪律,禁止使用一切聊天工具。'+#13+
         '          当发现老板来巡视,您是否扔了键盘以瞬间速度关机?'+#13+
         '          家长不允许你去玩游戏,你只有挺而走险,小心翼翼!'+#13+
         '          偷偷的玩还被他们发现,你是否有毁灭计算机的冲动。'+#13+
         '          道高一尺  魔高一丈,使用本软件给你解除后顾之忧。'+#13+#13+#13+
         '联系方式:E-mail:   [email protected]'+#13+
         '          WEB:      Www.Chonps.Com';{首先判断程序是否已经运行} 
if  GlobalFindAtom('MyHotkeyID1') = 0 then
begin
{注册全局热键Ctrl + Alt + R}
id1:=GlobalAddAtom('MyHotkeyID1');
RegisterHotKey(handle,id1,MOD_Alt,VK_H);
id2:=GlobalAddAtom('MyHotkeyID2');
RegisterHotKey(handle,id2,MOD_Alt,VK_S);
id3:=GlobalAddAtom('MyHotkeyID3');
RegisterHotKey(handle,id3,MOD_CONTROL+MOD_Alt,VK_P);
//id4:=GlobalAddAtom('MyHotkeyID4');
//RegisterHotKey(handle,id4,MOD_Alt,VK_S);
endelse
halt;setwindowlong(application.handle,gwl_exstyle,ws_ex_toolwindow);
taf:=true;
Timer1.Enabled:=true;end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnRegisterHotKey(handle,id1);
GlobalDeleteAtom(id1);
UnRegisterHotKey(handle,id2);
GlobalDeleteAtom(id2);
UnRegisterHotKey(handle,id3);
GlobalDeleteAtom(id3);
UnRegisterHotKey(handle,id4);
GlobalDeleteAtom(id4);
end;procedure TForm1.Button1Click(Sender: TObject);
begin
hidewindowX;
end;procedure TForm1.Timer1Timer(Sender: TObject);
begin
//showmessage(aboutme);
setwindowpos(handle,hwnd_topmost,0,0,800,600,SWP_HIDEWINDOW OR SWP_NOMOVE OR SWP_NOSIZE);
Timer1.Enabled:=false;
end;end.

解决方案 »

  1.   

    还是2问题啊.热键和隐藏程序的问题隐藏程序:
    Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
    用这个函数
    热键
    http://www.sijiqing.com/vbgood/experience/index.asp?action=read&id=2471
      

  2.   

    热键不是问题!就是Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long这个ShowWindow 怎么用?具体对那个Windows操作怎么定义?是不是还要Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
    Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    配合来做?
      

  3.   

    Delphi程序引的API声明都写在了哪里??为什么和VB差异的那么多???
      

  4.   

    先用FindWindow查找指定的窗口,获得句柄,再调用ShowWindow 来隐藏
    ShowWindow 句柄,0-----隐藏
    ShowWindow 句柄,1-----显示
      

  5.   

    Delphi程序不需要特殊声明,所谓"声明",的确是声明了
    在:
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ExtCtrls, jpeg, ShellApi;这里,类似类
      

  6.   

    只能用FindWindow么?如果系统当前开了一个程序,程序的窗体的标题是 App1 ,还开了一个文件夹, 文件夹的名字也是App1,这样的话 FindWindow 返回的就不一定是我想要得那个句柄,Delphi这个程序好像是 你指上谁 就能把你 隐藏了~
      

  7.   

    GetForegroundwindow可以获得前台窗体的句柄,如果想要你指上谁就隐藏谁,你用这个:Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
    获得鼠标下的窗口句柄,参数是x坐标,y坐标