Go homepage(回首页)
Upload pictures (上传图片)
Write articles (发文字帖)

The author:(作者)delv
published in(发表于) 2014/1/23 3:12:36
C#.net,控制Windows,Messenger和Windows,Live,Messenger_[Asp.Net教程]

C#.net 控制Windows Messenger和Windows Live Messenger_[Asp.Net教程]

前端时间做了Messenger助手,后来发现只支持Windows Messenger,不支持Windows Live Messenger,最近改了一下,用到了Active Accessibility编程,代码如下:
using System;
using Accessibility;


namespace MessengerHelper
{
/**////


/// 对Messenger窗口进行操作
///

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);
}
}


/**////


/// 输入消息
///

///
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) ;
}
}


/**////


/// 发送消息
///

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
{
/**////


/// 调用Window API
///

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产品及版本繁多,而且插件也不少,所以兼容性不是很强,实用性不大,但是,个人觉得代码还是有一些借鉴作用。
from:博客园







If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)





QQ:154298438
QQ:417480759