Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16499511
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 21:02:26

下载本文示例代码
  相信在window按键突破专家没有出来的时候,很多人还不知道软件还可以这样编的吧,本人也是一样,当知道有window按键突破专家这个软件时,仔细去想一下它的实现原理,才突然恍然大悟,原来原理居然是这么的简单,为什么以前我就没有想到呢。   好了,不说那么多废话,直接进入主题,我先是说说按键突破的原理。实现按键突破的其实就是EnableWindow这个函数。 BOOL EnableWindow( HWND hWnd, BOOL bEnable );   hWnd 指定将要启用或者禁用的窗口的句柄;  bEnable 若为TRUE则启用窗口,为FALSE则禁用窗口;  只要把EnableWindow的第二个参数设置为TRUE,第一个参数填控件的句柄就将原来被禁止的控件重新变为可用。   现在的主要的问题是怎么得到控件的句柄,用vc 的朋友,应该都用过spy 这个强大的工具吧,它可以得到任意控件的句柄,和窗口的类名,看完这篇文章后,读者们也可以自己做一个属于自己的spy 啦。   先介绍一下RealChildWindowFromPoint这个函数。该函数的功能是用来获取在指定点上的子窗口的句柄 : HWND RealChildWindowFromPoint( HWND hwndParent, // 父窗口的句柄 POINT ptParentClientCoords // 以客户坐标指定的点 )   返回值 :   返回其子窗口句柄   RealChildWindowFromPoint函数只能够查找到由 ptParentClientCoords 所得到的子窗口,但是无法得到最深层的窗口,也就是说如果有两个窗口重叠,就无法见到下面的窗口,这样的情况是经常出现的。   “第一个子窗口”的窗口和“最深层的窗口”的复选框窗口就重叠了,如果用 RealChildWindowFromPoint 就只能得到“第一个子窗口”的窗口,而无法的到“最深层的窗口”的复选框,所以只简单的调用这个函数是无法实现Spy 的功能的。   大家来看看这个函数,这个函数会将鼠标所在的位置的窗口句柄赋予*phWnd。读者下次想得实现spy 的功能就调用这个函数就可以了。   解释一下,用GetCursorPos得到的鼠标位置,是屏幕的鼠标位置,比如你的分辨率为1024*768,GetCursorPos这个函数得到的就是在1024*768这个屏幕范围的鼠标位置,而客户区窗口坐标,指的是鼠标在一个窗口上的坐标,不同于屏幕坐标。 void GetRealWindow(HWND *phWnd) {  POINT ptPoint;  HWND hWndTop = NULL;  HWND hWndChild = NULL;  POINT ptCooChild = {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就可以了。 HWND s; GetRealWindow(&s); ::EnableWindow(s,1);   如果只是运行一次这面的这些语句的话,还是不行的,必须在程序开启突破功能的时候一直运行。   所以 while(1) {  GetRealWindow(&s);  ::EnableWindow(s,1);  Sleep(100); }   但是,这样的话,问题又来了,就是让程序休息100毫秒,这个程序还是会把所以的cpu都占用完的,总不能因为这一个程序,而把资源的耗尽了,这是谁都不愿意看到的,这时,就必须用到多线程了,对于多线程技术,很多文章都有介绍了的.我就不多说那么多了。 DWORD WINAPI run(LPVOID l) {  while(k==1)  {   GetRealWindow(&s);   ::EnableWindow(s,1);   Sleep(100);  }  ExitThread(dwThreadID);  return 1; }   先把实现按键突破的语句放在一个新的函数里。里面的这个k,是个全句变量,先在“资源”中添加一个Button按键(只是为了说明问题,所以程序做得很简单)。 void CJiandanwindowDlg::OnButton1() {  k=1;  CreateThread(NULL,0,run,(LPVOID)i,0,&dwThreadID); }   当按了一下Button时,就可以开始实现按键突破的功能了,仔细看一下,会发现这个程序和window按键突破专家有点不同,因为window按键突破专家在鼠标指向一个窗口时,就会将那个窗口下所有被禁止的控件都变成可用,而本程序,是鼠标指去哪个不可用的控件,那个控件就会编程可用,其他控件不受影响,如果想和window按键突破专家一样的功能,其实也很简单,只要改一下代码就可以了,读者们自己想想吧。   补充一点:这个程序不能直接在vc 下运行,因为源代码将编译不了,必须去微软的老窝去下载最新的windows sdk,安装以后,把所有的.h和.lib拷贝到vc 的相关目录里。windows sdk有许多有用的函数,建议用vc 的朋友都应该去下载。   程序在winxp、vc 6.0下通过编译。 ·VC入门专区 ·VC高级技术专区 GIS系统三维地景仿真设计教程 建梦幻三维 OpenGL程序设计轻松入门 ·VC网络编程 ·VC图像编程 ·轻松玩转MFC文档视图架构编程 ·深入浅出Win32多线程程序设计 ·深入浅出VC 动态链接库编程   相信在window按键突破专家没有出来的时候,很多人还不知道软件还可以这样编的吧,本人也是一样,当知道有window按键突破专家这个软件时,仔细去想一下它的实现原理,才突然恍然大悟,原来原理居然是这么的简单,为什么以前我就没有想到呢。   好了,不说那么多废话,直接进入主题,我先是说说按键突破的原理。实现按键突破的其实就是EnableWindow这个函数。 BOOL EnableWindow( HWND hWnd, BOOL bEnable );   hWnd 指定将要启用或者禁用的窗口的句柄;  bEnable 若为TRUE则启用窗口,为FALSE则禁用窗口;  只要把EnableWindow的第二个参数设置为TRUE,第一个参数填控件的句柄就将原来被禁止的控件重新变为可用。   现在的主要的问题是怎么得到控件的句柄,用vc 的朋友,应该都用过spy 这个强大的工具吧,它可以得到任意控件的句柄,和窗口的类名,看完这篇文章后,读者们也可以自己做一个属于自己的spy 啦。   先介绍一下RealChildWindowFromPoint这个函数。该函数的功能是用来获取在指定点上的子窗口的句柄 : HWND RealChildWindowFromPoint( HWND hwndParent, // 父窗口的句柄 POINT ptParentClientCoords // 以客户坐标指定的点 )   返回值 :   返回其子窗口句柄   RealChildWindowFromPoint函数只能够查找到由 ptParentClientCoords 所得到的子窗口,但是无法得到最深层的窗口,也就是说如果有两个窗口重叠,就无法见到下面的窗口,这样的情况是经常出现的。   “第一个子窗口”的窗口和“最深层的窗口”的复选框窗口就重叠了,如果用 RealChildWindowFromPoint 就只能得到“第一个子窗口”的窗口,而无法的到“最深层的窗口”的复选框,所以只简单的调用这个函数是无法实现Spy 的功能的。   大家来看看这个函数,这个函数会将鼠标所在的位置的窗口句柄赋予*phWnd。读者下次想得实现spy 的功能就调用这个函数就可以了。   解释一下,用GetCursorPos得到的鼠标位置,是屏幕的鼠标位置,比如你的分辨率为1024*768,GetCursorPos这个函数得到的就是在1024*768这个屏幕范围的鼠标位置,而客户区窗口坐标,指的是鼠标在一个窗口上的坐标,不同于屏幕坐标。 void GetRealWindow(HWND *phWnd) {  POINT ptPoint;  HWND hWndTop = NULL;  HWND hWndChild = NULL;  POINT ptCooChild = {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就可以了。 HWND s; GetRealWindow(&s); ::EnableWindow(s,1);   如果只是运行一次这面的这些语句的话,还是不行的,必须在程序开启突破功能的时候一直运行。   所以 while(1) {  GetRealWindow(&s);  ::EnableWindow(s,1);  Sleep(100); }   但是,这样的话,问题又来了,就是让程序休息100毫秒,这个程序还是会把所以的cpu都占用完的,总不能因为这一个程序,而把资源的耗尽了,这是谁都不愿意看到的,这时,就必须用到多线程了,对于多线程技术,很多文章都有介绍了的.我就不多说那么多了。 DWORD WINAPI run(LPVOID l) {  while(k==1)  {   GetRealWindow(&s);   ::EnableWindow(s,1);   Sleep(100);  }  ExitThread(dwThreadID);  return 1; }   先把实现按键突破的语句放在一个新的函数里。里面的这个k,是个全句变量,先在“资源”中添加一个Button按键(只是为了说明问题,所以程序做得很简单)。 void CJiandanwindowDlg::OnButton1() {  k=1;  CreateThread(NULL,0,run,(LPVOID)i,0,&dwThreadID); }   当按了一下Button时,就可以开始实现按键突破的功能了,仔细看一下,会发现这个程序和window按键突破专家有点不同,因为window按键突破专家在鼠标指向一个窗口时,就会将那个窗口下所有被禁止的控件都变成可用,而本程序,是鼠标指去哪个不可用的控件,那个控件就会编程可用,其他控件不受影响,如果想和window按键突破专家一样的功能,其实也很简单,只要改一下代码就可以了,读者们自己想想吧。   补充一点:这个程序不能直接在vc 下运行,因为源代码将编译不了,必须去微软的老窝去下载最新的windows sdk,安装以后,把所有的.h和.lib拷贝到vc 的相关目录里。windows sdk有许多有用的函数,建议用vc 的朋友都应该去下载。   程序在winxp、vc 6.0下通过编译。 ·VC入门专区 ·VC高级技术专区 GIS系统三维地景仿真设计教程 建梦幻三维 OpenGL程序设计轻松入门 ·VC网络编程 ·VC图像编程 ·轻松玩转MFC文档视图架构编程 ·深入浅出Win32多线程程序设计 ·深入浅出VC 动态链接库编程 下载本文示例代码


Windows按键突破专家的原理Windows按键突破专家的原理Windows按键突破专家的原理Windows按键突破专家的原理Windows按键突破专家的原理Windows按键突破专家的原理Windows按键突破专家的原理Windows按键突破专家的原理Windows按键突破专家的原理Windows按键突破专家的原理Windows按键突破专家的原理Windows按键突破专家的原理Windows按键突破专家的原理Windows按键突破专家的原理Windows按键突破专家的原理
阅读(193) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~