如题,就像小游戏或浏览器那样,按下快捷键(例如Alt+X)后,就隐藏了(在任务栏也看不到)
我在网上搜了一下,好像说是用到 键盘钩子,可是我对 Hook 完全不了解,上面的代码又实验不成功。请麻烦告诉我如何实现该功能(有越简单的方法越好)。
如果要用到Hook,麻烦给点代码(我确实找不到合适的代码,而Csdn的搜索功能近期又总是提示在维护)
我没有多少分数了,望谅解。谢谢!另外请问一下,可用分数得如何才会增长。
我在网上搜了一下,好像说是用到 键盘钩子,可是我对 Hook 完全不了解,上面的代码又实验不成功。请麻烦告诉我如何实现该功能(有越简单的方法越好)。
如果要用到Hook,麻烦给点代码(我确实找不到合适的代码,而Csdn的搜索功能近期又总是提示在维护)
我没有多少分数了,望谅解。谢谢!另外请问一下,可用分数得如何才会增长。
注: 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, 释放资源。
搜一下全局键盘钩子。
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.
一. 隐藏窗口
通过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可将之隐藏,再按一下则恢复。
先谢谢了!
begin
WinExec('calc', SW_SHOW);
ShowMessage('计算器打开');
ShowWindow(FindWindow(nil, '计算器'), SW_HIDE);
ShowMessage('计算器隐藏');
ShowWindow(FindWindow(nil, '计算器'), SW_SHOW);
end;
//因为我们还要在程序退出的时候,消除这个热键, 所以需要声明一个全局变量:
//
//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.
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.