老板键 悄然隐藏窗口

技术与开发

当老板路过你的电脑旁,不想暴露某些东东的时候,例如在开心农场中偷菜、偷玩一下网游、看看股票信息等,你会怎么做呢?快速切换窗口,这个时候老板键就派上用场了,不过你知道老板键是怎么开发的吗?想不想在自己的程序中也加入该功能?

很早以前我就知道老板键这个东东,但一直没有接触过,最近被朋友拉去玩某款网游,于是就下载使用了此类软件。由于职业习惯——我也是搞程序设计的,空闲的时候就研究了一下老板键的原理,感觉和Vagaa下载软件的隐藏窗口的原理是一样的。

设计老板键,有两个关键技术点:获取窗口类名和使用键盘钩子。查看程序窗口的类名,可以使用《窗口类名查看器》,我尝试了一下,软件无法在游戏启动时就自动获取类名,后来用编程语言代替了。大多数高级语言都有获取类名的函数,我是用Delphi语言来设计的(老板键下载地址:http://www.shudoo.com/bzsoft)。

使用老板键快速隐藏/显示游戏窗口,必须要用到键盘钩子,说到这个东东,熟悉安全知识的朋友肯定不陌生,它是很多木马的必备武器。不过这里用它不是干坏事,而是设置老板键“Alt+F12”。

其实老板键的开发一点也不复杂,跟很多程序都可以兼容,可以很好地嵌入程序中,例如炒股助手、游戏外挂等。当然,窗口类名和键盘钩子的用途还有很多,例如制作木马、设计某些安全辅助工具等。

老板键开发思路

先获取游戏类名。在程序中添加一个Timer控件用于实时扫描鼠标的位置,并实时监控鼠标位置所在窗口的句柄,获取句柄的文本,再使用函数GetClassName来获取窗口的类名,并判断获取的窗口名字是否是游戏的名称,如果是则提取游戏类名,是根据获取的类名就可以控制游戏窗口的显示和隐藏。

接着是设置老板键,按下“Alt+F12”(老板键可以根据自己的喜好选择),Windows系统会给软件发送一个消息WM_HOTKEY,软件捕捉到老板键被按下的消息后,设置一个全局变量Flag,根据Flag值的变化判断窗口是隐藏状态还是显示状态,如果为隐藏状态就调用窗口上的显示按钮打开游戏窗口,反之则调用隐藏按钮隐藏游戏窗口。

老板键开发步骤

第一步:创建窗口

启动Delphi7,新建一个项目,在主窗口上添加一个Timer,用于实时监控鼠标的位置和获取游戏的类名;2个Button,用于获取窗口后隐藏和显示窗口;1个Button,用于重新开启Timer功能;2个Edit,用于显示游戏窗口名和类名(见图)。在程序头部分的private段中加入声明:

43-f10-1-1.jpg

procedure HotKeyDown(var Msg: Tmessage); message WM_HOTKEY;

此过程的作用是捕捉老板键是否被按下,当老板键被按下这个消息被捕捉后,我们应该显示/隐藏窗口。

定义全局变量:HotKeyId: integer;//因为当程序退出时需要消除老板键

flag:boolean;//控制窗口的显示/隐藏状态

第二步:获取窗口类名

获取窗口类名的方法是先使用函数Getcursorpos得到鼠标的坐标,然后使用函数WindowFromPoint得到鼠标位置所在的窗口句柄,再获取句柄的文本,最后使用函数GetClassName来获取窗口的类名并停止Timer的运行。在OnTimer的事件中添加如下关键代码(完整代码下载地址:http://www.shudoo.com/bzsoft):

Getcursorpos(p1);//得到当前鼠标位置

hwnd1:=windowFromPoint(p1); //得到当前鼠标位置所在的控件(或窗口)的句柄

sendMessage(hwnd1,WM_GETTEXT,1024,longint(@str1));// 获取句柄hwnd1的文本

edit1.Text:=string(str1); //显示鼠标位置的句柄

getClassName(hwnd1,@str1,1024);

strtmp:=leftstr(edit1.Text ,4);

if strtmp=‘绿色征途’ then

begin

Edit2.Text :=string(str1);//显示鼠标位置的类名

timer1.Enabled:=false;

小提示:如果需要隐藏的程序进行了更新,程序的类名就发生了变化,此时我们需要重启Timer来重新获取程序的类名,此时点击“Timer”按钮来再次获取类名,Timer按钮的OnClick事件代码:timer1.Enabled:=true。

第三步:定义老板键

定义老板键需要利用GlobalAddAtom和RegisterHotKey函数向系统注册热键,我们在程序的OnFormCreate创建窗口事件时进行定义,先使用函数GlobalAddAtom对整型变量HotKeyId的值进行处理,然后使用函数RegisterHotKey注册热键,关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):

procedure TForm1.FormCreate(Sender: TObject);

begin

HotKeyId := GlobalAddAtom('MyHotKey')-$C000;//HotKeyId的合法取值范围是0x0000到0xBFFF之间,GlobalAddAtom函数得到的值在0xC000到0xFFFF之间,所以减掉0xC000来满足调用要求。

RegisterHotKey(Handle,HotKeyId, MOD_ALT, VK_F12);//热键的辅助按键包括Mod_Ctrl、Mod_Alt、Mod_Shift,对于Windows兼容键盘还支持Windows键,即键面上有Windows标志的那个键,其值为Mod_win。

flag:=true;//默认游戏窗口为显示状态

小提示:如果不需要使用两个键,只定义一个键比如F12作为老板键,那么定义热键的代码为RegisterHotKey(Handle, hotkeyid, 0, VK_F8)。

第四步:老板键的触发

当老板键被按下时,消息被自动捕捉,我们应该显示/隐藏窗口,这就需要在我们定义的过程HotKeyDown中进行处理了,当“Alt+F12”被触发的消息被捕捉后,我们根据Flag的值来显示/隐藏窗口,关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):

if(Msg.LparamLo=MOD_ALT) and (Msg.LParamHi=VK_F12)then // 假设热键为Alt+F12

begin //显示或者隐藏

if flag=true then

begin

Button2.OnClick(self);//调用隐藏窗口按钮

end

else

begin

Button3.OnClick(self); //调用显示窗口按钮

第五步:显示/隐藏窗口

当老板键被触发后,调用Button2或者Button3来显示/隐藏窗口,Button2、Button3的作用是根据我们获取的游戏窗口的类名对其进行显示/隐藏,并把Flag标志取反(代码下载地址:http://www.shudoo.com/bzsoft)。软件开发完成后,登录游戏,再启动开发的软件,如果看到老板过来立马按下“Alt+F12”就可以将游戏隐藏了。

小编救急

在讲解手机编程时,小编建立了很多开发QQ群,有许多读者朋友在里面交流,其中谈论得较多的是开发过程中碰到的各种问题。为此,小编特意开辟了一个救急板块,无论你开发哪种程序,无论你碰到什么问题,我们都可以给你提供帮助。

关键词:不规则窗口

读者来信:我在一些编程论坛上看到,有人展示的软件窗口不是矩形,而是不规则的窗口,请问这个是如何实现的?

小编:所有的 Windows 窗口都位于“region”中,窗口的大小如果超出“region”的范围,Windows 会自动裁剪超出“region”范围那部分的窗口,使其不可见。所以,要创建不规则窗口先要创建不规则“region”。

我们先用Photoshop创建一张BMP图片,将这张图片不规则形状之外的颜色改为同一颜色,比如绿色RGB(0,255,0),然后在开发软件中载入这张BMP图片,用代码逐一扫描图片的每个像素点,判断当像素点不属于绿色时在此位置创建只含一个像素的“region”,然后将这些“region”合并起来组成一个不规则的“region”,然后将窗口放到创建的“region”中,输入下面代码即可:

w1:=TBitmap.Create;

w1.Assign(image10.Picture.Bitmap);

w2:=w1.Canvas.Pixels[0,0];

rgn := CreateRegion(w1,w2,Handle);

if rgn<>0 then

begin

SetWindowRgn(Handle, rgn, true);

end;

关键词:禁止复制窗口中的文本

开发QQ群:在计算机的上机考试中经常会有些小题要求我们输入指定的文本或提示的代码,但不允许从试题窗口中通过复制加粘贴的方法输入,这个是怎么实现的?

小编:因为考试程序禁止了右键复制和快捷键的复制。屏蔽快捷键,可以在文本框的KeyPress事件中通过判断按键的KeyAscii值来实现:

Private Sub Text1_KeyPress(KeyAscii As Integer)

If KeyAscii = 3 Then KeyAscii = 0

End Sub

接下来通过文本框的MouseDown事件屏蔽鼠标右键操作,同时还可以根据用户的需要显示自定义菜单(见图):

43-f10-1-2.jpg

Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

Text1.Enabled = True

'打开自定义的菜单mymenu

PopupMenu mymenu

End Sub

关键词:简繁体转换

开发QQ群:我看到很多网站的右上角都提供了一个链接,点击之后可以将网站的文字进行简体和繁体的转换,请问如何将该功能移植到我的网站中?

小编:你先到http://www.xxjyzk.cn/transform.js(也可自行搜索)下载用于简繁转换的JavaScript文件transform.js,然后将它上传到网站目录,然后使用网页制作工具打开需要进行简繁转换的网页,在代码中加入如下代码:<script type="text/javascript" language="javascript" src="transform.js"></script>,然后在网页的适当位置添加简繁转换链接:<a href="javascript:s2t()">繁体中文</a> <a href="javascript:t2s()">简体中文</a>,保存页面后点击“繁体中文”链接,页面就会变成繁体,点击“简体中文”就会自动转换为简体形式,方便不同用户浏览。