早期僅支援 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 元素。
類別設計支援兩種操作模式自動切換:
FindWindowEx 取得輸入框(RichEdit20W)與發送按鈕(標題「發送(&S)」)的 HWND,使用 SendMessage(WM_SETTEXT/WM_CLICK) 操作AccessibleObjectFromWindow 取得 IAccessible 介面,遞迴遍歷 UI 樹狀結構,依據 accRole(角色)與 accName(名稱)定位「輸入」編輯框(Role=42)與「發送按鈕」(Role=43),再呼叫 set_accValue 與 accDoDefaultAction 完成操作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);
DirectUIHWND 視窗類別(WPF 主視窗容器){618736E0-3C3D-11CF-810C-00AA00389B71} (IID_IAccessible) 呼叫 AccessibleObjectFromWindow 取得根 IAccessibleget_accRole 與 get_accName 篩選目標控制項作者誠實指出:Messenger 版本眾多、外掛豐富,UI 結構差異大,相容性有限。隨著 Skype 整合與 Messenger 服務終止(2013/2014),此技術已無實際部署價值。但 MSAA/UI Automation 無障礙自動化技術本身在測試自動化、RPA、輔助工具開發中仍具高度參考價值。
現代建議:新專案請改用 System.Windows.Automation (UIA) 或第三方庫(如 FlaUI、White、Selenium + WinAppDriver),提供更穩定的元素定位與跨框架支援。