首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 控制 Windows Messenger 與 Live Messenger 視窗自動發送訊息:MSAA 無障礙技術實戰

     編輯:關於C語言

從傳統 Win32 到 MSAA:跨版本 Messenger 自動化演進

早期僅支援 Windows Messenger(MSN Messenger 4.x/5.x)的自動化工具,在 Windows Live Messenger(8.x/9.x/2009/2011)推出後失效。主因在於 Live Messenger 採用 WPF/DirectUI 技術重寫介面,傳統 FindWindowEx 尋找 RichEdit20W、Button 類別名稱的方式不再適用。解決方案是引入 Microsoft Active Accessibility (MSAA) 技術,透過 IAccessible 介面操作 UI 元素。

核心架構:MessengerWindowHelper 雙模式適配

類別設計支援兩種操作模式自動切換:

  • 傳統模式:透過 FindWindowEx 取得輸入框(RichEdit20W)與發送按鈕(標題「發送(&S)」)的 HWND,使用 SendMessage(WM_SETTEXT/WM_CLICK) 操作
  • MSAA 模式:當傳統模式失敗(Handle 為零)時,啟用 AccessibleObjectFromWindow 取得 IAccessible 介面,遞迴遍歷 UI 樹狀結構,依據 accRole(角色)與 accName(名稱)定位「輸入」編輯框(Role=42)與「發送按鈕」(Role=43),再呼叫 set_accValue 與 accDoDefaultAction 完成操作

關鍵 API 與常數定義 (Win32 類別)

public const int WM_SETTEXT = 0x000C;
public const int WM_CLICK = 0x00F5;       // BM_CLICK
public const int CHILDID_SELF = 0;
public const int OBJID_CLIENT = -4;       // 取得用戶端區域無障礙物件

[DllImport("user32.dll")] 
public static extern IntPtr FindWindowEx(IntPtr parent, IntPtr childAfter, string className, string windowTitle);

[DllImport("user32.dll", EntryPoint="SendMessage")]
public static extern int SendMessageString(IntPtr hwnd, int msg, IntPtr wParam, string lParam);

[DllImport("Oleacc.dll")]
public static extern int AccessibleObjectFromWindow(IntPtr hwnd, int dwObjectID, ref Guid riid, ref IAccessible ppvObject);

[DllImport("Oleacc.dll")]
public static extern int AccessibleChildren(IAccessible paccContainer, int iChildStart, int cChildren, [Out] object[] rgvarChildren, out int pcObtained);

MSAA 物件搜尋邏輯:GetAccessibleObjects 詳細流程

  1. 尋找 DirectUIHWND 視窗類別(WPF 主視窗容器)
  2. 使用 GUID {618736E0-3C3D-11CF-810C-00AA00389B71} (IID_IAccessible) 呼叫 AccessibleObjectFromWindow 取得根 IAccessible
  3. 取得其父節點(通常為最上層容器)
  4. 遞迴列舉所有子元素,依據 get_accRole 與 get_accName 篩選目標控制項

實用性評估與現代替代方案

作者誠實指出:Messenger 版本眾多、外掛豐富,UI 結構差異大,相容性有限。隨著 Skype 整合與 Messenger 服務終止(2013/2014),此技術已無實際部署價值。但 MSAA/UI Automation 無障礙自動化技術本身在測試自動化、RPA、輔助工具開發中仍具高度參考價值。

現代建議:新專案請改用 System.Windows.Automation (UIA) 或第三方庫(如 FlaUI、White、Selenium + WinAppDriver),提供更穩定的元素定位與跨框架支援。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved