wpf C# 操作DirectUI窗口 SendMessage+MSAA

这篇博客介绍了如何在WPF应用中,针对使用DirectUI技术的QQ窗口,利用SendMessage函数和Microsoft Active Accessibility(MSAA)技术来获取和操作窗口信息。文章详细阐述了与句柄操作相关的函数,如FindWindow、FindWindowEx等,以及IAccessible接口的使用,包括AccessibleObjectFromWindow和AccessibleChildren等。博主还分享了在发送文本到DirectUI窗口时遇到的中文乱码问题及解决办法。
摘要由CSDN通过智能技术生成

最近做一个抓取qq用户资料的工具,需要获取qq窗口上的消息,以前这种任务是用句柄获取窗口中的信息,现在qq的窗口用的是DirectUI,只有窗口句柄,没有控件句柄,句柄这条路走不通了。不过较新版的qq的部分控件实现了微软的IAccessible接口(称为Microsoft Active Accessibility技术,简称MSAA),可以用另一套函数获取qq窗口的信息。不过要对窗口进行输入还是要靠句柄,上面说过,DirectUI的窗口只有一个句柄,因此模拟输入的时候不需要查找到具体的控件句柄,但要注意获取控件焦点,可能相对传统WinForm的窗口要简单点。

            

先介绍下和句柄操作相关的函数:

using System.Runtime.InteropServices;

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

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

根据类名和窗口标题查找句柄

 

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

        public static extern IntPtr FindWindowEx(IntPtr parentHandle,IntPtr childAfter, string className, string windowTitle);

根据父句柄,前一个句柄,类名和窗口标题查找句柄,这几个信息可以通过VS自带的spy++查询。

 

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

        static extern IntPtr GetDesktopWindow();

返回桌面窗口句柄,被我用来当前一个函数的父句柄。

 

        [DllImport("user32.dll")]

        public extern static int GetWindowText(IntPtr hWnd,StringBuilder lpString, int nMaxCount);

获取指定窗口的标题,WinForm里的控件都是window,但在我们讨论的情况下window就只是窗口了。需要结合StringBuider类使用,不熟悉的可以去预习下。

        [DllImport("User32.dll")]

        public static extern int GetClassName(int hWn

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值