.net中有关句柄的操作(C#)

以前上课的时候,老外曾经演示过一个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中找一下。

看下图:

.net中有关句柄的操作(C#)

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

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

.net中有关句柄的操作(C#)

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

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

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

看下运行效果吧。


.net中有关句柄的操作(C#)

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

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

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

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

最后,祝大家Lucky!!

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