终于解决了在c#里面用鼠标查找窗口的问题,原来如此简单

简介: 在我早期用c#写的窗口查看器里面,引用了很多windows api。主要功能几乎都是api调用实现的。当时发现做模仿spy++的查找窗口时出现了一个障碍。使我怀疑是不是查找窗口用到了更复杂的方式,已经用到查找子窗口等其他api。
在我早期用c#写的窗口查看器里面,引用了很多windows api。主要功能几乎都是api调用实现的。当时发现做模仿spy++的查找窗口时出现了一个障碍。使我怀疑是不是查找窗口用到了更复杂的方式,已经用到查找子窗口等其他api。现在从vcbase上下来一个别人的vc++的源码,发现我的实现的想法是没有问题的。只是我获取光标的屏幕坐标时出现了问题。我原来的想法是用一个picturebox控件捕获光标,然后用pointtoscreen方法把收到的鼠标位置转为屏幕坐标,再调用WindowFromPoint获取窗口句柄。但是这样看起来是失效了,也许是在函数调用过程中发生了一些意外,导致不能马上获取到从地理坐标和z次序坐标最靠近光标位置的那个窗口,而是被定格到某一个窗口就不动了,然后不能及时的找到新的窗口。后来这个问题被搁置了很久,我就没有再去查看过了。

其实过程非常简单:在c++代码中,只要两句就得到窗口句柄:
   POINT pnt;
   ::GetCursorPos(
& pnt);    // 取得鼠标坐标!
    HWND hwnd  =  ::WindowFromPoint(pnt) ;     // 取得鼠标指针处窗口句柄

在C#中只要原封不动的转换成Invoke即可。
另外一点值得注意的是,c++和c#里面都有long这个类型,c#中的long是int64,但是c++中的LONG长度4个字节,因此应当在C#中用Int或者Uint表示。

窗口查看器的历史来源是,我帮人做一个桌面小程序,里面用到鼠标穿透,嵌入桌面等功能,其中嵌入桌面的原理,导致我写了一个小程序,用来显示桌面的窗口树组成结构。再后来演化成为一个demo环境,在其中集成了乱七八糟我的想法和测试功能。但尝试的有些技术和想法可能比较敏感和危险,所以我没有集成进去。

最后是一些截图:






界面较多,不一一截图。主要功能有:qq尾巴模拟器,扫雷作弊器,IE管理器,PE文件信息查看器,进程信息查看,窗口截图,向指定窗口发送字符消息等等(更多节点操作就使用右键context menu)。

当前未解决的问题:
(1)在IE管理器的第一个页面中,修改IE的相关注册表信息时,好像没有刷新到注册表。导致其功能失效。具体原因没有耐心去查,所以尚待解决。
(2)特殊情况考虑不周,可能会偶尔出现运行时的异常情况,不过一般来说都不至于使程序致命的错误(比如某些特殊进程的信息无法访问),点击continue即可。

另外一个感想是,vc爱好者很多,乃至真正的技术领域是学无止境。

最后是一个可执行文件(不包含源码)的连接,同样,在vs2003中写的,在vs2005中修改过。

http://files.cnblogs.com/hoodlum1980/DesktopWndView.rar

维护历史:

2008.01.24:更新了查找窗口对话框的代码。对进程节点增加“结束进程”上下文菜单。

==================================================

在此特别提供源代码的下载:

http://files.cnblogs.com/hoodlum1980/DesktopWndView_Src.rar

          --by hoodlum1980      2008年11月22日1:13

==================================================

目录
相关文章
|
5月前
|
Web App开发 数据采集 C#
解决Firefox代理身份验证弹出窗口问题:C#和Selenium实战指南
本文是一份实战指南,主要介绍了在使用Selenium和C#进行网页抓取时,如何设置代理服务器的身份验证以避免自动化流程中断。文章首先列出了所需的开发环境和工具,然后通过C#代码示例详细展示了如何在Firefox浏览器中设置代理IP、端口、用户名、密码以及UserAgent和Cookies。代码中包含了自动处理代理身份验证弹出窗口的配置,以及如何添加Cookies的方法。最后,文章强调了结合C#和Selenium可以提高网页抓取任务的稳定性和效率。
解决Firefox代理身份验证弹出窗口问题:C#和Selenium实战指南
|
消息中间件 安全 API
C#实现操作Windows窗口句柄:SendMessage/PostMessage发送系统消息、事件和数据【窗口句柄总结之二】
SendMessage/PostMessage API 可以实现发送系统消息,这些消息可以定义为常见的鼠标或键盘事件、数据的发送等各种系统操作......
5669 1
C#实现操作Windows窗口句柄:SendMessage/PostMessage发送系统消息、事件和数据【窗口句柄总结之二】
|
5月前
|
数据采集 Web App开发 JavaScript
快速参考:用C# Selenium实现浏览器窗口缩放的步骤
在C#结合Selenium的网络爬虫应用中,掌握浏览器窗口缩放、代理IP、cookie与user-agent设置至关重要。本文详述了如何配置代理(如亿牛云加强版),自定义用户代理,启动ChromeDriver,并访问目标网站如抖音。通过执行JavaScript代码实现页面缩放至75%,并添加cookie增强匿名性。此策略有效规避反爬机制,提升数据抓取的准确度与范围。代码示例展示了整个流程,确保爬虫操作的灵活性与高效性。
119 3
|
7月前
|
设计模式 C#
36.c#:如何设置MDL窗口
36.c#:如何设置MDL窗口
53 1
|
7月前
|
C# 开发者
35.c#:winform窗口
35.c#:winform窗口
46 1
|
开发框架 自然语言处理 文字识别
一款C#开发的窗口文本提取开源软件
一款C#开发的窗口文本提取开源软件
96 2
|
关系型数据库 API C#
C#调用执行命令行窗口cmd,及需要交互执行的处理
C#执行外部程序用到的是Process进程类,打开一个进程,可以指定进程的启动信息StartInfo(启动的程序名、输入输出是否重定向、是否显示UI界面、一些必要参数等)...
3034 0
C#调用执行命令行窗口cmd,及需要交互执行的处理
|
API C# Windows
C#实现操作Windows窗口句柄:遍历、查找窗体和控件【窗口句柄最全总结之一】
C#对Windows窗口或窗口句柄的操作,都是通过 P/Invoke Win32 API 实现的,DllImport引入Windows API操作窗口(句柄),可以实现枚举已打开的窗口、向窗口...
3804 0
C#实现操作Windows窗口句柄:遍历、查找窗体和控件【窗口句柄最全总结之一】
|
C# Windows
推荐一个C#开发的窗口扩展菜单,支持系统所有窗口
一个C#开发的窗口扩展项目,采用.NET Framework 4.0开发,支持Windows Xp以及更高版本的系统,同时支持命令模式,可供代码调用。
127 0
推荐一个C#开发的窗口扩展菜单,支持系统所有窗口
|
C# C++ Windows
C#工程中输出类型转换以及程序运行后控制台窗口不退出设置
C#工程中输出类型转换以及程序运行后控制台窗口不退出设置
384 0
C#工程中输出类型转换以及程序运行后控制台窗口不退出设置