cxaccessibility.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 1,048 行 · 第 1/3 页

PAS
1,048
字号

{********************************************************************}
{                                                                    }
{           Developer Express Visual Component Library               }
{           Express Cross Platform Library graphics classes          }
{                                                                    }
{           Copyright (c) 2000-2008 Developer Express Inc.           }
{           ALL RIGHTS RESERVED                                      }
{                                                                    }
{   The entire contents of this file is protected by U.S. and        }
{   International Copyright Laws. Unauthorized reproduction,         }
{   reverse-engineering, and distribution of all or any portion of   }
{   the code contained in this file is strictly prohibited and may   }
{   result in severe civil and criminal penalties and will be        }
{   prosecuted to the maximum extent possible under the law.         }
{                                                                    }
{   RESTRICTIONS                                                     }
{                                                                    }
{   THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES            }
{   (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE     }
{   SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS    }
{   LICENSED TO DISTRIBUTE THE EXPRESSCROSSPLATFORMLIBRARY AND ALL   }
{   ACCOMPANYING VCL CONTROLS AS PART OF AN EXECUTABLE PROGRAM       }
{   ONLY.                                                            }
{                                                                    }
{   THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED       }
{   FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE         }
{   COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE        }
{   AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT   }
{   AND PERMISSION FROM DEVELOPER EXPRESS INC.                       }
{                                                                    }
{   CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON        }
{   ADDITIONAL RESTRICTIONS.                                         }
{                                                                    }
{********************************************************************}

unit cxAccessibility;

interface

{$I cxVer.inc}

uses
  Windows, ActiveX, Classes, OleServer, Messages, cxClasses;

(*$HPPEMIT '#include <OleIdl.h>*)

const
  cxAccessibleObjectSelfID = 0;

  SID_IcxAccessible = '{618736E0-3C3D-11CF-810C-00AA00389B71}';
  IID_IcxAccessible: TGUID = SID_IcxAccessible;

type
  TcxAccessibilityHelper = class;

  TcxAccessibleSimpleChildElementID = 0..MaxInt;

  TcxAccessibleObjectProperty = (aopDefaultAction, aopDescription, aopFocus,
    aopLocation, aopShortcut, aopValue);
  TcxAccessibleObjectProperties = set of TcxAccessibleObjectProperty;

  TcxAccessibleObjectHitTest = (aohtNone, aohtSelf, aohtChild);

  TcxAccessibilityNavigationDirection = (andLeft, andUp, andRight, andDown,
    andPrev, andNext);

  { IcxAccessible }

  IcxAccessible = interface(IDispatch)
  [SID_IcxAccessible]
    function Get_accParent(out ppdispParent: IDispatch): HResult; stdcall;
    function Get_accChildCount(out pcountChildren: Integer): HResult; stdcall;
    function Get_accChild(varChild: OleVariant; out ppdispChild: IDispatch): HResult; stdcall;
    function Get_accName(varChild: OleVariant; out pszName: WideString): HResult; stdcall;
    function Get_accValue(varChild: OleVariant; out pszValue: WideString): HResult; stdcall;
    function Get_accDescription(varChild: OleVariant; out pszDescription: WideString): HResult; stdcall;
    function Get_accRole(varChild: OleVariant; out pvarRole: OleVariant): HResult; stdcall;
    function Get_accState(varChild: OleVariant; out pvarState: OleVariant): HResult; stdcall;
    function Get_accHelp(varChild: OleVariant; out pszHelp: WideString): HResult; stdcall;
    function Get_accHelpTopic(out pszHelpFile: WideString; varChild: OleVariant;
      out pidTopic: Integer): HResult; stdcall;
    function Get_accKeyboardShortcut(varChild: OleVariant; out pszKeyboardShortcut: WideString): HResult; stdcall;
    function Get_accFocus(out pvarChild: OleVariant): HResult; stdcall;
    function Get_accSelection(out pvarChildren: OleVariant): HResult; stdcall;
    function Get_accDefaultAction(varChild: OleVariant; out pszDefaultAction: WideString): HResult; stdcall;
    function accSelect(flagsSelect: Integer; varChild: OleVariant): HResult; stdcall;
    function accLocation(out pxLeft: Integer; out pyTop: Integer; out pcxWidth: Integer;
      out pcyHeight: Integer; varChild: OleVariant): HResult; stdcall;
    function accNavigate(navDir: Integer; varStart: OleVariant; out pvarEndUpAt: OleVariant): HResult; stdcall;
    function accHitTest(xLeft: Integer; yTop: Integer; out pvarChild: OleVariant): HResult; stdcall;
    function accDoDefaultAction(varChild: OleVariant): HResult; stdcall;
    function Set_accName(varChild: OleVariant; const pszName: WideString): HResult; stdcall;
    function Set_accValue(varChild: OleVariant; const pszValue: WideString): HResult; stdcall;
  end;

  IcxAccessibilityHelper = interface
  ['{D4890860-09B2-4648-BD9E-DFFBD140E5F1}']
    function GetHelper: TcxAccessibilityHelper;
    procedure OwnerObjectDestroyed;
  end;

  TcxAccessibilityHelper = class(TInterfacedObject, IDispatch, IOleWindow,
    IcxAccessible, IcxAccessibilityHelper)
  private
    FIsOwnerObjectLive: Boolean;

    // IDispatch
    function GetIDsOfNames(const IID: TGUID; Names: Pointer;
      NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
    function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
    function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
    function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
      Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
    // IOleWindow
    function ContextSensitiveHelp(fEnterMode: BOOL): HResult; stdcall;
    function GetWindow(out wnd: HWnd): HResult; stdcall;
    // IcxAccessible
    function accDoDefaultAction(varChild: OleVariant): HResult; stdcall;
    function accHitTest(xLeft: Integer; yTop: Integer; out pvarChild: OleVariant): HResult; stdcall;
    function accLocation(out pxLeft: Integer; out pyTop: Integer; out pcxWidth: Integer;
      out pcyHeight: Integer; varChild: OleVariant): HResult; stdcall;
    function accNavigate(navDir: Integer; varStart: OleVariant; out pvarEndUpAt: OleVariant): HResult; stdcall;
    function accSelect(flagsSelect: Integer; varChild: OleVariant): HResult; stdcall;
    function Get_accChild(varChild: OleVariant; out ppdispChild: IDispatch): HResult; stdcall;
    function Get_accChildCount(out pcountChildren: Integer): HResult; stdcall;
    function Get_accDefaultAction(varChild: OleVariant; out pszDefaultAction: WideString): HResult; stdcall;
    function Get_accDescription(varChild: OleVariant; out pszDescription: WideString): HResult; stdcall;
    function Get_accFocus(out pvarChild: OleVariant): HResult; stdcall;
    function Get_accHelp(varChild: OleVariant; out pszHelp: WideString): HResult; stdcall;
    function Get_accHelpTopic(out pszHelpFile: WideString; varChild: OleVariant;
      out pidTopic: Integer): HResult; stdcall;
    function Get_accKeyboardShortcut(varChild: OleVariant; out pszKeyboardShortcut: WideString): HResult; stdcall;
    function Get_accName(varChild: OleVariant; out pszName: WideString): HResult; stdcall;
    function Get_accParent(out ppdispParent: IDispatch): HResult; stdcall;
    function Get_accRole(varChild: OleVariant; out pvarRole: OleVariant): HResult; stdcall;
    function Get_accSelection(out pvarChildren: OleVariant): HResult; stdcall;
    function Get_accState(varChild: OleVariant; out pvarState: OleVariant): HResult; stdcall;
    function Get_accValue(varChild: OleVariant; out pszValue: WideString): HResult; stdcall;
    function Set_accName(varChild: OleVariant; const pszName: WideString): HResult; stdcall;
    function Set_accValue(varChild: OleVariant; const pszValue: WideString): HResult; stdcall;

    function CheckIsOwnerObjectLive(out AErrorCode: HResult): Boolean;
    procedure CheckSimpleChildElementToBeReturned(var AVarChild: OleVariant);
    procedure CheckStringToBeReturned(const AStr: WideString; out AResult: HResult);
    function GetSimpleChildElementID(AChildID: OleVariant;
      out ASimpleChildElementID: TcxAccessibleSimpleChildElementID;
      out AErrorCode: HResult): Boolean;
    function GetVisible: Boolean;
  protected
    FOwnerObject: TObject;

    // IcxAccessibilityHelper
    function GetHelper: TcxAccessibilityHelper;
    procedure OwnerObjectDestroyed; virtual;

    function ChildIsSimpleElement(AIndex: Integer): Boolean; virtual;
    procedure DoDefaultAction(AChildID: TcxAccessibleSimpleChildElementID); virtual;
    function Focused(out AIsChildFocused: Boolean;
      out AFocusedChildIndex: Integer): Boolean; virtual;
    function GetChild(AIndex: Integer): TcxAccessibilityHelper; virtual;
    function GetChildCount: Integer; virtual;
    function GetChildIndex(AChild: TcxAccessibilityHelper): Integer; virtual;
    function GetDefaultActionDescription(AChildID: TcxAccessibleSimpleChildElementID): string; virtual;
    function GetDescription(AChildID: TcxAccessibleSimpleChildElementID): string; virtual;
    function GetHitTest(AScreenX, AScreenY: Integer; out AChildIndex: Integer): TcxAccessibleObjectHitTest; virtual;
    procedure GetKeyboardAccessParameters(AChildID: TcxAccessibleSimpleChildElementID;
      out AShortCut: TShortCut; out ACaptionWithAccelChars: string); virtual;
    function GetName(AChildID: TcxAccessibleSimpleChildElementID): string; virtual;
    function GetOwnerObjectWindow: HWND; virtual;
    function GetParent: TcxAccessibilityHelper; virtual;
    function GetRole(AChildID: TcxAccessibleSimpleChildElementID): Integer; virtual;
    function GetScreenBounds(AChildID: TcxAccessibleSimpleChildElementID): TRect; virtual;
    function GetSelectable: Boolean; virtual;
    function GetState(AChildID: TcxAccessibleSimpleChildElementID): Integer; virtual;
    function GetSupportedProperties(AChildID: TcxAccessibleSimpleChildElementID): TcxAccessibleObjectProperties; virtual;
    function GetValue(AChildID: TcxAccessibleSimpleChildElementID): string; virtual;
    function NavigateToChild(ACurrentChildIndex: Integer; ADirection: TcxAccessibilityNavigationDirection): Integer; virtual; // andPrev, andNext must prevent looping
    procedure SetValue(AChildID: TcxAccessibleSimpleChildElementID; const Value: string); virtual;

    function GetRootHelper: TcxAccessibilityHelper;
  public
    constructor Create(AOwnerObject: TObject); virtual;
    function GetNextSelectableChildIndex(AStartIndex: Integer;
      AGoForward: Boolean): Integer;
    property Childs[AIndex: Integer]: TcxAccessibilityHelper read GetChild;
    property ChildCount: Integer read GetChildCount;
    property IsOwnerObjectLive: Boolean read FIsOwnerObjectLive;
    property OwnerObject: TObject read FOwnerObject;
    property OwnerObjectWindow: HWND read GetOwnerObjectWindow;
    property Parent: TcxAccessibilityHelper read GetParent;
    property Selectable: Boolean read GetSelectable;
    property States[AChildID: TcxAccessibleSimpleChildElementID]: Integer read GetState;
    property Visible: Boolean read GetVisible;
  end;

  TcxAccessibilityHelperClass = class of TcxAccessibilityHelper;

const
  cxROLE_SYSTEM_TITLEBAR = $1;
  cxROLE_SYSTEM_MENUBAR = $2;
  cxROLE_SYSTEM_SCROLLBAR = $3;
  cxROLE_SYSTEM_GRIP = $4;
  cxROLE_SYSTEM_SOUND = $5;
  cxROLE_SYSTEM_CURSOR = $6;
  cxROLE_SYSTEM_CARET = $7;
  cxROLE_SYSTEM_ALERT = $8;
  cxROLE_SYSTEM_WINDOW = $9;
  cxROLE_SYSTEM_CLIENT = $a;
  cxROLE_SYSTEM_MENUPOPUP = $b;
  cxROLE_SYSTEM_MENUITEM = $c;
  cxROLE_SYSTEM_TOOLTIP = $d;
  cxROLE_SYSTEM_APPLICATION = $e;
  cxROLE_SYSTEM_DOCUMENT = $f;
  cxROLE_SYSTEM_PANE = $10;
  cxROLE_SYSTEM_CHART = $11;
  cxROLE_SYSTEM_DIALOG = $12;
  cxROLE_SYSTEM_BORDER = $13;
  cxROLE_SYSTEM_GROUPING = $14;
  cxROLE_SYSTEM_SEPARATOR = $15;
  cxROLE_SYSTEM_TOOLBAR = $16;
  cxROLE_SYSTEM_STATUSBAR = $17;
  cxROLE_SYSTEM_TABLE = $18;
  cxROLE_SYSTEM_COLUMNHEADER = $19;
  cxROLE_SYSTEM_ROWHEADER = $1a;
  cxROLE_SYSTEM_COLUMN = $1b;
  cxROLE_SYSTEM_ROW = $1c;
  cxROLE_SYSTEM_CELL = $1d;
  cxROLE_SYSTEM_LINK = $1e;
  cxROLE_SYSTEM_HELPBALLOON = $1f;
  cxROLE_SYSTEM_CHARACTER = $20;
  cxROLE_SYSTEM_LIST = $21;
  cxROLE_SYSTEM_LISTITEM = $22;
  cxROLE_SYSTEM_OUTLINE = $23;
  cxROLE_SYSTEM_OUTLINEITEM = $24;
  cxROLE_SYSTEM_PAGETAB = $25;
  cxROLE_SYSTEM_PROPERTYPAGE = $26;
  cxROLE_SYSTEM_INDICATOR = $27;
  cxROLE_SYSTEM_GRAPHIC = $28;
  cxROLE_SYSTEM_STATICTEXT = $29;
  cxROLE_SYSTEM_TEXT = $2a;
  cxROLE_SYSTEM_PUSHBUTTON = $2b;
  cxROLE_SYSTEM_CHECKBUTTON = $2c;
  cxROLE_SYSTEM_RADIOBUTTON = $2d;
  cxROLE_SYSTEM_COMBOBOX = $2e;
  cxROLE_SYSTEM_DROPLIST = $2f;
  cxROLE_SYSTEM_PROGRESSBAR = $30;
  cxROLE_SYSTEM_DIAL = $31;
  cxROLE_SYSTEM_HOTKEYFIELD = $32;
  cxROLE_SYSTEM_SLIDER = $33;
  cxROLE_SYSTEM_SPINBUTTON = $34;
  cxROLE_SYSTEM_DIAGRAM = $35;
  cxROLE_SYSTEM_ANIMATION = $36;
  cxROLE_SYSTEM_EQUATION = $37;
  cxROLE_SYSTEM_BUTTONDROPDOWN = $38;
  cxROLE_SYSTEM_BUTTONMENU = $39;
  cxROLE_SYSTEM_BUTTONDROPDOWNGRID = $3a;
  cxROLE_SYSTEM_WHITESPACE = $3b;
  cxROLE_SYSTEM_PAGETABLIST = $3c;
  cxROLE_SYSTEM_CLOCK = $3d;
  cxROLE_SYSTEM_SPLITBUTTON = $3e;
  cxROLE_SYSTEM_IPADDRESS = $3f;
  cxROLE_SYSTEM_OUTLINEBUTTON = $40;

  cxSTATE_SYSTEM_NORMAL = $0;
  cxSTATE_SYSTEM_UNAVAILABLE = $1;
  cxSTATE_SYSTEM_SELECTED = $2;
  cxSTATE_SYSTEM_FOCUSED = $4;
  cxSTATE_SYSTEM_PRESSED = $8;
  cxSTATE_SYSTEM_CHECKED = $10;
  cxSTATE_SYSTEM_MIXED = $20;
  cxSTATE_SYSTEM_INDETERMINATE = cxSTATE_SYSTEM_MIXED;
  cxSTATE_SYSTEM_READONLY = $40;
  cxSTATE_SYSTEM_HOTTRACKED = $80;
  cxSTATE_SYSTEM_DEFAULT = $100;
  cxSTATE_SYSTEM_EXPANDED = $200;
  cxSTATE_SYSTEM_COLLAPSED = $400;
  cxSTATE_SYSTEM_BUSY = $800;
  cxSTATE_SYSTEM_FLOATING = $1000;
  cxSTATE_SYSTEM_MARQUEED = $2000;
  cxSTATE_SYSTEM_ANIMATED = $4000;
  cxSTATE_SYSTEM_INVISIBLE = $8000;
  cxSTATE_SYSTEM_OFFSCREEN = $10000;
  cxSTATE_SYSTEM_SIZEABLE = $20000;
  cxSTATE_SYSTEM_MOVEABLE = $40000;
  cxSTATE_SYSTEM_SELFVOICING = $80000;
  cxSTATE_SYSTEM_FOCUSABLE = $100000;
  cxSTATE_SYSTEM_SELECTABLE = $200000;
  cxSTATE_SYSTEM_LINKED = $400000;
  cxSTATE_SYSTEM_TRAVERSED = $800000;
  cxSTATE_SYSTEM_MULTISELECTABLE = $1000000;
  cxSTATE_SYSTEM_EXTSELECTABLE = $2000000;
  cxSTATE_SYSTEM_ALERT_LOW = $4000000;
  cxSTATE_SYSTEM_ALERT_MEDIUM = $8000000;
  cxSTATE_SYSTEM_ALERT_HIGH = $10000000;
  cxSTATE_SYSTEM_PROTECTED = $20000000;
  cxSTATE_SYSTEM_VALID = $7fffffff;
  cxSTATE_SYSTEM_HASPOPUP = $40000000;

function WMGetObjectResultFromIAccessibilityHelper(
  const AWMGetObjectMessage: TMessage; AIHelper: IcxAccessibilityHelper): LRESULT;

function CanReturnAccessibleObject(const AWMGetObjectMessage: TMessage): Boolean;
function IsAccessibilitySupported: Boolean;

implementation

uses
  Menus, SysUtils, cxControls;

const
  NAVDIR_UP = $1 ;
  NAVDIR_DOWN = $2 ;
  NAVDIR_LEFT = $3 ;
  NAVDIR_RIGHT = $4 ;
  NAVDIR_NEXT = $5 ;
  NAVDIR_PREVIOUS = $6 ;
  NAVDIR_FIRSTCHILD = $7 ;
  NAVDIR_LASTCHILD = $8 ;

  CO_E_OBJECTNOTCONNECTED = 0; // TODO

  OleaccLibraryName = 'oleacc.dll';

var
  FcxAccessibleObjectFromWindow: function(hwnd: THandle; dwId: DWORD;
    const riid: TGUID; out ppvObject): HRESULT; stdcall = nil;
  FcxLResultFromObject: function(const riid: TGUID;
    wParam: WPARAM; punk: IUnknown): LRESULT; stdcall = nil;
  FOleaccLibrary: HMODULE;

function WMGetObjectResultFromIAccessibilityHelper(
  const AWMGetObjectMessage: TMessage; AIHelper: IcxAccessibilityHelper): LRESULT;
begin
  Result := FcxLResultFromObject(IID_IcxAccessible, AWMGetObjectMessage.WParam,
    AIHelper as IcxAccessible);
end;

function CanReturnAccessibleObject(const AWMGetObjectMessage: TMessage): Boolean;
begin
  Result := IsAccessibilitySupported and
    (Cardinal(AWMGetObjectMessage.LParam) = OBJID_CLIENT);
end;

function IsAccessibilitySupported: Boolean;
begin
  Result := Assigned(FcxLResultFromObject);
end;

function cxGetAccessibleObjectFromWindow(hwnd: THandle; dwId: DWORD;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?