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

在我早期用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环境,在其中集成了乱七八糟我的想法和测试功能。但尝试的有些技术和想法可能比较敏感和危险,所以我没有集成进去。

最后是一些截图:
终于解决了在c#里面用鼠标查找窗口的问题,原来如此简单

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



界面较多,不一一截图。主要功能有: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

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

上一篇:一个IE动画图标的小例子


下一篇:买了一本书《Programming pearls》编程珠玑(88上的数学题目(1))