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

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

代码如下:

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. 让使用SQLite的.NET应用自适应32位/64位系统

    如果一个.NET应用要自适应32位/64位系统,只需要在项目的“目标平台”设置为“Any CPU”.但是如果应用中使用了SQLite,情况就不同了. SQLite的.NET开发包来自是System.D ...

  2. JSON数据的处理中的特殊字符

    JSON现在是很常见的处理数据的方式了.但由于自己使用的是反射获取数据,必须自己处理特殊字符,但总是发现有一些看不见的字符在前台 var obj = jQuery.parseJSON(msg);会转换 ...

  3. 事件委托(event delegation) 或叫 事件代理

    比较好的介绍文章: 关于事件委托的整理 ,另附bind,live,delegate,on区别:https://www.cnblogs.com/MagicZhao123/p/5980957.html j ...

  4. 什么是 PWA?

    出处:https://segmentfault.com/a/1190000012353473

  5. MySQL锁机制&&PHP锁机制,应用在哪些场景中呢?

    正文内容 模拟准备--如何模拟高并发访问一个脚本:apache安装文件的bin/ab.exe可以模拟并发量 -c 模拟多少并发量 -n 一共请求多少次 http://请求的脚本 C:\phpStudy ...

  6. 关于 unsigned int 比较大小

    unsigned int 的所有数都是 >=0 的.比如 unsigned int 的 -2 也是 > 0 的,所以不能用自己常用的 upt( ) { if( x<0 ) x+=mo ...

  7. HDU3501——欧拉函数裸题

    给整数N(1 ≤ N ≤ 1000000000),求小于N的与N不互素的所有正整数的和. 思路:1.用欧拉函数求出小于N的与N互素的正整数的个数: 2.若 p 与 N 互素,则 N-p 必与 N 互素 ...

  8. struts2+dojo实现datagrid动态刷新

    实现一个普通的数据库查询功能,参考了这个帖子:http://stackoverflow.com/questions/5499453/how-to-refresh-datagrid 需要注意的是动态创建 ...

  9. [转]Ubuntu python-config

    转自:http://manpages.ubuntu.com/manpages/precise/man1/python-config.1.html recise (1) python-config.1. ...

  10. 【转】基于keras 的神经网络股价预测模型

    from matplotlib.dates import DateFormatter, WeekdayLocator, DayLocator, MONDAY,YEARLY from matplotli ...