Èñïîëüçîâàíèå èíòåðôåéñà IJawsApi

(Ñ ïðèìåðàìè íà JScript, AutoIt, C# è C++)
Äàòà ïóáëèêàöèè:2010
Ïîäåëèòüñÿ â Twitter Ïîäåëèòüñÿ â F******k Ïîäåëèòüñÿ â VKontakte Ïîäåëèòüñÿ â Telegram Ïîäåëèòüñÿ â Mastodon

Êðîìå èçâåñòíîé áèáëèîòåêè JfwAPI, ïîçâîëÿþùåé ïðèëîæåíèÿì ïðè ïîìîùè ñîîáùåíèé MS Windows íàïðÿìóþ âçàèìîäåéñòâîâàòü ñ ïðîãðàììîé ýêðàííîãî äîñòóïà JAWS , ñóùåñòâóåò äðóãîé âàðèàíò òàêîãî âçàèìîäåéñòâèÿ. Ýòîò âàðèàíò îñíîâàí íà ðåàëèçîâàííîì â JAWS êîìïîíåíòå OLE-Automation, èíòåðôåéñ êîòîðîãî, íàçâàííûé IJawsApi , ñîäåðæèò ìåòîäû, àíàëîãè÷íûå ïî ñâîåìó íàçíà÷åíèþ ôóíêöèÿì èç JfwAPI.

Î÷åâèäíûì ïðåèìóùåñòâîì âçàèìîäåéñòâèÿ ÷åðåç èíòåðôåéñ IJawsApi ÿâëÿåòñÿ âîçìîæíîñòü èñïîëüçîâàòü åãî íå òîëüêî â ïðèëîæåíèÿõ, íî è ñöåíàðèÿõ íà òàêèõ ÿçûêàõ, êàê JScript, VBScript, AutoIt è òàê äàëåå, òî åñòü â òåõ ÿçûêàõ, ãäå ðåàëèçîâàíà ïîääåðæêà ìåõàíèçìîâ OLE-Automation.  îñòàëüíîì ìåòîäû IJawsApi ñòðàäàþò òåìè æå íåäîñòàòêàìè, ÷òî è ôóíêöèè JfwApi.  ïðè÷èíû ýòîãî ìû âäàâàòüñÿ íå áóäåì, à ñðàçó ïåðåéä¸ì ê èçó÷åíèþ ìåòîäîâ IJawsApi.

Ìåòîäû IJawsApi

Èíòåðôåéñ IJawsApi ïîääåðæèâàåò øåñòü ìåòîäîâ. Çà èñêëþ÷åíèåì ìåòîäà StopSpeech, âñå ìåòîäû âîçâðàùàþò â ñëó÷àå óñïåøíîãî âûïîëíåíèÿ çíà÷åíèå -1 (ìèíóñ îäèí), èíòåðïðåòèðóåìîå êàê true; à â ñëó÷àå îøèáêè âîçâðàùàþò çíà÷åíèå 0, èíòåðïðåòèðóåìîå êàê false. Íèæå ïðåäñòàâëåí ñïèñîê ìåòîäîâ ñ êðàòêèì îïèñàíèåì èõ ïàðàìåòðîâ:

  • Âûïîëíèòü ñêðèïò JAWS:
    Object.RunScript(parameter1);
    ãäå parameter1- ñòðîêîâàÿ ïåðåìåííàÿ èëè ñòðîêîâûé ëèòåðàë ñ èìåíåì âûïîëíÿåìîãî ñêðèïòà JAWS.
  • Ïðîèçíåñòè ôðàãìåíò òåêñòà:
    Object.SayString(parameter1, parameter2);
    ãäå parameter1 -- ýòî ñòðîêîâàÿ ïåðåìåííàÿ èëè ñòðîêîâûé ëèòåðàë ñ îçâó÷èâàåìûì òåêñòîì, parameter2 -- ýòî îïöèîíàëüíûé ïàðàìåòð, óêàçûâàþùèé , íàäî ëè íåìåäëåííî ïðåðâàòü òåêóùèé ðå÷åâîé âûâîä JAWS (ïî óìîë÷àíèþ ðàâåí -1, ò.å. òåêóùèé ðå÷åâîé âûâîä áóäåò ïðåðâàí ïðè âûçîâå ýòîãî ìåòîäà).
  • Ïðåðâàòü ðå÷ü JAWS:
    Object.StopSpeech();
    Ìåòîä íå âîçâðàùàåò çíà÷åíèé.
  • Íåäîêóìåíòèðîâàíî:
    Object.Enable(parameter1);
    ãäå parameter1 -- ëèáî true (èëè -1), ëèáî false (èëè 0).
  • Íåäîêóìåíòèðîâàíî:
    Object.Disable();
    Âûçîâ ýòîãî ìåòîäà, ïî âñåé âèäèìîñòè, ïðèâîäèò ê ïåðåõîäó JAWS â "ñïÿùèé" ðåæèì(îäíàêî âûçîâ ìåòîäîâ IJawsApi ïîääåðæèâàåòñÿ è â ýòîì ñîñòîÿíèè). Âåðíóòü JAWS â àêòèâíîå ñîñòîÿíèå ïîçâîëÿåò âûçîâ ìåòîäà Enable().
  • Âûïîëíèòü ôóíêöèþ JAWS:
    Object.RunFunction(parameter1);
    ãäå parameter1 -- ýòî ñòðîêîâàÿ ôóíêöèÿ èëè ñòðîêîâûé ëèòåðàë ñ ïîëíîé ñòðîêîé âûçîâà ôóíêöèè, ò.å. ñ èìåíåì ôóíêöèè è ôàêòè÷åñêèìè àðãóìåíòàìè, çàêëþ÷åííûìè â êðóãëûå ñêîáêè.

Èíèöèàëèçàöèÿ

Ïðåæäå ÷åì èñïîëüçîâàòü èíòåðôåéñ IJawsApi íóæíî ñîçäàòü ñàì îáúåêò OLE-Automation.  ðàçëè÷íûõ ñêðèïòîâûõ ÿçûêàõ ýòî äåéñòâèå ìîæåò âûïîëíÿòüñÿ ðàçëè÷íûìè ñïîñîáàìè, íî áîëüøèíñòâî èç íèõ èìåþò ñõîæóþ ñåìàíòèêó. Êàê ïðàâèëî, â êà÷åñòâå àðãóìåíòà ïåðåäàåòñÿ íåçàâèñèìûé îò âåðñèè ñòðîêîâûé èäåíòèôèêàòîð îáúåêòà (VersionIndependentProgID), êîòîðûé â íàøåì ñëó÷àå âûãëÿäèò òàê: "FreedomSci.JawsApi".

Êîíêðåòíûå ïðèìåðû áóäóò ðàññìîòðåíû äàëåå.

Ïðèìåðû

 êà÷åñòâå ïðèìåðîâ íèæå ïðèâîäÿòñÿ ôðàãìåíòû êîäà íà JScript è AutoIt. Ðàäè ïðîñòîòû èçëîæåíèÿ, â êîäå îáðàáîòêà îøèáîê ñâåäåíà ê ìèíèìóìó.

Ïðèìåð íà JScript

// Ôàéë: hello.js
// Ïðèìåð èñïîëüçîâàíèÿ IJawsApi.

// Èíèöèàëèçèðîâàòü îáúåêò è ïîëó÷èòü èíòåðôåéñ
var jawsApi = new ActiveXObject("FreedomSci.JawsApi");

// ïðîèçíåñòè ñòðîêó
jawsApi.SayString("Hello, world!");

// âûïîëíèòü ñêðèïò, îçâó÷èâàþùèé òåêóùåå âðåìÿ
jawsApi.RunScript("SaySystemTime");

// âûçâàòü ïîñëåäîâàòåëüíî íåñêîëüêî ôóíêöèé
jawsApi.RunFunction("TypeKey(\"Ctrl+Esc\")");
jawsApi.RunFunction("Delay(10)");
jawsApi.RunFunction("TypeKey(\"Esc\")");

Ïðèìåð íà AutoIt

; Ôàéë hello.au3
; Ïðèìåð èñïîëüçîâàíèÿ IJawsApi.

$oJawsApi= ObjCreate("FreedomSci.JawsApi")
if @error then
	Msgbox(0,"JawsApi Test","Failed to create OLE-Object. Error code: " & hex(@error,8))
	exit
endif

; ïðîèçíåñòè ñòðîêó
$oJawsApi.SayString("Hello, world!")

; âûïîëíèòü ñêðèïò, îçâó÷èâàþùèé òåêóùåå âðåìÿ
$oJawsApi.RunScript("SaySystemTime")

; âûçâàòü ïîñëåäîâàòåëüíî íåñêîëüêî ôóíêöèé
$oJawsApi.RunFunction('TypeKey("Ctrl+Esc")')
$oJawsApi.RunFunction("Delay(10)")
$oJawsApi.RunFunction('TypeKey("Esc")')

exit

Ïðèìåð äëÿ C#

Äëÿ C# íèæå ïðèâåäåíû ôðàãìåíòû êîäà ñ èíèöèàëèçàöèåé îáúåêòà JfW API, à òàêæå âûçîâ îäíîãî èç ìåòîäîâ. Îñòàëüíûå ìåòîäû API ìîæíî âûçûâàòü àíàëîãè÷íûì îáðàçîì

// Ðàáî÷èé ôðàãìåíò äëÿ .Net 3.5:

 Type jfwApi = Type.GetTypeFromProgID("FreedomSci.JawsApi");
 object o = Activator.CreateInstance( jfwApi);
jfwApi.InvokeMember("SayString",
System.Reflection.BindingFlags.InvokeMethod,
null,
o,
new Object[1] {"Hello"});
...
// Â .net 4.0 äîëæåí ðàáîòàòü ïðèìåð äëÿ .Net 3.5,
// íî òàêæå âïîëíå ïðèãîäåí ñëåäóþùèé âàðèàíò :
Type jfwApi = Type.GetTypeFromProgID("FreedomSci.JawsApi");
dynamic o= Activator.CreateInstance( jfwApi);
o.SayString("hello");
...

Èñïîëüçîâàíèå IJawsApi â ïðîãðàììàõ íà C++

Äëÿ èñïîëüçîâàíèÿ èíòåðôåéñà IJawsApi â ïðîãðàììå íà C++ íåîáõîäèìî ñîçäàòü çàãîëîâî÷íûé ôàéë ñ îáúÿâëåíèåì ñîîòâåòñòâóþùåãî êëàññà è ôàéë ñ îïðåäåëåíèåì GUID äëÿ îáúåêòà è IID äëÿ èíòåðôåéñà.

Åñëè èñïîëüçóåìûé êîìïèëÿòîð ïîääåðæèâàåò äèðåêòèâó #import, òî ýòó çàäà÷ó ìîæíî âîçëîæèòü íà íåå, óêàçàâ â êà÷åñòâå èìïîðòèðóåìîãî ôàéë Fsapi.dll. Ïîëíûé ïóòü ê ýòîìó ôàéëó ìîæíî óçíàòü èç ñèñòåìíîãî ðååñòðà, îòûñêàâ âåòêó:

HKEY_CLASSES_ROOT\CLSID\{CCE5B1E5-B2ED-45D5-B09F-8EC54B75ABF4}\

È Èñêîìîå çíà÷åíèå áóäåò íàõîäèòüñÿ â ïîäðàçäåëå InprocServer32.

Åñëè êîìïèëÿòîð íå ïîääåðæèâàåò äèðåêòèâó #import, òî íåîáõîäèìûå ôàéëû ïðèäåòñÿ ñîçäàâàòü âðó÷íóþ. Íèæå ïðèâåäåíû èñõîäíûå òåêñòû ôàéëîâ jawsapi.h è guids.cpp, íàïèñàííûå, òàê ñêàçàòü, â äóõå "÷èñòîãî COM".

// Ôàéë: jawsapi.h
// Îáúÿâëåíèå èíòåðôåéñà IJawsApi.
#ifndef __JAWSAPI_H__
#define __JAWSAPI_H__

#include 
#include 

#undef INTERFACE
#define INTERFACE  IJawsApi

DECLARE_INTERFACE_(IJawsApi ,IDispatch)
{
	STDMETHOD(RunScript)(THIS_ /* [in] */ BSTR ScriptName, VARIANT_BOOL* retval) PURE;
	STDMETHOD(SayString)(THIS_ /*  [in]*/ BSTR StringToSpeak,
				/*[in, optional, defaultvalue(-1)]*/ VARIANT_BOOL bFlush, VARIANT_BOOL* retval) PURE;
	STDMETHOD(StopSpeech)(THIS_ ) PURE;
	STDMETHOD(Enable)(THIS_ /*[in]*/ VARIANT_BOOL vbNoDDIHooks,
				VARIANT_BOOL* retval) PURE;
	STDMETHOD(Disable)(THIS_ VARIANT_BOOL* retval) PURE;
	STDMETHOD(RunFunction)(THIS_ /*[in]*/ BSTR FunctionName, VARIANT_BOOL* retval) PURE;
};
#endif
// Ôàéë: guids.cpp.
#include 
#include 
#include 

/* {CCE5B1E5-B2ED-45D5-B09F-8EC54B75ABF4} */
DEFINE_GUID(CLSID_JAWSCLASS ,
0x0CCE5B1E5, 0x0B2ED, 0x45D5,0xB0, 0x9F, 0x8E, 0x0C5, 0x4B, 0x75, 0x0AB, 0x0F4);

/* {123DEDB4-2CF6-429C-A2AB-CC809E5516CE} */
DEFINE_GUID(IID_IJAWSAPI ,
0x123DEDB4,0x2CF6, 0x429C, 0x0A2, 0x0AB, 0x0CC, 0x80, 0x9E, 0x55, 0x16, 0x0CE);

Ôàéë guids.cpp äîëæåí áûòü âêëþ÷¸í â ïðîåêò (åñëè èñïîëüçóåòñÿ èíòåãðèðîâàííàÿ ñðåäà ðàçðàáîòêè) èëè óêàçàí â êîìàíäíîé ñòðîêå êîìïèëÿòîðà íåïîñðåäñòâåííî. Ôàéë jawsapi.h ïîäêëþ÷àåòñÿ ïðè ïîìîùè äèðåêòèâû #include â òåõ ôàéëàõ ñ èñõîäíûì êîäîì, ãäå ïðåäïîëàãàåòñÿ èñïîëüçîâàòü èíòåðôåéñ IJawsApi. Òàêæå â ýòèõ ôàéëàõ íåîáõîäèìî îáúÿâèòü äâå âíåøíèå ïåðåìåííûå:

extern const CLSID CLSID_JAWSCLASS ;
extern const IID IID_IJAWSAPI ;

Ïðèìåð èñïîëüçîâàíèÿ IJawsApi â ïðîãðàììå íà ÿçûêå C++ ïðèâåä¸í íèæå. Ýòî êîíñîëüíîå ïðèëîæåíèå, åäèíñòâåííûì äåéñòâèåì êîòîðîãî áóäåò îçâó÷èâàíèå òåêóùåãî âðåìåíè ïðè ïîìîùè ñêðèïòà JAWS.

// Ôàéë: main.cpp #include #include "jawsapi.h" extern const CLSID CLSID_JAWSCLASS ; extern const IID IID_IJAWSAPI ; int main () { IJawsApi* pJawsApi= NULL; CoInitialize(NULL); HRESULT hr = CoCreateInstance(CLSID_JAWSCLASS,NULL, CLSCTX_INPROC_SERVER, IID_IJAWSAPI, reinterpret_cast(&pJawsApi)); if (SUCCEEDED(hr) && pJawsApi) { VARIANT_BOOL retval; BSTR param = SysAllocString(L"SaySystemTime"); pJawsApi->RunScript(param,&retval); SysFreeString(param); } CoUninitialize(); return 0; }

Ïðèâåä¸ííûé ïðèìåð ìîæíî ñêîìïèëèðîâàòü êîìïèëÿòîðîì èç íàáîðà Borland Builder C++ 5.5 command line tools èëè C++-êîìïèëÿòîðîì èç ïàêåòà MinGW (â ïîñëåäíåì ñëó÷àå â îïöèÿõ êîìàíäíîé ñòðîêè êîìïèëÿòîðà íåîáõîäèìî äîáàâèòü: -lole32 -loleaut32).



Ðàñïðîñòðàíåíèå ìàòåðèàëîâ ñàéòà îçíà÷àåò, ÷òî ðàñïðîñòðàíèòåëü ïðèíÿë óñëîâèÿ ëèöåíçèîííîãî ñîãëàøåíèÿ.
Èäåÿ è ðåàëèçàöèÿ: © Âëàäèìèð Äîâûäåíêîâ è Àíàòîëèé Êàìûíèí,  2004-2026