程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#控制Windows Messenger和Windows Live Messenger窗口發送消息

C#控制Windows Messenger和Windows Live Messenger窗口發送消息

編輯:關於C語言

前端時間做了Messenger助手,後來發現只支持Windows(Windows培訓 ) Messenger,不支持Windows Live Messenger,最近改了一下,用到了Active Accessibility編程,代碼如下:

using System;

using Accessibility;

http://www.mscto.com

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

}

http://www.mscto.com

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產品及版本繁多,而且插件也不少,所以兼容性不是很強,實用性不大,但是,個人覺得代碼還是有一些借鑒作用。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved