AccessibleWrapper.cs
上传用户:hbhltzc
上传日期:2022-06-04
资源大小:1925k
文件大小:14k
源码类别:

xml/soap/webservice

开发平台:

Visual C++

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using Accessibility;
  5. using System.Windows.Forms;
  6. using System.Drawing;
  7. using System.Reflection;
  8. using System.Runtime.InteropServices;
  9. using System.IO;
  10. using System.Diagnostics;
  11. namespace UnitTests {
  12.     public class FileComparer : IComparer<string> {
  13.         public int Compare(string a, string b) {
  14.            if (a == null && b == null) return 0;
  15.             if (a == null) return -1;
  16.             if (b == null) return 1;
  17.             // The operating system may or may not have visible "file extensions" so we do an extensionless compare
  18.             return string.Compare(Path.GetFileNameWithoutExtension(a), Path.GetFileNameWithoutExtension(b), StringComparison.CurrentCultureIgnoreCase);
  19.         }
  20.     }
  21.     public class StringComparer : IComparer<string> {
  22.         public int Compare(string a, string b) {
  23.             return String.Compare(a, b, StringComparison.CurrentCultureIgnoreCase);
  24.         }
  25.     }
  26.     public class SystemAccessible : AccessibleObject {
  27.         IAccessible acc;
  28.         int id;
  29.         AccessibleObject parent;
  30.         AccessibleObject firstChild;
  31.         AccessibleObject lastChild;
  32.         AccessibleObject next;
  33.         static Dictionary<object, SystemAccessible> s_Wrappers = new Dictionary<object, SystemAccessible>();
  34.         public SystemAccessible(AccessibleObject parent, IAccessible acc, int id) {
  35.             this.acc = acc;
  36.             this.id = id;
  37.             this.parent = parent;
  38.         }
  39.         public override string Name {
  40.             get {
  41.                 try {
  42.                     if (this.Role == AccessibleRole.WhiteSpace) return null;
  43.                     return acc.get_accName(id);
  44.                 } catch {
  45.                     return null;
  46.                 }
  47.             }
  48.             set {
  49.                 acc.set_accName(id, value);
  50.             }
  51.         }
  52.         public override AccessibleRole Role {
  53.             get {
  54.                 try {
  55.                     int role = (int)acc.get_accRole(id);
  56.                     return (AccessibleRole)role;
  57.                 } catch {
  58.                 }
  59.                 return AccessibleRole.WhiteSpace;
  60.             }
  61.         }
  62.         public override AccessibleObject GetFocused() {
  63.             try {
  64.                 object focus = acc.accFocus;                
  65.                 IAccessible a = focus as IAccessible;
  66.                 if (a != null) return Wrap(a);
  67.                 if (focus is int) {
  68.                     return new SystemAccessible(this, this.acc, (int)focus);
  69.                 }
  70.             } catch {
  71.             }
  72.             return null;
  73.         }
  74.         public override string DefaultAction {
  75.             get {
  76.                 try {
  77.                     return acc.get_accDefaultAction(id);
  78.                 } catch {
  79.                     return null;
  80.                 }
  81.             }
  82.         }
  83.         public override void DoDefaultAction() {
  84.             try {
  85.                 acc.accDoDefaultAction(id);
  86.             } catch {
  87.             }
  88.         }
  89.         public override string Description {
  90.             get {
  91.                 try {
  92.                     return acc.get_accDescription(id);
  93.                 } catch {
  94.                     return null;
  95.                 }
  96.             }
  97.         }
  98.         public override string Help {
  99.             get {
  100.                 try {
  101.                     return acc.get_accHelp(id);
  102.                 } catch {
  103.                     return null;
  104.                 }
  105.             }
  106.         }
  107.         public override AccessibleStates State {
  108.             get {
  109.                 try {
  110.                     int i = (int)acc.get_accState(id);
  111.                     return (AccessibleStates)i;
  112.                 } catch {
  113.                     return AccessibleStates.None;
  114.                 }
  115.             }
  116.         }
  117.         public override string Value {
  118.             get {
  119.                 try {
  120.                     return acc.get_accValue(id);
  121.                 } catch {
  122.                     return null;
  123.                 }
  124.             }
  125.             set {
  126.                 acc.set_accValue(id, value);
  127.             }
  128.         }
  129.         public IntPtr Hwnd {
  130.             get {
  131.                 IntPtr hwnd;
  132.                 WindowFromAccessibleObject(this.acc, out hwnd);
  133.                 return hwnd;
  134.             }
  135.         }
  136.         public override Rectangle Bounds {
  137.             get {
  138.                 try {
  139.                     int left, top, width, height;
  140.                     acc.accLocation(out left, out top, out width, out height, id);
  141.                     return new Rectangle(left, top, width, height);
  142.                 } catch {
  143.                 }
  144.                 return Rectangle.Empty;
  145.             }
  146.         }
  147.         public override int GetChildCount() {
  148.             if (id == CHILDID_SELF) {
  149.                 try {
  150.                     if (this.Role == AccessibleRole.WhiteSpace) return 0;
  151.                     return acc.accChildCount;
  152.                 } catch {
  153.                     // ignore errors.
  154.                 }
  155.             }
  156.             return 0;
  157.         }
  158.         public override AccessibleObject GetChild(int index) {
  159.             try {
  160.                 object o = acc.get_accChild(index);
  161.                 if (o == null && this.GetChildCount() > 0) {
  162.                     return new SystemAccessible(this, this.acc, index);
  163.                 }
  164.                 return Wrap(o);
  165.             } catch {
  166.                 return null;
  167.             }
  168.         }
  169.         AccessibleObject NavigateToChild(AccessibleObject acc, int index) {
  170.             AccessibleObject c = acc.Navigate(AccessibleNavigation.FirstChild);
  171.             while (--index > 0 && c != null) {
  172.                 c = c.Navigate(AccessibleNavigation.Next);
  173.             }
  174.             return c;
  175.         }
  176.         public override AccessibleObject GetSelected() {
  177.             try {
  178.                 object s = acc.accSelection;
  179.                 return Wrap(s);
  180.             } catch {
  181.                 return null;
  182.             }
  183.         }
  184.         public override int GetHelpTopic(out string fileName) {
  185.             try {
  186.                 return acc.get_accHelpTopic(out fileName, this.id);                
  187.             } catch {
  188.                 fileName = null;
  189.                 return -1;
  190.             }
  191.         }
  192.         public override AccessibleObject HitTest(int x, int y) {
  193.             try {
  194.                 object o = acc.accHitTest(x, y);
  195.                 return Wrap(o);
  196.             } catch (Exception) {
  197.                 return null;
  198.             }            
  199.         }
  200.         public override string KeyboardShortcut {
  201.             get {
  202.                 try {
  203.                     return acc.get_accKeyboardShortcut(this.id);
  204.                 } catch (Exception) {
  205.                     return null;
  206.                 }
  207.             }
  208.         }
  209.         public override AccessibleObject Navigate(AccessibleNavigation navdir) {
  210.             try {
  211.                 object o = acc.accNavigate((int)navdir, this.id);
  212.                 return Wrap(o);
  213.             } catch (Exception) {
  214.                 return null;
  215.             }
  216.         }
  217.         public override void Select(AccessibleSelection flags) {
  218.             acc.accSelect((int)flags, this.id);
  219.         }
  220.         public SystemAccessible FirstChild {
  221.             get {
  222.                 try {
  223.                     if (this.firstChild == null) {
  224.                         this.firstChild = this.Navigate(AccessibleNavigation.FirstChild);                        
  225.                     }
  226.                     return (SystemAccessible)firstChild;
  227.                 } catch {
  228.                     return null;
  229.                 }
  230.             }
  231.         }
  232.         public SystemAccessible LastChild {
  233.             get {
  234.                 try {
  235.                     if (this.lastChild == null) {
  236.                         this.lastChild = this.Navigate(AccessibleNavigation.LastChild);                        
  237.                     }
  238.                     return (SystemAccessible)lastChild;
  239.                 } catch {
  240.                     return null;
  241.                 }
  242.             }
  243.         }
  244.         public SystemAccessible NextSibling {
  245.             get {
  246.                 try {
  247.                     if (this.next == null) {
  248.                         this.next = this.Navigate(AccessibleNavigation.Next);                        
  249.                     }
  250.                     return (SystemAccessible )next;
  251.                 } catch {
  252.                     return null;
  253.                 }
  254.             }
  255.         }
  256.         public SystemAccessible FindChild(string name) {
  257.             return FindChild(name, new StringComparer());
  258.         }
  259.         public SystemAccessible[] GetChildren() {
  260.             List<SystemAccessible> result = new List<SystemAccessible>();
  261.             try {
  262.                 SystemAccessible child = this.FirstChild;
  263.                 if (child == null) {
  264.                     for (int i = 1, n = this.GetChildCount(); i <= n; i++) {
  265.                         child = (SystemAccessible)this.GetChild(i);
  266.                         if (child != null) result.Add(child);
  267.                     }
  268.                 } else {
  269.                     SystemAccessible last = this.LastChild;
  270.                     while (child != null) {
  271.                         result.Add(child);
  272.                         if (child == last)
  273.                             break;
  274.                         child = (SystemAccessible)child.Navigate(AccessibleNavigation.Next);
  275.                     }
  276.                 }
  277.             } catch {
  278.             }
  279.             return result.ToArray();
  280.         }
  281.         public SystemAccessible FindChild(string name, IComparer<string> ic) {
  282.             foreach (SystemAccessible child in GetChildren()) {
  283.                 try {
  284.                     string childName = child.Name;
  285. #if DEBUG
  286.                     Trace.WriteLine("Found child: " + childName);
  287. #endif
  288.                     if (ic.Compare(name, childName) == 0) {
  289.                         return (SystemAccessible)child;
  290.                     }
  291.                 } catch {
  292.                 }
  293.             }
  294.             return null;
  295.         }
  296.         public AccessibleObject FindChild(int i) {
  297.             foreach (SystemAccessible child in GetChildren()) {
  298.                 i--;
  299.                 if (i == 0) {
  300.                     return child;
  301.                 }
  302.             }
  303.             return null;
  304.         }
  305.         public AccessibleObject FindChildByRole(AccessibleRole role) {
  306.             foreach (SystemAccessible child in GetChildren()) {
  307.                 if (child.Role == role) {
  308.                     return child;
  309.                 }
  310.             }
  311.             return null;
  312.         }
  313.         public override AccessibleObject Parent {
  314.             get {
  315.                 if (this.parent != null) return parent;
  316.                 return this.Navigate(AccessibleNavigation.Up);
  317.             }
  318.         }
  319.         // Implementation --------------------------------------------------------
  320.         SystemAccessible Wrap(object obj) {
  321.             return Wrap(this, obj as IAccessible, CHILDID_SELF);
  322.         }
  323.         SystemAccessible Wrap(object obj, int id) {
  324.             return Wrap(this, obj as IAccessible, id);
  325.         }
  326.         static SystemAccessible Wrap(AccessibleObject parent, IAccessible acc, int id) {
  327.             if (acc == null) return null;
  328.             if (s_Wrappers.ContainsKey(acc)) {
  329.                 return s_Wrappers[acc];
  330.             }
  331.             SystemAccessible wrapper = new SystemAccessible(parent, acc, id);
  332.             s_Wrappers[acc] = wrapper;
  333.             return wrapper;
  334.         }
  335.         const uint OBJID_CLIENT = 0xFFFFFFFC;
  336.         static int CHILDID_SELF = 0; 
  337.         public static SystemAccessible AccessibleObjectForWindow(IntPtr hwnd) {
  338.             Guid guid = typeof(IAccessible).GUID;
  339.             IntPtr ptr;
  340.             int hr = AccessibleObjectFromWindow(hwnd, OBJID_CLIENT, ref guid, out ptr);
  341.             if (hr == 0) {
  342.                 try {
  343.                     object obj = Marshal.GetObjectForIUnknown(ptr);
  344.                     return Wrap(null, obj as IAccessible, CHILDID_SELF);
  345.                 } finally {
  346.                     Marshal.Release(ptr);
  347.                 }
  348.             }
  349.             throw new ApplicationException("AccessibleObjectFromWindow failed");
  350.         }
  351.         public static SystemAccessible AccessibleWindowObjectAt(Point pt) {
  352.             POINT p = new POINT();
  353.             p.x = pt.X;
  354.             p.y = pt.Y;
  355.             IntPtr hwnd = WindowFromPoint(p);
  356.             if (hwnd != IntPtr.Zero) {
  357.                 return SystemAccessible.AccessibleObjectForWindow(hwnd);
  358.             }
  359.             return null;
  360.         }
  361.         public static SystemAccessible AccessibleObjectAt(Point pt) {
  362.             POINT p = new POINT();
  363.             p.x = pt.X;
  364.             p.y = pt.Y;
  365.             IAccessible acc;
  366.             object id;
  367.             int hr = AccessibleObjectFromPoint(p, out acc, out id);
  368.             if (hr == 0) {
  369.                 return Wrap(null, acc, (int)id);
  370.             }
  371.             throw new ApplicationException("AccessibleObjectFromWindow failed");
  372.         }
  373.         [DllImport("OleAcc", CharSet = CharSet.Unicode)]
  374.         static extern int AccessibleObjectFromWindow(IntPtr hwnd, uint dwObjectID, ref Guid riid, out IntPtr pObject);
  375.         [DllImport("OleAcc", CharSet = CharSet.Unicode)]
  376.         static extern int WindowFromAccessibleObject(IAccessible pacc, out IntPtr hwnd);        
  377.         [DllImport("User32")]
  378.         static extern IntPtr WindowFromPoint(POINT pt);
  379.         [DllImport("User32", CharSet = CharSet.Unicode)]
  380.         static extern bool GetWindowRect(IntPtr hWnd, out RECT rect);
  381.         [StructLayout(LayoutKind.Sequential)]
  382.         struct POINT {
  383.             public int x;
  384.             public int y;
  385.         };
  386.         [DllImport("OleAcc", CharSet = CharSet.Unicode)]
  387.         static extern int AccessibleObjectFromPoint(POINT ptScreen, out IAccessible acc, out object varChild);
  388.     }
  389.     [StructLayout(LayoutKind.Sequential)]
  390.     public struct RECT {
  391.         public int left;
  392.         public int top;
  393.         public int right;
  394.         public int bottom;
  395.     };
  396. }