C++Builder 高手进阶 (二)系统窗口分析器

原创 2003年01月28日 16:56:00
 

C++Builder 高手进阶  <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

(二)系统窗口分析器

nxyc_twz@163.com

     记得《超级解霸》作者梁肇新先生曾在电脑报上发表过系列文章《开发手记》,写的极有深度,令我获益匪浅。其在文中称,每次要写一个新功能或新的界面时,总喜欢用spy++对现有类似软件进行分析,可非常容易地得到其采用的什么类或什么消息机制,从而可轻而易举地模仿出相关的功能。我在具体的软件开发工作中,也经常这样做,有时确实可起到事半功倍的作用。但本篇不是教你如何使用spy++,而是要教你如何自己编写一个类似于spy++的软件。

一、             系统分析

要实现spy++的功能,首先要知道如何获取当前窗口句柄,以及当前窗口类。程序中主要使用定时器实现实时窗口句柄采集。

二、             开发前沿

这里用到的API函数有:

SystemParametersInfo:取得指定的系统参数

SetWindowPos:设置窗口位置

GetCursorPos  //获得光标的位置

WindowFromPoint //取得光标位置的窗口句柄

GetClassName//获得类名

SendMessage //获得窗口信息

三、             设计流程

1.初始化应用程序窗口,使其总显示在最顶层:

void __fastcall TSpyForm::FormCreate(TObject *Sender)

{

  //初始化

  TRect R;

  //取得桌面大小,并计算出程序窗口的位置

  SystemParametersInfo(SPI_GETWORKAREA,0,&R,0);

  Left = R.Right - Width;  //窗口左上角列坐标

  Top = R.Bottom - Height; //窗口左上角行坐标

  SetStayOnTop(this, true);  //设置为总在最前面显示

}

2.相关设置为总在最顶层显示函数:

void TSpyForm::SetStayOnTop(TForm  * Form, bool Value)

{

   //设置窗口是否总在最前面显示

   if ( Value )SetWindowPos(Form->Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);

   else  SetWindowPos(Form->Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);

}

3.定时器响应函数:

void __fastcall TSpyForm::TimerTimer(TObject *Sender)

{

 //用定时器每隔0.1秒进行一切判断,以达到系统信息的实时显示

  TPoint Pos;

  HWND Handle;

  char Buf[1024];

  GetCursorPos(&Pos);  //获得光标的位置

  Handle = WindowFromPoint(Pos); //取得光标位置的窗口句柄

  HandleEdit->Text = IntToStr((int)Handle); //显示窗口句柄

  GetClassName(Handle, Buf, 1024);  //获得类名

  ClassEdit->Text = Buf;     //显示类名

  SendMessage(Handle, WM_GETTEXT, 1024, Integer(&Buf)); //获得窗口信息

  TextEdit->Text = Buf;     //显示窗口信息

}

4.设置是否在最顶层显示:

void __fastcall TSpyForm::OnTopCheckBoxClick(TObject *Sender)

{

  //设置最前面显示

    SetStayOnTop(this, OnTopCheckBox->Checked);

}

C++ Builder 高手进阶 (五)用BCB编写多线程应用程序

 C++ Builder 高手进阶(五)用BCB编写多线程应用程序nxyc_twz@163.com   随着Windows系统的全球性普及,多线程技术已越来越多地运用到许多软件设计中。使用多线程技术可...
  • nxyc_twz
  • nxyc_twz
  • 2003年01月30日 21:27
  • 2256

Android开发高手进阶--学习任务

通过实践和摸索,整理了安卓学习和提升的进阶任务,分设4关。 一、实践关: fragement的学习和应用新组件viewpage等学习自定义view 的实现与应用listview下拉刷新属性动画的...
  • wellsoho
  • wellsoho
  • 2016年04月05日 12:05
  • 1647

JVM 菜鸟进阶高手之路三

笨神大大分享: 在微信小程序里面搜索:JVMPocket,这个小程序是笨神大大提供的,里面可以搜索相关JVM参数,用法。 -XX:MaxTenuringThreshold,这个参数主要是设置YGC的时...
  • lirenzuo
  • lirenzuo
  • 2017年07月22日 10:09
  • 1571

高手进阶,终极内存技术指南——完整/进阶版 I(转)

高手进阶,终极内存技术指南——完整/进阶版 I 老實話,我個人覺得這兩篇文章真的寫的很不錯,前段時間在study關於DDR內存的初始化以及其相關知識的時候,詳細學習了它。個人很佩服原文的作者能夠寫出這...
  • lightseed
  • lightseed
  • 2009年10月03日 13:53
  • 10466

终于躲不过,你还是要得是个全站工程师,论3DMax入门

曾经好多年前,刚入门3D,用了非主流引擎,想做一个天台的露天泳池场景,结果一个月都连个泳池模型都做不出来,以为一般的游戏问题都能解决,工作中所用的3D知识都熟练掌握,边做边学也不错,实战才是检验真理的...
  • avi9111
  • avi9111
  • 2017年11月13日 14:50
  • 120

帝国时代2的打法

要成为顶级高手,先决条件是技术,最重要的是意识,其次是运气。现今AOC的各种打法和招数很多人都知道而且能打得出来,打得好的就叫高手,能灵活运用和适当结合的就叫超高手,超高手的水平再加上强的意识就是顶级...
  • gongfusz
  • gongfusz
  • 2015年04月10日 13:56
  • 331

Android高手进阶教程

Android高手进阶教程  Android高手进阶教程(一)之----Android常用名令集锦(图文并茂) Android高手进阶教程(二)之----Android Launcher抽屉类...
  • gdliweibing
  • gdliweibing
  • 2015年01月13日 09:39
  • 734

JVM菜鸟进阶高手之路五

参考gc,发现大概一小时运行一次FGC,特别奇怪,笨神一看这样的问题就知道是system gc导致的,rmi默认一小时主动触发一次,由于没有gc日志,通过jstat命令观察2小时发现 ...
  • lirenzuo
  • lirenzuo
  • 2017年07月28日 15:04
  • 1295

一些Mac OS X技巧

重启Finder 有些设置更改以后需要重启Finder才能生效,最简单的方法就是按住option,再右键点击Finder,选择“重新开启”。 此外还可在终端运行如下代码: killall Fin...
  • amaowolf
  • amaowolf
  • 2012年10月11日 11:30
  • 1685

今天看到C#高手进阶流程

了解一种界面编程:WPF,WINFORM,ASP.NET.  熟悉一种UI架构模式, MVP,MVC,MVVM.  了解如何使用WCF, 异构平台编程下使用WCF需要你对WCF有非常深入的了解。 ...
  • wuwo333
  • wuwo333
  • 2011年09月09日 09:59
  • 1345
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++Builder 高手进阶 (二)系统窗口分析器
举报原因:
原因补充:

(最多只允许输入30个字)