今天我为大家带来一个有趣的例子,有点像Spy++的功能,通过鼠标在屏幕上移动,并实时捕捉指定坐标点处的窗口信息。

窗口信息包括窗口标题,窗口句柄,窗口类名,以及呈现所捕捉窗口的缩略图。

现在我们不妨来思考一下,要实现这些功能,我们需要准备哪些技术要点?

1、获取当前鼠标指针的屏幕坐标,这个用System.Windows.Forms命名空间下的Cursor类的Position属性就可以知道当前鼠标指针的位置,屏幕坐标。

2、如何从指定坐标处得到窗口,其实就是获得对应窗口的句柄,这里要使用一个API函数WindowFromPoint,它可以返回指定坐标处的窗口的句柄。这个窗口不一定指的就是完整的窗口,在Win32窗口中,一个控件也是一个窗口,桌面也是一个窗口。

3、获取窗口的标题文本,使用API函数GetWindowText,根据窗口的句柄得到窗口的标题文本。

4、获取窗口类名,使用API函数GetClassName,得到对应窗口所属的窗口类,这里所指的窗口类就是我们在开发Win32程序时,类似于在WinMain函数中用RegisterClass函数注册的类名。

5、把窗口内容绘制成缩略图,这个简单,在System.Drawing命名空间下的Graphics类就有一个CopyFromScreen方法,可以从屏幕上复制图像,效果是等效于用BitBlt函数从桌面的DC复制到其他位置一样。

6、我们并不是复制整个屏幕,而只是对应位置处的窗口,要获得窗口的矩形区域,可以调用API函数GetWindowRect。

好了,现在技术要点解决了,接下来就是真刀真枪干了。

首先是导入Win32的API。

[DllImport("User32.dll",CallingConvention = CallingConvention.StdCall)]

public extern static IntPtr WindowFromPoint(int x, int y);

[DllImport("User32.dll", CallingConvention = CallingConvention.StdCall)]

public extern static int GetClassName(

[In] IntPtr hwnd,

[Out, MarshalAs(UnmanagedType.LPStr)] StringBuilder lpString,

[In] int nMaxCount);

[DllImport("User32.dll", CallingConvention = CallingConvention.StdCall)]

public extern static int GetWindowText(

[In] IntPtr hwnd,

[Out, MarshalAs(UnmanagedType.LPStr)] StringBuilder lpString,

[In] int nMaxCount);

[DllImport("User32.dll")]

public extern static bool GetWindowRect(IntPtr hwnd, out RECT lpRect);

[StructLayout(LayoutKind.Sequential)]

public struct RECT

{

public int left;

public int top;

public int right;

public int bottom;

}

在整个桌面上处理鼠标移动事件不容易,这里我换一种思路,用Timer组件,每隔300毫秒获取一次信息,这样,当鼠标在屏幕上移动时,也能实时更新坐标信息。

private void MyTimer_Tick(object sender, EventArgs e)

{

IntPtr hwnd = WindowFromPoint(Cursor.Position.X, Cursor.Position.Y);

if (hwnd!=IntPtr.Zero)

{

StringBuilder sbText = new StringBuilder();

StringBuilder sbClass = new StringBuilder();

try

{

// 获取窗口标题

GetWindowText(hwnd, sbText, 260);

// 获取窗口类名

GetClassName(hwnd, sbClass, 256);

}

catch(Exception ex)

{

lblMessage.Text = ex.Message;

}

// 显示信息

lblCurrentLocation.Text = string.Format("{0}, {1}", Cursor.Position.X, Cursor.Position.Y);

lblCurrentHandle.Text = hwnd.ToString();

lblWindowText.Text = sbText.ToString();

lblClassName.Text = sbClass.ToString();

// 绘制屏幕图像

DrawToPicBox(hwnd);

}

}

Bitmap bmp = null;

private void DrawToPicBox(IntPtr hwnd)

{

if (bmp != null)

{

bmp.Dispose();

}

RECT rect;

if (GetWindowRect(hwnd, out rect))

{

bmp = new Bitmap(rect.right - rect.left, rect.bottom - rect.top);

using (Graphics g = Graphics.FromImage(bmp))

{

// 将屏幕上的内容复制到Graphics中

g.CopyFromScreen(rect.left, rect.top, 0, 0,

new Size(bmp.Width, bmp.Height), CopyPixelOperation.SourceCopy);

}

this.pictureBox1.Image = bmp;

}

}

private void btnStart_Click(object sender, EventArgs e)

{

MyTimer.Start();

btnStart.Enabled = false;

btnStop.Enabled = true;

}

private void btnStop_Click(object sender, EventArgs e)

{

MyTimer.Stop();

btnStart.Enabled = true;

btnStop.Enabled = false;

}

运行后你能看到效果的。请看截图。

好的,这个好玩的东东就到这里,稍候我上传源代码到资源区。

java怎么捕捉游戏窗口_捕捉桌面上的窗口信息相关推荐

  1. 怎么在桌面上嵌入窗口(使用FindWindow(),FindWindowEx(),EnumChildWindows())

    怎么在桌面上嵌入窗口(使用FindWindow(),FindWindowEx(),EnumChildWindows()) 打开spy++ 我们可以发现桌面窗口是一个位于Progman的类名下的类名为S ...

  2. iphone桌面上的圆圈怎么设置_苹果手机桌面上找不到便签记事本怎么办?有办法添加吗...

    原标题:苹果手机桌面上找不到便签记事本怎么办?有办法添加吗 习惯了使用安卓手机的小伙伴,可能很多人都会选择在便签或者记事本里记录待办事项.因为随着移动互联网的发展,现在很多安卓手机上都有系统自带的便签 ...

  3. 计算机ei浏览器没有了,ie浏览器不见了_我的电脑桌面上怎么IE浏览器没有了啊...

    为什么win7系统IE浏览器不见了? 解决方法如下: 1.同时按下WIN+R键,或者点击桌面左下角,找到运行: 上述就是win7系统ie浏览器图标不见了的两种找回方法. 我的电脑里面IE浏览器不见了, ...

  4. 如何删除tmp计算机桌面,桌面上的文件删不掉_我桌面上突然多了一个tmp结尾的文件桌面删除都删除......

    桌面上的文件 删不掉怎么办 为什么桌面上有些文件删不掉 我电脑桌面上有个文件夹,删除不掉怎么办? 我的电脑桌面上文件夹删不掉 解决我的电脑桌面上文件夹删不掉的步骤如下: 1.首先在我们的电脑桌面上找到 ...

  5. linux桌面上创建文件夹,如何在桌面上创建一个文件夹_在桌面上建立文件夹的方法...

    有些朋友会习惯把文件资料放到桌面,时间久了之后,文件越来越多,这时就需要把它们整理进文件夹了.那么如何在桌面上创建一个文件夹呢?今天小编就为大家带来在桌面上建立文件夹的方法. 在桌面上建立文件夹的方法 ...

  6. java 接口 白名单_策略:服务器上的白名单安全机制

    图片都存在一起,最大的好处就是可以做CDN加速.特别是某些高清图.同理,视频,音频文件也是这样的. 然而今天却并不是要从这个角度去讨论这个话题. 今天的话题,从一个不太可爱的地方谈起:静态潜伏的恶意代 ...

  7. java 企业号 临时素材_微信企业号上传临时素材的方法C#实现

    // /// 上传多媒体文件,返回 MediaId /// /// /// /// public string UploadMultimedia(string files) { weixinsendm ...

  8. java ee学生信息管理_基于jsp的学籍学生信息信息管理系统-JavaEE实现学籍学生信息信息管理系统 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的学籍学生信息信息管理系统, 该项目可用各类java课程设计大作业中, 学籍学生信息信息管理系统的系统架构分为前后台 ...

  9. java ee学生信息管理_【全】JAVAEE_学生信息管理系统

    [实例简介] 适合学生的javaee课程设计代码,采用MVC模式开发-- [实例截图] [核心代码] JAVAEE_学生信息管理系统 └── studentSystem ├── build │   └ ...

最新文章

  1. Java项目:网上商城系统(java+jsp+servlert+mysql+ajax)
  2. 网上书店黑盒测试_网上书店系统测试计划书.doc
  3. Linux 网络诊断命令
  4. java系统界面找不到符号,找不到符号,java找不到符号
  5. Java 100(三)
  6. shell编程基础之根据输入进行相应的操作
  7. Nginx负载均衡策略有哪些?知识点总结+面试题解析
  8. 深入::first-letter的研究
  9. 华为云服务器安装win10系统,云服务器可以安装win10吗
  10. exit c+_C / C ++中的exit(0)vs exit(1)与示例
  11. 如何判断自己是否到了该辞职的时候
  12. 实现PHP内部的通知机制,如当一个类的属性发生变化时,另外一个类就可以收到通知...
  13. java点击图片发出声音_Java 中图片和声音文件的加载
  14. python字符串处理函数总结
  15. Cocos Creator 组件-画笔
  16. paip.取当天记录的方法sql跟hql hibernate
  17. 语音转文字 mp3 text
  18. java毕业设计成品基于SSM+Bootstrap+MYSQL演唱会网上订票系统
  19. 橱柜衣柜 sketchup草图大师设计全屋定制家具意义?谈单拆单生产一起做了?-有屋软件
  20. 史上最通俗易懂的并查集算法详解

热门文章

  1. 大数据Hadoop(五)HDFS的原理之核心设计(1)
  2. 文件上传流程和协议规范,简,全
  3. DC初级摄友必学摄影技巧(转贴)
  4. 如何查看office是否是永久激活
  5. C++三角定位法求两圆交点坐标
  6. 永不放弃--一个藏羚人的感人故事
  7. shp文件中polyline是什么_shp文件的读取
  8. win10蓝屏提示重新启动_神器 | 那些好用到爆的win10修复优化软件,一键解决你的麻烦(一)...
  9. 神州信息“六合上甲”再获殊荣
  10. 小米3 SIM 卡无法识别