.NET下基于API封装的DirectUIHWND窗体访问
来源:商务互联
作者:
时间:2008-04-01
点击:
直接切入正题:
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
0
最新评论共有 0 位网友发表了评论
查看所有评论
发表评论
- 栏目列表
-
热点关注
- 一个vb.net的用户登陆页面
- 在VB.NET中利用Split和Rep
- 用VB.NET设定当前工作路径
- VB.NET中让Textbox只能输
- VB.NET结构化异常处理基础
- 用VB.NET设计各种形状的窗
- VB.NET中LISTVIEW排序
- 在 VB.NET 中写注册表程序
- 一段显示下载进度条的下载
- VB.NET读取INI文件设置信
- VB.NET中HOOK功能的应用(
- 在VB.NET中如何确定两个日
- VB.NET中层次数据绑定Tree
- 掌握VB中的ADO数据对象编
- VB.NET 2002 与 VB.NET 20
- 浅议Visual Basic.NET中HO
- 在vb中实现超连接的方法!
- 使用.NET2.0编写COM组件供
- .NET下基于API封装的Direc
- 完整的VB.NET的语法解析程

