锁屏技术.docx
- 文档编号:9166009
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:12
- 大小:20KB
锁屏技术.docx
《锁屏技术.docx》由会员分享,可在线阅读,更多相关《锁屏技术.docx(12页珍藏版)》请在冰豆网上搜索。
锁屏技术
Windows按键突破专家的原理
来源:
Blog 作者:
佚名 时间:
2008-8-1413:
48:
17
相信在window按键突破专家没有出来的时候,很多人还不知道软件还可以这样编的吧,本人也是一样,当知道有window按键突破专家这个软件时,仔细去想一下它的实现原理,才突然恍然大悟,原来原理居然是这么的简单,为什么以前我就没有想到呢。
好了,不说那么多废话,直接进入主题,我先是说说按键突破的原理。
实现按键突破的其实就是EnableWindow这个函数。
BOOLEnableWindow(
HWNDhWnd,
BOOLbEnable
);
hWnd指定将要启用或者禁用的窗口的句柄;
bEnable若为TRUE则启用窗口,为FALSE则禁用窗口;
只要把EnableWindow的第二个参数设置为TRUE,第一个参数填控件的句柄就将原来被禁止的控件重新变为可用。
现在的主要的问题是怎么得到控件的句柄,用vC++的朋友,应该都用过spy++这个强大的工具吧,它可以得到任意控件的句柄,和窗口的类名,看完这篇文章后,读者们也可以自己做一个属于自己的spy++啦。
先介绍一下RealChildWindowFromPoint这个函数。
该函数的功能是用来获取在指定点上的子窗口的句柄:
HWNDRealChildWindowFromPoint(
HWNDhwndParent,//父窗口的句柄
POINTptParentClientCoords//以客户坐标指定的点
)
返回值:
返回其子窗口句柄
RealChildWindowFromPoint函数只能够查找到由ptParentClientCoords所得到的子窗口,但是无法得到最深层的窗口,也就是说如果有两个窗口重叠,就无法见到下面的窗口,这样的情况是经常出现的。
“第一个子窗口”的窗口和“最深层的窗口”的复选框窗口就重叠了,如果用RealChildWindowFromPoint就只能得到“第一个子窗口”的窗口,而无法的到“最深层的窗口”的复选框,所以只简单的调用这个函数是无法实现Spy++的功能的。
大家来看看这个函数,这个函数会将鼠标所在的位置的窗口句柄赋予*phWnd。
读者下次想得实现spy++的功能就调用这个函数就可以了。
解释一下,用GetCursorPos得到的鼠标位置,是屏幕的鼠标位置,比如你的分辨率为1024*768,GetCursorPos这个函数得到的就是在1024*768这个屏幕范围的鼠标位置,而客户区窗口坐标,指的是鼠标在一个窗口上的坐标,不同于屏幕坐标。
voidGetRealWindow(HWND*phWnd)
{
POINTptPoint;
HWNDhWndTop=NULL;
HWNDhWndChild=NULL;
POINTptCooChild={0};
//先得到ptPoint指向的(子)窗口,再通过子窗口得到父窗口的句柄
GetCursorPos(&ptPoint);//得到鼠标的位置
hWndTop=:
:
WindowFromPoint(ptPoint);//获取鼠标包含指定点的窗口的句柄
ptCooChild=ptPoint;
*phWnd=GetParent(hWndTop);//用来获取最上层的父窗口的句柄
:
:
ScreenToClient(*phWnd,&ptCooChild);//该函数将屏幕的一个坐标转换成客户区(窗口)的坐标
//从最上层的窗口开始外下找,只直到找到最地层的窗口
while(TRUE){
hWndChild=RealChildWindowFromPoint(*phWnd,ptCooChild);
if(hWndChild&&(hWndChild!
=*phWnd))
*phWnd=hWndChild;
else
break;
}
}
代码不是很多,如果看不懂的话,不要紧,懂得调用这个函数就可以啦。
现在要再调用EnableWindow就可以了。
HWNDs;
GetRealWindow(&s);
:
:
EnableWindow(s,1);
如果只是运行一次这面的这些语句的话,还是不行的,必须在程序开启突破功能的时候一直运行。
所以
while
(1)
{
GetRealWindow(&s);
:
:
EnableWindow(s,1);
Sleep(100);
}
但是,这样的话,问题又来了,就是让程序休息100毫秒,这个程序还是会把所以的CPU都占用完的,总不能因为这一个程序,而把资源的耗尽了,这是谁都不愿意看到的,这时,就必须用到多线程了,对于多线程技术,很多文章都有介绍了的.我就不多说那么多了。
DWORDWINAPIrun(LPVOIDl)
{
while(k==1)
{
GetRealWindow(&s);
:
:
EnableWindow(s,1);
Sleep(100);
}
ExitThread(dwThreadID);
return1;
}
先把实现按键突破的语句放在一个新的函数里。
里面的这个k,是个全句变量,先在“资源”中添加一个Button按键(只是为了说明问题,所以程序做得很简单)。
voidCJiandanwindowDlg:
:
OnButton1()
{
k=1;
CreateThread(NULL,0,run,(LPVOID)i,0,&dwThreadID);
}
当按了一下Button时,就可以开始实现按键突破的功能了,仔细看一下,会发现这个程序和window按键突破专家有点不同,因为window按键突破专家在鼠标指向一个窗口时,就会将那个窗口下所有被禁止的控件都变成可用,而本程序,是鼠标指去哪个不可用的控件,那个控件就会编程可用,其他控件不受影响,如果想和window按键突破专家一样的功能,其实也很简单,只要改一下代码就可以了,读者们自己想想吧。
补充一点:
这个程序不能直接在VC++下运行,因为源代码将编译不了,必须去微软的老窝去下载最新的Windowssdk,安装以后,把所有的.h和.lib拷贝到vc++的相关目录里。
Windowssdk有许多有用的函数,建议用vc++的朋友都应该去下载。
程序在winxp、vc++6.0下通过编译。
#include
#include
#include"stdlib.h"
#include"resource.h"
#include"winuser.h"
CONST RECT lpRect={1024,768,1024,768};
HINSTANCEhInst;
charszChar[20];
charpassd[20];
staticintPstate=0;
boolIs_cut=0;
staticHBITMAPmap; //静态的不是静态,map的值会被释放
staticBITMAPbm;
//BitmapmemBmp; //内存位图
staticHDChdcMem;
staticHDChdc;
LRESULTCALLBACKWinSunProc(
HWNDhwnd, //窗口句柄
UINTuMsg, //消息id
WPARAMwParam,//附加信息
LPARAMlParam //附加信息
);
intWINAPIWinMain(
HINSTANCEhInstance, //应用程序实例
HINSTANCEhPrevInstance,//
LPSTRlpCmdLine, //命令行参数
intnCmdShow //显示模式
)
{
hInst=hInstance;
chartext[256];
//定义窗口类
////////////////////////////////////////////////////////////////////////////////////////
WNDCLASSwin;
win.style=/*WS_CAPTION|*/CS_VREDRAW;//类型窗口的样式风格水平重画和垂直重画
win.lpfnWndProc=WinSunProc;//窗口过程函数(回调函数)函数指针
win.cbClsExtra=0; //一般为0 附加内存空间
win.cbWndExtra=0; //一般为0 窗口附加内存
win.hbrBackground=(HBRUSH)GetStockObject(0);//背景画刷句柄
win.hCursor=LoadCursor(NULL,IDC_CROSS);//光标句柄
win.hIcon=LoadIcon(NULL,IDI_ERROR);//窗口类的图标句柄
win.hInstance=hInstance; //包含窗口过程的实例句柄
win.lpszClassName="ClassName_zhy";//窗口类名
win.lpszMenuName=NULL;
/////////////////////////////////////////////////////////////////////////////////////////////
//定义窗口类
RegisterClass(&win);//注册窗口类
HWNDhwnd;
hwnd=CreateWindow("ClassName_zhy","zhy",WS_POPUP,//WS_POPUP没窗体标题栏
NULL,NULL,600,400,NULL,NULL,hInstance,NULL);//创建窗口
ShowWindow(hwnd,SW_SHOWMAXIMIZED);//最大面积显示窗口(覆盖任务栏)
UpdateWindow(hwnd);//更新窗口
//半透明处理
//////////////////////////////////////////////////////////////////////////
SetWindowLong(hwnd,GWL_EXSTYLE,GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
HINSTANCEhInst1=LoadLibrary("User32.dll");
if(hInst1)
{
typedefBOOL(WINAPI*MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNCfun=NULL;
//取得SetLayeredWindowAttributes函数指针
fun=(MYFUNC)GetProcAddress(hInst1,"SetLayeredWindowAttributes");
fun(hwnd,0,220,2);//参数30~255(不透明)
FreeLibrary(hInst1);
}
//////////////////////////////////////////////////////////////////////////
MSGmsg;
while(GetMessage(&msg,NULL,0,0))//接受所有的消息
{
if(Is_cut)
ClipCursor(&lpRect);
SetForegroundWindow(hwnd);
/*HWNDclose=(:
:
GetForegroundWindow());
HWNDfocusWindow=:
:
GetForegroundWindow();*/
if(!
:
:
IsWindow(hwnd))
{
:
:
EnableWindow(hwnd,FALSE);
:
:
EnableWindow(FindWindow("ClassName_zhy",NULL),false);
}
TranslateMessage(&msg);//解析消息
DispatchMessage(&msg);//派发消息
SetForegroundWindow(hwnd);
//SystemParametersInfo(SPI_SCREENSAVERRUNNING,1,NULL,0);
//SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SW_SHOWMAXIMIZED);
}
/////////////////////////////////////////////
return0;
}
LRESULTCALLBACKWinSunProc( //回掉函数
HWNDhwnd, //handletowindow
UINTuMsg, //messageidentifier
WPARAMwParam,//firstmessageparameter
LPARAMlParam //secondmessageparameter
)
{
staticintn,m,k;
intx,y;
staticintlen=0;
switch(uMsg)
{
caseWM_SYSKEYDOWN:
caseWM_CREATE:
k=0;
map=LoadBitmap(hInst,(LPCSTR)IDB_BITMAP1);
break;
caseWM_KEYDOWN:
//switch(wParam)
//{
//caseVK_ESCAPE:
//DestroyWindow(hwnd);
//break;
//caseVK_LWIN:
//return1;
//caseVK_SPACE:
//break;
//}
break;
caseWM_CHAR:
//接受按键消息
charstr[2];
if(!
Pstate)
{
if(strlen(szChar)>5)
return1;
sprintf(str,"%c",wParam);
if(str[0]==13)
{
if(strlen(szChar)==0)
{
MessageBox(hwnd,"密码不可以为空!
","新会以冷-锁屏",MB_OK);
return1;
}
map=LoadBitmap(hInst,(LPCSTR)IDB_BITMAP2);
Is_cut=true;
Pstate=1;
SetTimer(hwnd,1,2200,0);
}
if(str[0]==8|str[0]==27)
{
strcpy(szChar,"");
:
:
InvalidateRect(hwnd,NULL,true);
break;
}
if(str[0]<123&&str[0]>47)
{
strcat(szChar,str);
:
:
InvalidateRect(hwnd,NULL,true);
}
}else{
if(strlen(passd)>5)
return1;
charstr[2];
sprintf(str,"%c",wParam);
strcat(passd,str);
if(str[0]==szChar[len])
{
len++;
if(len==(strlen(szChar)))
{
DestroyWindow(hwnd);
}
}else{
len=0;
strcpy(passd,"");
map=LoadBitmap(hInst,(LPCSTR)IDB_BITMAP5);
Pstate=2;
}
}
:
:
InvalidateRect(hwnd,NULL,true);
break;
caseWM_TIMER:
if(!
k)
{
map=LoadBitmap(hInst,(LPCSTR)IDB_BITMAP2);
}
k=1;
m++;
if(m>9)
{
if(n%3==0)
{
map=LoadBitmap(hInst,(LPCSTR)IDB_BITMAP2);
}
if(n%3==1)
{
map=LoadBitmap(hInst,(LPCSTR)IDB_BITMAP3);
}
if(n%3==2)
{
map=LoadBitmap(hInst,(LPCSTR)IDB_BITMAP4);
}
n++;
m=0;
}
:
:
InvalidateRect(hwnd,NULL,true);
break;
caseWM_RBUTTONDOWN:
//接受鼠标右健消息
caseWM_LBUTTONDOWN:
//得到当鼠标左键按下时的鼠标位置
/*699306
717322
612348
694370*/
x=LOWORD(lParam);
y=HIWORD(lParam);
/*charinfo[20];
sprintf(info,"%d,%d",x,y);
MessageBox(hwnd,info,"鼠标左键",MB_OK);*/
//点关闭
if(x>699&&x<717&&y>306&&y<322)
{
DestroyWindow(hwnd);
}
//确定按钮
if(x>612&&x<694&&y>348&&y<370)
{
if(strlen(szChar)==0)
{
MessageBox(hwnd,"密码不可以为空!
","窗口标题",MB_OK);
return1;
}
map=LoadBitmap(hInst,(LPCSTR)IDB_BITMAP2);
Is_cut=true;
Pstate=1;
SetTimer(hwnd,1,1200,0);
}
:
:
InvalidateRect(hwnd,NULL,true);
break;
caseWM_PAINT:
//接受绘制消息
PAINTSTRUCTps;
hdc=BeginPaint(hwnd,&ps);
hdcMem=:
:
CreateCompatibleDC(hdc);
:
:
SelectObject(hdcMem,map);
if(!
m)
{
BitBlt(hdc,300,300,500,300,hdcMem,0,0,SRCCOPY);
}
if(Pstate==0)
{
BitBlt(hdc,300,300,500,300,hdcMem,0,0,SRCCOPY);
TextOut(hdc,416,352,"*********",strlen(szChar));
//TextOut(hdc,416,382,"请牢记密码,想要恢复时只要正确的连续输入密码即可!
",strlen("请牢记密码,想要恢复时只要正确的连续输入密码即可!
"));
}
if(Pstate==1|k==1)
{
BitBlt(hdc,0,0,1024,768,hdcMem,0,0,SRCCOPY);
}
DeleteDC(hdcMem);
EndPaint(hwnd,&ps);
break;
caseWM_CLOSE:
//接受关闭消息
//if(IDYES==MessageBox(hwnd,"是否真的结束?
","窗口标题",MB_YESNO))
//{
////DestroyWindow(hwnd);
//}
break;
caseWM_DESTROY:
//接受销毁窗口消息
PostQuitMessage(0);
break;
default:
returnDefWindowProc(hwnd,uMsg,wParam,lParam);
}
return0;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 技术