.NET下基于API封装的DirectUIHWND窗体访问

王朝c#·作者佚名  2008-05-19
宽屏版  字体: |||超大  

直接切入正题:

1.添加引用. 项目-添加引用-C:\Progmme~1\MSN Messenger\msnmsgr.exe

2. using MessengerAPI;

声明:

private MessengerAPI.MessengerClass msn;

private MessengerAPI.IMessengerConversationWnd msnMsgWnd;

3.Init里添加:

msn = new MessengerClass();

msn.OnIMWindowCreated +=new DMessengerEvents_OnIMWindowCreatedEventHandler(msn_OnIMWindowCreated);

msn.OnIMWindowDestroyed +=new DMessengerEvents_OnIMWindowDestroyedEventHandler(msn_OnIMWindowDestroyed);

4.

private void msn_OnIMWindowCreated(object pIMWindow)

{

msnMsgWnd = (IMessengerConversationWnd) pIMWindow; //取得IM窗口句柄

#region Get IM Message

System.IntPtr ptrUIHWND = NativeWIN32.FindWindowEx(msnMsgWnd.HWND, 0, "DirectUIHWND", 0);

//取得窗口内DirectUIHWND句柄

Guid guidCOM= new Guid(0x618736E0,0x3C3D,0x11CF,0x81,0xC,0x0,0xAA,0x0,0x38,0x9B,0x71);

//COM的GUID

IAccessible IACurrent=null;

//IAccessible集

try

{

NativeWIN32.AccessibleObjectFromWindow(ptrUIHWND,(int)NativeMsg.OBJID_CLIENT,ref guidCOM,ref IACurrent); //取得ptrUIHWND中IAccessible集

IACurrent = (IAccessible)IACurrent.accParent;

//其父,才是IAccessible集真正的容器

int _ChildCount = IACurrent.accChildCount;

object[] _Children = new object[_ChildCount];

int _out;

NativeWIN32.AccessibleChildren(IACurrent,0,_ChildCount-1,_Children,out _out); //从IACurrent中,将所有子IAccessible加入_Children数组中

foreach(IAccessible _child in _Children)

{

string _accName = _child.get_accName((int)NativeMsg.CHILDID_SELF);

}

}

catch(Exception ex)

{

throw ex;

}

#endregion

}

private void msn_OnIMWindowDestroyed(object pIMWindow)

{

msnMsgWnd = null;

}

5.直接查找消息窗体的方法

Private void FindIMwindow()

{System.IntPtr hWndStart;

int _next = 0;

do

{

hWndStart = NativeWIN32.FindWindowEx(0, _next, "IMWindowClass", 0);

_next =

hWndStart.ToInt32();

}while(_next != 0);

}

6.最后是API声明

#region API wrapper

public class NativeWIN32

{

[DllImport("user32.dll", CharSet=CharSet.Auto)]

public static extern IntPtr FindWindowEx(

int parent /*HWND*/,

int next /*HWND*/,

string lpszClass,

string sWindowTitle);

[DllImport("Oleacc.dll")]

public static extern int AccessibleObjectFromWindow(

IntPtr hwnd,

int dwObjectID,

Guid refID,

ref IAccessible ppvObject);

[DllImport("Oleacc.dll")]

public static extern int AccessibleChildren(

Accessibility.IAccessible paccContainer,

int iChildStart,

int cChildren,

[Out] object[] rgvarChildren,

out int pcObtained);

}

public enum NativeMsg:long {

CHILDID_SELF

= 0,

CHILDID_1

= 1,

OBJID_CLIENT

= 0xFFFFFFC

}

#endregion

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有