博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.net中有关句柄的操作(C#)
阅读量:6116 次
发布时间:2019-06-21

本文共 2161 字,大约阅读时间需要 7 分钟。

  hot3.png

以前上课的时候,老外曾经演示过一个QQ消息群发器的雏形,利用窗口的句柄操作来实现的。那时候感觉不以为然,现在觉得挺有意思的,也去网上找了点资料来学习一下,不过时间不充足,只是简单的看了一下。这里分享一下,都是关于句柄最初级的操作。

话不多说,看代码。

        [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]

        private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll", EntryPoint = "FindWindowEx", SetLastError = true)]

        private static extern IntPtr FindWindowEx(IntPtr hwndParent, uint hwndChildAfter, string lpszClass, string lpszWindow);

        [DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)]

        private static extern IntPtr SendMessage(IntPtr hwnd, uint wMsg, int wParam, int lParam);

        [DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Unicode)]

        private static extern IntPtr SendMessage(IntPtr hWnd, uint wMsg, IntPtr wParam, string lParam);

        [DllImport("user32.dll", EntryPoint = "SetForegroundWindow", SetLastError = true)]

        private static extern void SetForegroundWindow(IntPtr hwnd);

        private void button1_Click(object sender, EventArgs e)

        {

IntPtr intptr = new IntPtr(2755834);

            SendMessage(intptr,0xF5, 0, 0);

        }

[DllImport("user32.dll", EntryPoint = "SetForegroundWindow", SetLastError = true)]类似于这些都是引入系统API,如果你还没学到这些,可以看下C#语法中的属性那一章,有关于句柄的操作都是要调用到系统的API(当然是 Windows中的了)。

引入完毕后,我们继续看下面的代码。

这里需要用到VS中自带的一个查看句柄的工具----SPY++,可以到开始菜单中的Visual Tools中找一下。

看下图:

57679351fbdecc0643a75b1a.jpg

把左边那个箭靶一下的圈移动到需要的窗口或者控件上即可显示窗口或者控件的句柄。我这里是取得右边我自己写的一个计算器中的“4”这个按钮的句柄值。

取得句柄值后我们需要转换为10进制,因为sendmessage这个函数中参数中的值只能是10进制的。怎么转换不用多说了吧,我这里用到也是我去年写的一个小工具,用来转换还是非常方便的(那时候为了学微机原理写的,硬盘坏了还保存了下来,幸好!)。

b1f8f0fa312330fcb58f31e7.jpg

IntPtr intptr = new IntPtr(2755834);是创建一个IntPtr结构变量。

            SendMessage(intptr,0xF5, 0, 0);

下 面这个函数就是用来对“4”按钮进行Click操作,intptr就是“4”的句柄,0xF5代表是Click操作(其他操作也有类似的值,有兴趣可以自 己上网查),后面两个0我也不是特别的清楚,抱歉一下。SendMessage这个函数这里也有重载,看上面的Dll Import引入即可。

看下运行效果吧。

4cb7282db45feb16359bf7e2.jpg

按下左边的button1后右边的窗口就是执行按钮“4”的Click操作。

总结:1、每次程序重启窗口的句柄值都会不一样,我的想法是利用进程去查找这个程序,然后程序自动判断某个控件的句柄,系统的API中也有取得句柄的函数,可以去找一下。

      2、文本框填值,这个我想SendMessage的几个重载函数中也有提供这样功能的函数的,不过执行的就不是0xF5这个Click操作了。

      3、写QQ消息群发器,网上找了一下这方面的资料。QQ官方在这方面做了不少的努力,可能某些API函数对QQ的窗口不起做用,已经被屏蔽掉。而且随着QQ版本的升级,限制会越来越多。如果以后有机会的话再来研究一下这个东西了。

最后,祝大家Lucky!!

转载于:https://my.oschina.net/tangyu/blog/82964

你可能感兴趣的文章
Windows SFTP 的安装
查看>>
摄像机与绕任意轴旋转
查看>>
rsync 服务器配置过程
查看>>
预处理、const与sizeof相关面试题
查看>>
爬虫豆瓣top250项目-开发文档
查看>>
Elasticsearch增删改查
查看>>
oracle归档日志增长过快处理方法
查看>>
有趣的数学书籍
查看>>
teamviewer 卸载干净
查看>>
多线程设计模式
查看>>
解读自定义UICollectionViewLayout--感动了我自己
查看>>
SqlServer作业指定目标服务器
查看>>
UnrealEngine4.5 BluePrint初始化中遇到编译警告的解决办法
查看>>
User implements HttpSessionBindingListener
查看>>
抽象工厂方法
查看>>
ubuntu apt-get 安装 lnmp
查看>>
焊盘 往同一个方向增加 固定的长度方法 总结
查看>>
eclipse的maven、Scala环境搭建
查看>>
架构师之路(一)- 什么是软件架构
查看>>
jquery的冒泡和默认行为
查看>>