首 页 | 精品电影 | 音乐天堂 | 在线游戏 | Flash MTV | 三湘书屋 | 幽默笑话 | 三湘图库 | 美女写真 | IT知识库 | QQ贴图 | 加入书签

网页制作网络编程图形图象操作系统冲浪宝典软件教学网络安全认证考试通信技术电子商务业内动态书籍教程原码

最近更新 文章分类 多媒体类 精品软件

本站搜索:
您的位置:三湘时空 -> IT知识库 -> 文章分类 -> C#应用 -> C#控制Windows Messenger和Windows Live Messenger窗口发送消息
C#控制Windows Messenger和Windows Live Messenger窗口发送消息


文章类别:C#应用 来源: 作者: 发表日期:2006-12-7 字体:[ ]

小游戏 | 在线影院 | 幽默笑话 | 源码下载 | Flash MTV | 音乐试听 | 书屋 | 美女写真

前端时间做了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 == "发送按钮")
                        {
                            submitButtion = childChild ;
                        }

                        if (inputBox != null && submitButtion != null)
                        {
                            break ;
                        }
                    }                   
                    break ;
                }                       
            }           
        }
    }
}

using System;
using System.Runtime.InteropServices;

using Accessibility;

namespace MessengerHelper
{
    /**//// <summary>
    /// 调用Window API
    /// </summary>
    public class Win32
    {
        public const int WM_SETTEXT = 0x000C;
        public const int WM_CLICK = 0x00F5;
 
        public const int CHILDID_SELF  = 0;
        public const int CHILDID_1   = 1;
        public const int OBJID_CLIENT  = -4;

        [DllImport("User32.dll")]
        public static extern Int32 FindWindow(String lpClassName,String lpWindowName);

        [DllImport("user32.dll", CharSet=CharSet.Auto)]
        public static extern IntPtr FindWindowEx(
            IntPtr parentHandle,
            IntPtr childAfter,
            string lpszClass,
            int sWindowTitle  /**//*HWND*/);

        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className,  string  windowTitle);       

        [DllImport("user32.dll", EntryPoint="SendMessage")]
        public static extern int SendMessageString (IntPtr hwnd, int wMsg, IntPtr wParam, string lParam);

        [DllImport("user32.dll", EntryPoint="SendMessage")]
        public static extern int SendMessageInt (IntPtr hwnd, int wMsg, IntPtr wParam, int lParam);

        [DllImport("Oleacc.dll")]
      public static extern int AccessibleObjectFromWindow(
      IntPtr hwnd,
      int dwObjectID,
      ref Guid refID,
      ref IAccessible ppvObject);

        [DllImport("Oleacc.dll")]
        public static extern int WindowFromAccessibleObject(
            IAccessible pacc,
            out IntPtr phwnd);
      
      [DllImport("Oleacc.dll")]
      public static extern int AccessibleChildren(
      Accessibility.IAccessible paccContainer,
      int iChildStart,
      int cChildren,
      [Out] object[] rgvarChildren,
      out int pcObtained);   
    }
}

由于微软出的Messenger产品及版本繁多,而且插件也不少,所以兼容性不是很强,实用性不大,但是,个人觉得代码还是有一些借鉴作用。

上一篇:HTML:关闭(离开)浏览器窗口前的 系统提示 下一篇:对C#下函数,委托,事件的一点理解!
本栏目热门文章
·C# Socket编程 2006-3-14
·[C#]解决读写包含汉字的txt文件时乱码的问题 2005-10-4
·在C#.net中将查询数据导入EXCEL表输出 2006-3-24
·c#操作word表格 2005-10-4
·C#.Net网络程序开发-Socket篇 2006-3-14
·使用C#在进度条中显示复制文件的进度 2005-11-13
·C#中使用SendMessage 2005-10-4
·利用C#进行AutoCAD的二次开发(二) 2005-10-4
·利用C#进行AutoCAD的二次开发(一) 2005-10-4
·用Visual C#获得计算机名称和IP地址 2005-10-4
新近更新文章
·用C#动态创建Access数据库 2006-12-7
·对C#下函数,委托,事件的一点理解! 2006-12-7
·C#控制Windows Messenger和Windows Live 2006-12-7
·Visual c#的Excle编程 2006-12-7
·C#2.0新的语法扩充(泛型,迭代器,匿名方法) 2006-12-7
·对C#委托及事件委托的理解 2006-12-7
·C# GridView 排序及分页 2006-12-7
·RadioBox、CheckBox和Validating事件的相关处 2006-12-7
·c#远程获取网页内容 2006-12-7
·由C++转向C#:我们需要注意哪些方面的变化 2006-12-7
首 页 | 软件发布 | 广告联系 | 下载帮助 | 意见反馈 | 网站地图
  CopyRight? 2002-2004 WWW.SXSKY.NET? All Rights Reserved
三湘时空 站长QQ:82675303 Email: