`
tolys
  • 浏览: 115605 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

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

阅读更多
 直接切入正题:
  
  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
分享到:
评论

相关推荐

    .NET 的 Windows API的封装

    标题中的".NET的Windows API封装"指的是将Windows API函数包装成.NET的类或方法,使得.NET开发者可以用C#这样的高级语言来调用。这种方式大大简化了跨语言调用的复杂性,提高了代码的可读性和可维护性。 描述中提到...

    Dome-ASP.NET CORE 6 webapi 使用 EF DBFirst 配合 sql server

    综上所述,"Dome-ASP.NET CORE 6 webapi 使用 EF DBFirst 配合 sql server"是一个基于最新.NET Core版本的Web服务开发实例,它利用了EF的DBFirst策略,使得开发人员能够快速地构建与SQL Server数据库交互的API服务。

    .net版本WebApi和AccessWebApi两个项目(分别为宿主和调用方)

    此项目包含两个主要部分:“.NET版本WebApi”和“AccessWebApi”,它们分别扮演宿主和调用方的角色。本文将深入探讨这两个项目的核心概念、实现方式以及它们在实际开发中的应用场景。 首先,我们来看“.NET版本Web...

    使用.net 程序集 对windows api 的封装(源码)

    本主题主要围绕如何使用.NET程序集对Windows API进行封装,特别是对`kernel32`和`user32`库的封装,以方便.NET开发者更轻松地调用Windows操作系统的核心功能。 首先,`kernel32`和`user32`是Windows API中的两个...

    c#.NET万能数据库访问封装类(带源码cs文件,非txt)

    c#.NET万能数据库访问封装类(ACCESS、SQLServer、Oracle) 带源码cs文件,非txt

    利用vb.net制作的科学计算器windows窗体程序

    该VB.NET制作的科学计算器是一个基于Windows窗体的应用程序,旨在提供一个用户友好的界面,进行各种数学运算,包括基础的四则运算以及更复杂的初等函数计算。这个项目对于初学者来说是一个很好的实践案例,因为它...

    ADO.NET Entity Framework使用封装示范代码

    ADO.NET Entity Framework(简称EF)是微软提供的一款强大的数据访问框架,它使得开发者能够以对象关系映射(ORM)的方式操作数据库,极大地简化了数据库编程。在这个"ADO.NET Entity Framework使用封装示范代码"中...

    C# .net 6 rabbitMq发布订阅类封装

    RabbitListener是mq消息的监听,BasicPublish丢消息的方法

    ASP.NET使用WebService创建航班查询窗体

    ASP.NET是一种基于.NET框架的服务器端编程模型,用于构建动态网站、Web应用程序和Web服务。在本项目中,“ASP.NET使用WebService创建航班查询窗体”是利用ASP.NET技术和WebService来实现一个在线航班查询功能的实例...

    .net谷歌地图API

    首先,`.NET谷歌地图API`是谷歌提供的一个接口,它允许.NET开发者通过编程方式访问和操作谷歌地图服务。这包括加载地图、设置缩放级别、添加标记、绘制路径、获取地理位置信息等功能。API通常以JavaScript或服务器端...

    .net操作数据库的封装dll

    .net操作数据库的封装

    C#.net8创建webapi,使用SqlSugar,仓储模式,DTO,服务层,控制层的综合应用

    在本文中,我们将深入探讨如何使用C#.NET 8创建一个Web API,同时结合SqlSugar作为ORM工具,以及实现仓储模式、DTO(Data Transfer Object)转换、服务层和服务控制层的架构设计。这个综合应用旨在提供一个高效且可...

    使用AngularJs ASP.NET MVC Web API EF构建一个多层SPA的例子

    在本文中,我们将深入探讨如何使用AngularJS、ASP.NET MVC、Web API和Entity Framework(EF)构建一个完整的多层Single Page Application(SPA)。这个例子,名为"SimpleTaskSystem",展示了这些技术如何协同工作,...

    .Net封装Dapper dbContext类

    封装Dapper dbContext类,对Dapper 的增删查改进行封装

    .Net flash control api

    标题中的".Net flash control api"指的是在.NET框架下用于管理和操作Flash内容的API接口。这样的工具通常被开发者用来在Web应用程序中集成、控制和交互与Adobe Flash Player相关的功能。.NET API提供了丰富的类库和...

    C#.NET万能数据库访问封装类(ACCESS、SQLServer、Oracle)

    C#.NET万能数据库访问封装类(ACCESS、SQLServer、Oracle) 这个类封装成dll后,相关数据库连接可在,引用该dll项目的app.config文件中写,如果是web程序,这需要修改代码,将构造函数中获取app.config的信息换成获取...

    ASP.NET WebAPI+mvc4.0+EasyUI快速开发框架+通用权限管理系统源码

    1、基于ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout的架构设计开发 2、采用MVC的框架模式,具有耦合性低、重用性高、生命周期成本低、可维护性高、有利软件工程化管理等优点 3、采用WebAPI,客户端完全摆脱了代理...

    C#asp.net支付宝微信银联支付API调用封装源码

    1、支付宝电脑端扫码支付API封装 2、微信扫码支付API封装,生成微信支付的二维码地址 3、微信APP支付API封装 4、银联支付API封装 5、开发环境为Visual Studio 2015,无数据库,使用.net 4.0开发。 6、需要各个支付的...

    使用.net 程序集 对windows api 的封装

    使用.net 程序集 对windows api 的封装,包含 user32,kernel32 等核心api,便于.net开发者使用 windowsAPI

    .net二维游戏封装类

    《.NET二维游戏封装类详解》 在游戏开发领域,.NET框架以其强大的库支持和易用性,逐渐成为开发者们构建2D游戏的热门选择。本文将深入探讨标题为".net二维游戏封装类"的相关知识点,这通常涉及到游戏的核心逻辑、...

Global site tag (gtag.js) - Google Analytics