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

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

代码如下:

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. Zabbix-2.4-安装-2

    zabbix自定义报警-动作   打开资产自动接收   这里看到主机资产有数据了,这里的数据,就是来自下面的关联 上面的数据就是设置login-user时候设置的关联    有些关联显示的慢,比如下面 ...

  2. Web-Business-Application-Solution

    项目地址 :  https://github.com/kelin-xycs/Web-Business-Application-Solution Web-Business-Application-Sol ...

  3. JSON 反序列化Lis<T>

    JavaScriptSerializer sr = new JavaScriptSerializer();             //List<CSISSIQuestionLibrary> ...

  4. ML平台_PAI参考

    阿里云机器学习PAI(Platform of Artificial Intelligence)是一款一站式的机器学习平台,包含数据预处理.特征工程.常规机器学习算法.深度学习框架.模型的评估以及预测这 ...

  5. MySQL测试报告

    硬件配置: 3台服务器:192.168.23.168,  192.168.23.169,  192.168.23.170 硬盘:230G 内存:16G Linux内核:Linux geoserver. ...

  6. chrome flash

    chrome://settings/content/flash 在Chrome地址栏中输入:chrome://settings/content/flash,进入Flash设置,勾选允许网站运行flas ...

  7. 解决“chrome adobe flash player不是最新版本”的方法

    chrome地址栏输入chrome://components 更新flash后,重启chrome即可,可能需要搭梯子才能更新.

  8. WPF Demo19 命令、UC

    命令系统的基本元素和关系WPF命令系统的组成要素:A.命令(command):WPF命令实际上就是实习了ICommand接口的类.平时使用最多的就是RoutedCommand类.B.命令源(comma ...

  9. sql server 清除数据库中所有表的数据

    CREATE PROCEDURE  sp_DeleteAllData AS EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'- ...

  10. CentOS 7.4 初次手记:第四章 CentOS安全了解

    第四章 CentOS安全了解... 66 第一节 user.group.chmod. 66 I 10位文件属性... 66 II user/group增删改... 67 III user/group配 ...