昨天已经实现了获取窗口的标题、句柄等信息,但是高亮部分还有问题,而且红色绘制框擦除也有问题,今天就又研究了下上述两个问题。

高亮部分红色框只显示左上的边框,而右下的显示不出来,如图:

代码如下:

public void Highlight2(IntPtr hWnd)

        {

            const float penWidth = 3;

            Rectangle rc = new Rectangle();

            GetWindowRect(hWnd, ref rc);

IntPtr hDC = GetWindowDC(hWnd);

            if (hDC != IntPtr.Zero)

            {

                using (Pen pen = new Pen(Color.Red, penWidth))

                {

                    using (Graphics g = Graphics.FromHdc(hDC))

                    {

                        Font font = new Font("Courer New", 9, FontStyle.Bold);

                        g.DrawRectangle(pen, 0, 0, rc.Right - rc.Left - (int)penWidth, rc.Bottom - rc.Top - (int)penWidth);  

                        // g.DrawString("BIC Tech <SPY>", font, Brushes.Red, 5, 5);

                    }

                }

            }

            ReleaseDC(hWnd, hDC);

        }

而这一句 :

g.DrawRectangle(pen, 0, 0, rc.Right - rc.Left - (int)penWidth, rc.Bottom - rc.Top - (int)penWidth);

应当是控制绘制红色框大小的关键 ,它就是想从(0,0)开始绘制到rc的宽度、高度结束这个坐标,就能绘制和窗口一样的红色框,然而它却只有左上部分,我就想着我不管它窗口大小多少,我直接再绘制一个固定大小10*10的试试,于是就加了   :

g.DrawRectangle(pen, 0, 0, 10,10);

发现这个红色框是有右下边框的!!!我就想到肯定是大小除了问题,我再仔细查看发现昨天的代码的Size是不断变化的,按道理应当不会变化,发现它是在拖动的时候不断变化,我就把窗口移动到(0,0)坐标,这个时候才是和真实的大小一致的,我再把窗口移动(1,0)向左移动一个像素,它的Size就会增加1,rc.Right - rc.Left这个实际上就等价于rc.Width,后来我直接用rc.Width-rc.Left这个时候发现我横向移动它的大小没有改变!!

然后我就把获取窗口大小的代码改为了:

                textBox4.Text = string.Format("{0} x {1}", rc.Width - rc.Left, rc.Height - rc.Top);

这样在移动的时候窗口的大小就没有再变化。。。。。

然后同理我把

g.DrawRectangle(pen, 0, 0, rc.Width-(int)penWidth, rc.Height- (int)penWidth);  

改为:

g.DrawRectangle(pen, 0, 0, rc.Width -rc.Left- (int)penWidth, rc.Height -rc.Top- (int)penWidth);

结果发现红色框的右下部分出现了!!!

这个可能是某个地方的BUG,也有可能是某个代码的问题,总之解决的方法找到了,先不管它,接着搞刷新窗体绘制部分,我用

下面代码,结果发现它擦除的有问题,会存在不能及时擦除以前绘制窗口的问题:

        public void Refresh2(IntPtr hWnd)

        {

            InvalidateRect(hWnd,new COMRECT(0,0,0,0),true);

            UpdateWindow(hWnd);

            RedrawWindow(hWnd, new COMRECT(0, 0, 0, 0), IntPtr.Zero, Win32.RDW_FRAME | Win32.RDW_INVALIDATE | Win32.RDW_UPDATENOW | Win32.RDW_ALLCHILDREN);

        }

后来就搜索,终于找到一篇:http://bbs.csdn.net/topics/100106472

使用它的方法,直接一句就可以搞定:RedrawWindow(GetDesktopWindow(), null, IntPtr.Zero, 0x85);

至此,高亮绘制窗口和绘制窗口擦除部分都已经解决!

最后就是那个小的BUG,g.DrawRectangle(pen, 0, 0, rc.Width -rc.Left- (int)penWidth, rc.Height -rc.Top- (int)penWidth);这一句为什么宽度会多出来rc.Left还没找到原因,有哪位找到原因了告诉我一下。

程序我放在CSDN,欢迎下载:http://download.csdn.net/detail/xtfnpgy/5862401 ,最新的代码更改的部分我没有放上去,大家看着我这里的贴过去就可以了。

C# 自己动手实现Spy++(二)的更多相关文章

  1. C# 自己动手实现Spy++(一)

    因为项目要用到获取其他程序的标题,就想到了用Spy++,但是它是一个工具,并没有C#的源代码,所以就想探索下他的原理,网上搜索了下spy++的源代码,找到了一篇:http://blog.csdn.ne ...

  2. Java动手动脑(二)

    1>类的对象实例化 由于main为静态类型,所以在调用函数时也必须调用静态方法,如上代码中的求平方数的静态方法,如何在静态main中调用非静态类的方法呢? 静态方法只能直接访问静态成员,无法访问 ...

  3. BizTalk2010动手实验(二)第一个BizTalk应用

    1 课程简介 通过本课程了解BizTalk 的消息机制,发布与订阅机制 2 准备工作 3 操作步骤 3.1 创建BizTalk应用程序 1. 新建应用程序 2. 输入应用程序名称 3.2 创建与配置接 ...

  4. 动手学servlet(二) servlet基础

    1.我们来试着向一个servlet提交一个表单,现在webcontent下新建一个login.html页面,其中action对应servelt类名,代码如下: <!DOCTYPE HTML PU ...

  5. Java课程作业之动手动脑(二)

    纯随机数发生器 编写一个方法,使用以下算法生成指定数目(比如1000个)的随机整数. import java.util.Scanner; public class test { public stat ...

  6. 一生伏首拜阳明------<明朝那些事儿>

    一生伏首拜阳明. 王守仁,字伯安,别号阳明. 成化八年(1472),王守仁出生在浙江余姚,大凡成大事者往往出身贫寒,小小年纪就要上山砍柴,下海捞鱼,家里还有几个生病的亲属,每日以泪洗面.这差不多也是惯 ...

  7. OpenCV入门学习笔记

    OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...

  8. linux常用命令加实例大全

    目  录引言    1一.安装和登录    2(一)    login    2(二)    shutdown    2(三)    halt    3(四)    reboot    3(五)    ...

  9. Apache HTTP Server 与 Tomcat 的三种连接方式介绍(转)

    首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接.事实上 Tomcat 本身已经提供了 HTTP 服务,该服务默认的端口是 8080,装好 tomcat 后通过 8080 端 ...

随机推荐

  1. STDOUT/STDERR重定向到ALOG中

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/kangear/article/details/24534707      说下背景:如今众多Andr ...

  2. 深入详解美团点评CAT跨语言服务监控(八)报表持久化

    周期结束 我们从消息分发章节知道,RealtimeConsumer在初始化的时候,会启动一个线程,每隔1秒钟就去从判断是否需要开启或结束一个周期(Period),如下源码,如果 value < ...

  3. 转-[WebServer] Windows操作系统下 Tomcat 服务器运行 PHP 的环境配置

    原文 前言: 由于本人在开发和学习过程中需要同时部署 JavaWeb 和 PHP 项目,于是整理了网上的一些相关资料,并结合自己的实际操作,记录于此,以供参考. 一.环境(64bit): 1.操作系统 ...

  4. Spring技术内幕总结 - AOP概述

    AOP是Aspect-Oriented Programming(面向方面/切面编程)的简称.Aspect是一种新的模块化机制,用来描述分散在对象.类或函数中的横切关注点.分离关注点使解决特定领域问题的 ...

  5. sql语句实战

    1,排名,自身连接,用count,去重用distinct 2,累加,和上面一样,自身连接,用sum 3,count函数不用group by只有一组

  6. makedepend: command not found(转)

    makedepend: command not found 解决方案: 修改Makefile MAKEDEPEND=$(CC) -M 参考: When I set CROSS_COMPILE, `MA ...

  7. tomcat中catalina是什么

    catalina 就是Tomcat服务器使用的 Apache实现的servlet容器的 名字. Tomcat的核心分为3个部分: (1)Web容器---处理静态页面: (2)catalina --- ...

  8. iwebshop (: Cannot use object of type stdClass as array in)

    今天在PHP输出一个二维数组的时候,出现了“Fatal error: Cannot use object of type stdClass as array in……”. 这个二维数组是这样的: Ar ...

  9. String[]字符串数组,按字典顺序排列大小

    package ltb6w1; public class WordSort1 { private String[] a= {"hello","world",&q ...

  10. 【深度学习】BP反向传播算法Python简单实现

    转载:火烫火烫的 个人觉得BP反向传播是深度学习的一个基础,所以很有必要把反向传播算法好好学一下 得益于一步一步弄懂反向传播的例子这篇文章,给出一个例子来说明反向传播 不过是英文的,如果你感觉不好阅读 ...