精灵王
- 注册日期2010-12-08
- 发帖数640
- QQ
- 火币1103枚
- 粉丝120
- 关注75
|
阅读:3701回复:0
c#控制windows messenger和windows live messenger窗口发送消息_c#应用
楼主#
更多
发布于:2011-01-08 21:14
| | | | 前端时间做了Messenger助手,后来发现只支持视窗系统 Messenger,不支持视窗系统 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产品及版本繁多,而且插件也不少,所以兼容性不是非常强,实用性不大,不过,个人觉得代码还是有一些借鉴作用。 更多黑客技术 黑客软件 计算机技术 编程技术 网站技术 qq技术 IT新闻 黑客基地 请访问 灯火安全联盟 灯火黑客 www.hack8888.com/bbs
| | | | |
|