直接切入正题:
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
分享到:
相关推荐
Windows Api 的 .NET 封装,从微软的 .NET 基础类库中提取出来的,方便大家在 C# .NET 中调用 Windows API.
c#.NET万能数据库访问封装类(ACCESS、SQLServer、Oracle)
.net版本WebApi和AccessWebApi两个项目(分别为宿主和调用方)
c#.NET万能数据库访问封装类(ACCESS、SQLServer、Oracle) 带源码cs文件,非txt
ADO.NET Entity Framework使用封装示范代码,这个中封装可以提高开发效率
.net2.0数据库简单封装
使用.net 程序集 对windows api 的封装,包含 user32,kernel32 等核心api,便于.net开发者使用 windowsAPI
封装了数据访问常用的方法,包括数据源,查询,参数配置,存储过程等
C#.NET万能数据库访问封装类ACCESS、SQLServer、Oracle
使用.net 程序集 对windows api 的封装,包含 user32,kernel32 等核心api,便于.net开发者使用 windowsAPI
ADO.NET自己封装SqlHelper类 1、简单封装 2、传递参数封装 3、参数可变封装
用C#,对Blowfish.NET进行了简单的封装。 来源:http://caocao.iteye.com/blog/96902
.net操作数据库的封装
BPL 封装子窗体 示例 BPL类似DLL 但是比DLL更加有效
C#.NET万能数据库访问封装类(ACCESS、SQLServer、Oracle) 这个类封装成dll后,相关数据库连接可在,引用该dll项目的app.config文件中写,如果是web程序,这需要修改代码,将构造函数中获取app.config的信息换成获取...
封装Dapper dbContext类,对Dapper 的增删查改进行封装
1、支付宝电脑端扫码支付API封装 2、微信扫码支付API封装,生成微信支付的二维码地址 3、微信APP支付API封装 4、银联支付API封装 5、开发环境为Visual Studio 2015,无数据库,使用.net 4.0开发。 6、需要各个支付的...
.net5 dapper封装操作数据库
微信二维码扫码支付,APP发起微信支付接口,等等
.net国际化语言封装类库,可直接引用类库进行.net站点的国际化