如题,就像小游戏或浏览器那样,按下快捷键(例如Alt+X)后,就隐藏了(在任务栏也看不到)
我在网上搜了一下,好像说是用到 键盘钩子,可是我对 Hook 完全不了解,上面的代码又实验不成功。请麻烦告诉我如何实现该功能(有越简单的方法越好)。
如果要用到Hook,麻烦给点代码(我确实找不到合适的代码,而Csdn的搜索功能近期又总是提示在维护)
我没有多少分数了,望谅解。谢谢!另外请问一下,可用分数得如何才会增长。

解决方案 »

  1.   

    因为我们还要在程序退出的时候,消除这个热键, 所以需要声明一个全局变量: HotKeyId: Integer;   第一步: 在窗口的create事件中,加入以下代码 HotKeyId := GlobalAddAtom(‘MyHotKey’) - $C000;
    注: HotKeyId的合法取之范围是0x0000到0xBFFF之间, GlobalAddAtom函数得到的值
    在0xC000到0xFFFF之间,所以减掉0xC000来满足调用要求。第二步: 在上面的代码下面加入: RegisterHotKey(Handle, hotkeyid, MOD_ALT, VK_F8);  热键的辅助按键包括Mod_Ctrl 、Mod_Alt、Mod_Shift,对于Windows兼容键盘还支持Windows
    键,即其键面上有Windows标志的那个键,其值为Mod_win。上面 的代码注册了一个热键:ALT+F8。当然如果你希望象TAKEIT那样,只用F8, 就这么写:RegisterHotKey(Handle, hotkeyid, 0, VK_F8);  注:handle是一个特殊的变量,它表示当前窗口的句柄。这个函数你应该能句举一反三了吧。原理:一旦热键设置成功,在程序应用过程中如果有相应的键被按下,Windows系统都会给你的应
    用程序发送一个消息WM_HOTKEY,不管你的应用程序是否为当前活动的。其中WM_HOTKEY消
    息的格式为:  idHotKey = (int) wParam; // 该参数在设置系统级的热键有用,一般不予使用
    fuModifiers = (UINT) LOWORD(lParam);  //热键的辅助按键
    uVirtKey = (UINT) HIWORD(lParam); //热键的键值 第三步: 注册了热键,就该写下响应代码了。 首先,在程序头部分的private段中加入声明 (作用是声明这个过程,和声明变量类似。
    关于如何声明函数、过程,请请参考各自的帮助文件或其它资料): procedure HotKeyDown(var Msg: Tmessage); message WM_HOTKEY; 然后在程序中加入如下代码: procedure Tfmain.HotKeyDown(var Msg: Tmessage); 
    begin 
      if (Msg.LparamLo = MOD_ALT) AND Msg.LParamHi = VK_F8 then // 假设热键为ALT+F8 
      begin 
      end;
    end; 最后一步: 在窗口的close事件中加入 UnRegisterHotKey(handle, HotKeyId); //注销HotKey, 释放资源。
      

  2.   

    这个叫热键HOOK,hook 的一种。
    搜一下全局键盘钩子。
      

  3.   

    请教cuilj(一云忆水) ,我对您的代码看不太明白,不知怎用~unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
       procedure HotKeyDown(var Msg: Tmessage); message WM_HOTKEY; 
        { Private declarations }
      public
        { Public declarations }  end;var
      Form1: TForm1;
      HotKeyId: Integer; 
    implementation
    {$R *.dfm}procedure Tform1.HotKeyDown(var Msg: Tmessage); 
    begin
      if (Msg.LparamLo=MOD_ALT) AND (Msg.LParamHi=VK_F8) then // 假设热键为ALT+F8 
      begin
      showmessage('test');
      end;
    end; procedure TForm1.FormCreate(Sender: TObject);
    begin
    HotKeyId := GlobalAddAtom('MyHotKey')-$C000;
    RegisterHotKey(GETACTIVEWINDOW, hotkeyid, MOD_ALT, VK_F8); 
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    UnRegisterHotKey(GETACTIVEWINDOW,HotKeyId);
    end;end.
      

  4.   

    下面是我在网上搜到的一篇进行 快捷键 显示和隐藏程序,但总是调试失败由于当前进程有可能在全屏模式下运行,所以需要通过指定特定的热键使程序窗口消失,且不出现在任务栏上。下面介绍如何用Delphi实现。主要需要解决两个问题,即隐藏窗口和设定热键。
    一. 隐藏窗口
      通过API函数GETACTIVEWINDOW获取当前窗口;函数ShowWindow(HWND,nCmdShow)的参数nCmdShow取
    SW_HIDE时将之隐藏,取SW_SHOW时将之显示。例如:showwindow(getactivewindow,sw_hide)。
    隐藏好窗体后,须记住窗体句柄以便恢复。
    二. 键盘监控
      为了实现键盘监控须用到钩子。以下是程序的源文件:
    ---HKHide.pas---
    unit HKHide;interfaceuses
     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;implementationfunction 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;interfaceuses
     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可将之隐藏,再按一下则恢复。
     
      

  5.   

    请哪位给个完整的DLL代码(好像Hook的代码要写到DLL中才能全局使用吧)以及如何使用。
    先谢谢了!
      

  6.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      WinExec('calc', SW_SHOW);
      ShowMessage('计算器打开');
      ShowWindow(FindWindow(nil, '计算器'), SW_HIDE);
      ShowMessage('计算器隐藏');
      ShowWindow(FindWindow(nil, '计算器'), SW_SHOW);
    end;
      

  7.   

    //
    //因为我们还要在程序退出的时候,消除这个热键, 所以需要声明一个全局变量: 
    //
    //HotKeyId: Integer; 
    //
    //  
    //
    //第一步: 
    //
    //在窗口的create事件中,加入以下代码 
    //
    //HotKeyId := GlobalAddAtom(‘MyHotKey’) - $C000;
    //注: HotKeyId的合法取之范围是0x0000到0xBFFF之间, GlobalAddAtom函数得到的值
    //在0xC000到0xFFFF之间,所以减掉0xC000来满足调用要求。
    //
    //第二步: 
    //
    //在上面的代码下面加入: 
    //
    //RegisterHotKey(Handle, hotkeyid, MOD_ALT, VK_F8);  
    //
    //热键的辅助按键包括Mod_Ctrl 、Mod_Alt、Mod_Shift,对于Windows兼容键盘还支持Windows
    //键,即其键面上有Windows标志的那个键,其值为Mod_win。
    //
    //上面 的代码注册了一个热键:ALT+F8。当然如果你希望象TAKEIT那样,只用F8, 就这么写:
    //
    //RegisterHotKey(Handle, hotkeyid, 0, VK_F8);  
    //
    //注:handle是一个特殊的变量,它表示当前窗口的句柄。
    //
    //这个函数你应该能句举一反三了吧。
    //
    //原理:
    //
    //一旦热键设置成功,在程序应用过程中如果有相应的键被按下,Windows系统都会给你的应
    //用程序发送一个消息WM_HOTKEY,不管你的应用程序是否为当前活动的。其中WM_HOTKEY消
    //息的格式为:  
    //
    //idHotKey = (int) wParam; // 该参数在设置系统级的热键有用,一般不予使用
    //fuModifiers = (UINT) LOWORD(lParam);  //热键的辅助按键
    //uVirtKey = (UINT) HIWORD(lParam); //热键的键值 
    //
    //第三步: 
    //
    //注册了热键,就该写下响应代码了。 
    //
    //首先,在程序头部分的private段中加入声明 (作用是声明这个过程,和声明变量类似。
    //关于如何声明函数、过程,请请参考各自的帮助文件或其它资料): 
    //
    //procedure HotKeyDown(var Msg: Tmessage); message WM_HOTKEY; 
    //
    //然后在程序中加入如下代码: 
    //
    //procedure Tfmain.HotKeyDown(var Msg: Tmessage); 
    //begin 
    //  if (Msg.LparamLo = MOD_ALT) AND Msg.LParamHi = VK_F8 then // 假设热键为ALT+F8 
    //  begin 
    //  end;
    //end; 
    //
    //最后一步: 
    //
    //在窗口的close事件中加入 
    //
    //UnRegisterHotKey(handle, HotKeyId); //注销HotKey, 释放资源。
    //
    unit Main;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Label1: TLabel;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        FHotKeyId: Integer;
        procedure HotKeyDown(var Msg: Tmessage); message WM_HOTKEY; 
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      FHotKeyId := GlobalAddAtom('MyHotKey') - $C000;
      RegisterHotKey(Handle, FHotKeyId, MOD_ALT, VK_F8);
    end;procedure TForm1.HotKeyDown(var Msg: Tmessage);
    begin
      if (Msg.LparamLo = MOD_ALT) AND (Msg.LParamHi = VK_F8) then // 假设热键为ALT+F8 
      begin
        ShowWindow(Application.Handle, SW_SHOW);
        ShowWindow(Self.Handle, SW_SHOW);
        if IsIconic(Application.Handle) then
          ShowWindow(Application.Handle, SW_RESTORE)
        else
          SetForegroundWindow(Application.Handle);
      end;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      UnRegisterHotKey(Handle, FHotKeyId);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowWindow(Application.Handle, SW_HIDE);
      ShowWindow(Self.Handle, SW_HIDE);
    end;end.
      

  8.   

    我只是实现了 cuilj(一云忆水 的方法!
      

  9.   

    不用hook,注册热键就可以了。参考http://community.csdn.net/Expert/topic/4293/4293497.xml?temp=6.390017E-02unit UHotKey;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,MMSystem;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
        //处理 WM_HOTKEY 事件
        procedure WmHotKey(var msg:TMessage); message WM_HOTKEY;
      public
        { Public declarations }
      end;var
      Form1: TForm1;const
      ALT_CTRL_L  :Integer =$0002;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      //使用前必须先注册热键
      if not RegisterHotKey(Self.Handle,ALT_CTRL_L,MOD_ALT or MOD_CONTROL,$4c) then
      MessageDlg('注册热键失败',mtError,[mbOk],0);
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      //退出时撤销已经注册的热键
      if not UnRegisterHotKey(Self.Handle,ALT_CTRL_L) then
      MessageDlg('撤销热键失败',mtError,[mbOk],0);
    end;procedure TForm1.WmHotKey(var msg: TMessage);
    begin
      if msg.WParam = ALT_CTRL_L then showmessage('asdf');
    end;end.