c#控制windows messenger和windows live messen…
2008-02-23 05:42:16来源:互联网 阅读 ()
前端时间做了Messenger助手,后来发现只支持Windows Messenger,不支持Windows Live Messenger,最近改了一下,用到了Active Accessibility编程,代码如下:
using System;
using Accessibility;
namespace MessengerHelper
{
/**//// <summary>
/// 对Messenger窗口进行操作
/// </summary>
public class MessengerWindowHelper
{
IntPtr _messengerWindowHandle ;
IntPtr _inputBoxHandle ;
IntPtr _submitButtonHandle ;
IAccessible _inputBox ;
IAccessible _submitButton ;
private MessengerWindowHelper(){}
public MessengerWindowHelper(IntPtr windowHandle)
{
_messengerWindowHandle = windowHandle ;
_inputBoxHandle = GetInputBoxHandle() ;
_submitButtonHandle = GetSubmitButton() ;
if (_inputBoxHandle == IntPtr.Zero && _submitButtonHandle == IntPtr.Zero)
{
GetAccessibleObjects(_messengerWindowHandle, out _inputBox, out _submitButton);
}
}
/**//// <summary>
/// 输入消息
/// </summary>
/// <param name="message"></param>
public void InputMessage(string message)
{
if (_inputBox == null)
{
Win32.SendMessageString(_inputBoxHandle, Win32.WM_SETTEXT, IntPtr.Zero, message);
}
else
{
_inputBox.set_accValue(Win32.CHILDID_SELF, message) ;
}
}
/**//// <summary>
/// 发送消息
/// </summary>
public void SendMessage()
{
if (_submitButton == null)
{
Win32.SendMessageInt(_submitButtonHandle, Win32.WM_CLICK, IntPtr.Zero, 0);
}
else
{
_submitButton.accDoDefaultAction(Win32.CHILDID_SELF) ;
}
}
private IntPtr GetInputBoxHandle()
{
IntPtr topInputHandle = Win32.FindWindowEx(_messengerWindowHandle, System.IntPtr.Zero, "RichEdit20W", null) ;
return Win32.FindWindowEx(_messengerWindowHandle, topInputHandle, "RichEdit20W", null) ;
}
private IntPtr GetSubmitButton()
{
return Win32.FindWindowEx(_messengerWindowHandle, System.IntPtr.Zero, "Button", "发送(&S)") ;
}
private object[] GetAccessibleChildren(IAccessible paccContainer)
{
object[] rgvarChildren = new object[paccContainer.accChildCount] ;
int pcObtained ;
Win32.AccessibleChildren(paccContainer,0,paccContainer.accChildCount, rgvarChildren, out pcObtained);
return rgvarChildren ;
}
private void GetAccessibleObjects(System.IntPtr imWindowHwnd, out IAccessible inputBox, out IAccessible submitButtion)
{
System.IntPtr ptrUIHWND = Win32.FindWindowEx(imWindowHwnd, System.IntPtr.Zero, "DirectUIHWND", 0);
Guid guidCOM = new Guid(0x618736E0,0x3C3D,0x11CF,0x81,0xC,0x0,0xAA,0x0,0x38,0x9B,0x71);
Accessibility.IAccessible IACurrent = null;
Win32.AccessibleObjectFromWindow(ptrUIHWND,(int)Win32.OBJID_CLIENT,ref guidCOM,ref IACurrent);
IACurrent = (IAccessible)IACurrent.accParent;
int childCount = IACurrent.accChildCount;
object[] windowChildren = new object[childCount];
int pcObtained;
Win32.AccessibleChildren(IACurrent, 0, childCount, windowChildren, out pcObtained);
inputBox = null ;
submitButtion = null ;
string accName ;
int accRole ;
foreach(IAccessible child in windowChildren)
{
accRole = (int)child.get_accRole(Win32.CHILDID_SELF) ;
accName = child.get_accName(Win32.CHILDID_SELF) ;
if (accRole == 10)
{
object[] clientChilren = GetAccessibleChildren(child) ;
IAccessible client = (IAccessible)clientChilren[0] ;
clientChilren = GetAccessibleChildren(client) ;
foreach (IAccessible childChild in clientChilren)
{
accRole = (int)childChild.get_accRole(Win32.CHILDID_SELF) ;
accName = childChild.get_accName(Win32.CHILDID_SELF) ;
if (accRole == 42 && accName == "输入")
{
inputBox = childChild ;
}
if (accRole == 43 && accName == "发送按钮")
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash