Jump to content

help with TTS


 Share

Recommended Posts

Maybe this will help you: http://www.autoitscript.com/forum/index.php?showtopic=70079

*GERMAN* [note: you are not allowed to remove author / modified info from my UDFs]My UDFs:[_SetImageBinaryToCtrl] [_TaskDialog] [AutoItObject] [Animated GIF (GDI+)] [ClipPut for Image] [FreeImage] [GDI32 UDFs] [GDIPlus Progressbar] [Hotkey-Selector] [Multiline Inputbox] [MySQL without ODBC] [RichEdit UDFs] [SpeechAPI Example] [WinHTTP]UDFs included in AutoIt: FTP_Ex (as FTPEx), _WinAPI_SetLayeredWindowAttributes

Link to comment
Share on other sites

here is my code but i cant work ouw to add the pause fuction to it.

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <file.au3>
#include "TTS.au3"
#include "Word.au3"

$EXT = ("")

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 307, 308, 192, 124)
$Browse = GUICtrlCreateButton("Browse", 112, 120, 75, 25)
$Input1 = GUICtrlCreateInput("", 24, 88, 249, 21)
$Group1 = GUICtrlCreateGroup("Read Text File.", 8, 32, 289, 265)
$Label1 = GUICtrlCreateLabel("Please Select A Text File Fromat To Be Read Out.", 32, 64, 241, 17)
$PlayFile = GUICtrlCreateButton("PLAY", 192, 232, 75, 25)
$CLOSEFILEREADER = GUICtrlCreateButton("CLOSE", 24, 232, 75, 25)
$Slider1 = GUICtrlCreateSlider(72, 192, 150, 29)
$slidelim = GUICtrlSetLimit($Slider1,100,2)
$startpoint = 50
GUICtrlSetData($Slider1,$startpoint)
$Label2 = GUICtrlCreateLabel("Volume", 120, 168, 39, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 4
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit

        Case $Browse
            $file = FileOpenDialog("Please Select A TEXT FILE FORMAT TO Be Read Out", @UserProfileDir, "Text Files (*.txt;*.Doc;*.Docx)", 1 + 2)
            GUICtrlSetData($Input1, $file)

        Case $PlayFile
            If $EXT = (".txt") Then
                Dim $read
                    If Not _FileReadToArray($file, $read) Then
                        MsgBox(0,"","error")
                        Exit
                    EndIf
                    $volume = guictrlread($Slider1)
                    For $x = 1 To $read[0]
                        $start = _StartTTS()
                        _SetVolume($start, $volume)
                        _Speak($start, $read[$x])
                    Next
                ;using the WORD UDF FROM THE SITE.
            ElseIf $EXT = (".Doc") Or (".Docx") Then
                $sFilePath = ($file)
                $oWordApp = _WordCreate ($sFilePath, 0, 0)
                $oDoc = $oWordApp.ActiveDocument
                $sText = $oDoc.Range.Text

                    $volume = guictrlread($Slider1)
                    $start = _StartTTS()
                    _SetVolume($start, $volume)
                    _Speak($start, $sText)
                _WordQuit ($oWordApp, 0)

            EndIf
    EndSwitch
WEnd

thanks

Link to comment
Share on other sites

  • Moderators

madmorgan,

This is what I have come up with after a bit of MSDN burrowing:

$sMsg = "this is a pretty long line which takes a good few seconds to speak with the slow word rate that this voice has"

Local $oSpeech = ObjCreate("SAPI.SpVoice")

$oSpeech.Speak($sMsg, 1) ; Note asyncronous flag

ConsoleWrite("Speaking" & @CRLF)

Sleep(2000)

$oSpeech.Pause()

ConsoleWrite("Paused" & @CRLF)

Sleep(5000)

$oSpeech.Resume()

ConsoleWrite("Resumed" & @CRLF)

Do
    Sleep(10)
Until $oSpeech.Status.RunningState() = 1 ; 0 - speaking, 1 = stopped

$oSpeech = ""

Exit

I hope it helps. I had fun anyway! :mellow:

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

  • Moderators

madmorgan,

Let me have the missing functions (_StartTTS(), _SetVolume(), _Speak()) and I will try over the weekend to get it all in a nice package - my better half is off on a "girl's only shopping trip", so I can work uninterrupted for a while. :mellow:

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

ok here is the missing functions.

this file has got to be called TTS.au3

#include-once

; #FUNCTION# ====================================================================================================================
; Name...........: _StartTTS
; Description ...: Creates a object to be used with Text-to-Speak Functions.
; Syntax.........: _StartTTS()
; Parameters ....:
; Return values .: Success - Returns a object
; Author ........: bchris01

; Example .......: Yes
; ===============================================================================================================================
Func _StartTTS()
    Return ObjCreate("SAPI.SpVoice")
EndFunc   ;==>_StartTTS

; #FUNCTION# ====================================================================================================================
; Name...........: _SetRate
; Description ...: Sets the rendering rate of the voice. (How fast the voice talks.)
; Syntax.........: _SetRate(ByRef $Object, $iRate)
; Parameters ....: $Object        - Object returned from _StartTTS().
;                  $iRate         - Value specifying the speaking rate of the voice. Supported values range from -10 to 10
; Return values .:  None
; Author ........: bchris01
; Example .......: Yes
; ===============================================================================================================================
Func _SetRate(ByRef $Object, $iRate); Rates can be from -10 to 10
    $Object.Rate = $iRate
EndFunc   ;==>_SetRate

; #FUNCTION# ====================================================================================================================
; Name...........: _SetVolume
; Description ...: Sets the volume of the voice.
; Syntax.........: _SetVolume(ByRef $Object, $iVolume)
; Parameters ....: $Object        - Object returned from _StartTTS().
;                  $iVolume       - Value specifying the volume of the voice. Supported values range from 0-100. Default = 100
; Return values .:  None
; Author ........: bchris01
; Example .......: Yes
; ===============================================================================================================================
Func _SetVolume(ByRef $Object, $iVolume);Volume
    $Object.Volume = $iVolume
EndFunc   ;==>_SetVolume

; #FUNCTION# ====================================================================================================================
; Name...........: _SetVoice
; Description ...: Sets the identity of the voice used for text synthesis.
; Syntax.........: _SetVoice(ByRef $Object, $sVoiceName)
; Parameters ....: $Object        - Object returned from _StartTTS().
;                  $sVoiceName    - String matching one of the voices installed.
; Return values .:  Success - Sets object to voice.
;                   Failure - Sets @error to 1
; Author ........: bchris01
; Example .......: Yes
; ===============================================================================================================================
Func _SetVoice(ByRef $Object, $sVoiceName)
    Local $VoiceNames, $VoiceGroup = $Object.GetVoices
    For $VoiceNames In $VoiceGroup
        If $VoiceNames.GetDescription() = $sVoiceName Then
            $Object.Voice = $VoiceNames
            Return
        EndIf
    Next
    Return SetError(1)
EndFunc   ;==>_SetVoice

; #FUNCTION# ====================================================================================================================
; Name...........: _GetVoices
; Description ...: Retrives the currently installed voice identitys.
; Syntax.........: _GetVoices(ByRef $Object[, $Return = True])
; Parameters ....: $Object        - Object returned from _StartTTS().
;                  $bReturn       - String of text you want spoken.
;                  |If $bReturn = True then a 0-based array is returned.
;                  |If $bReturn = False then a string seperated by delimiter "|" is returned.
; Return values .:  Success - Returns an array or string containing installed voice identitys.
; Author ........: bchris01
; Example .......: Yes
; ===============================================================================================================================
Func _GetVoices(ByRef $Object, $bReturn = True)
    Local $sVoices, $VoiceGroup = $Object.GetVoices
    For $Voices In $VoiceGroup
        $sVoices &= $Voices.GetDescription() & '|'
    Next
    If $bReturn Then Return StringSplit(StringTrimRight($sVoices, 1), '|', 2)
    Return StringTrimRight($sVoices, 1)
EndFunc   ;==>_GetVoices

; #FUNCTION# ====================================================================================================================
; Name...........: _Speak
; Description ...: Speaks the contents of the text string.
; Syntax.........: _Speak(ByRef $Object, $sText)
; Parameters ....: $Object        - Object returned from _StartTTS().
;                  $sText         - String of text you want spoken.
; Return values .:  Success - Speaks the text.
; Author ........: bchris01
; Example .......: Yes
; ===============================================================================================================================
Func _Speak(ByRef $Object, $sText)
    $Object.Speak($sText)
EndFunc   ;==>_Speak
Edited by madmorgan
Link to comment
Share on other sites

  • Moderators

madmorgan,

Got it.

Wait Out.

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

and here is the word.au3 file as well sorry its late i was out.

#include-once
#region Header
#cs
    Title: Microsoft Word Automation UDF Library for AutoIt3
    Filename: Word.au3
    Description: A collection of functions for creating, attaching to, reading from and manipulating Microsoft Word
    Author: Bob Anthony
    Version: T1.0-1
    Last Update: 4/14/07
    Requirements: AutoIt v3.2.0.1 or higher, Developed/Tested on WindowsXP Pro with Microsoft Word 2003
    Notes: Errors associated with incorrect objects will be common user errors.
            Special thanks to DaleHohm for letting me base this code off his IE.au3 Library!    
    Update History: http://www.autoitscript.com/fileman/users/Big_Daddy/libraries/word/history.htm
#ce
#endregion
#region Global Variables and Constants
Global Const $WordAU3VersionInfo[6] = ["T", 1, 0, 1, "20070414", "T1.0-1"]
Global Const $WORD_LSFW_LOCK = 1, $WORD_LSFW_UNLOCK = 2
Global $__WordAU3Debug = False
Global $_WordErrorNotify = True
Global $oWordErrorHandler, $sWordUserErrorHandler
Global _; Com Error Handler Status Strings
        $WordComErrorNumber, _
        $WordComErrorNumberHex, _
        $WordComErrorDescription, _
        $WordComErrorScriptline, _
        $WordComErrorWinDescription, _
        $WordComErrorSource, _
        $WordComErrorHelpFile, _
        $WordComErrorHelpContext, _
        $WordComErrorLastDllError, _
        $WordComErrorComObj, _
        $WordComErrorOutput
;
; Enums
;
Global Enum _; Error Status Types
        $_WordStatus_Success = 0, _
        $_WordStatus_GeneralError, _
        $_WordStatus_ComError, _
        $_WordStatus_InvalidDataType, _
        $_WordStatus_InvalidObjectType, _
        $_WordStatus_InvalidValue, _
        $_WordStatus_ReadOnly, _
        $_WordStatus_NoMatch
Global Enum Step * 2 _; NotificationLevel
        $_WordNotifyLevel_None = 0, _
        $_WordNotifyNotifyLevel_Warning = 1, _
        $_WordNotifyNotifyLevel_Error, _
        $_WordNotifyNotifyLevel_ComError
Global Enum Step * 2 _; NotificationMethod
        $_WordNotifyMethod_Silent = 0, _
        $_WordNotifyMethod_Console = 1, _
        $_WordNotifyMethod_ToolTip, _
        $_WordNotifyMethod_MsgBox
#endregion
#region Core Functions
;===============================================================================
;
; Function Name:    _WordCreate()
; Description:      Create a Microsoft Office Word Object
; Parameter(s):     $s_FilePath     - Optional: specifies the file on open upon creation (See Remarks)
;                   $f_tryAttach    - Optional: specifies whether to try to attach to an existing window
;                                       0 = (Default) do not try to attach
;                                       1 = Try to attach to an existing window
;                   $f_visible      - Optional: specifies whether the window will be visible
;                                       0 = Window is hidden
;                                       1 = (Default) Window is visible
;                   $f_takeFocus    - Optional: specifies whether to bring the attached window to focus
;                                       0 =  Do Not Bring window into focus
;                                       1 = (Default) bring window into focus
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Returns an object variable pointing to a Word.Application object
;                   On Failure  - Returns 0 and sets @ERROR
;                   @ERROR      - 0 ($_WordStatus_Success) = No Error
;                               - 1 ($_WordStatus_GeneralError) = General Error
;                               - 3 ($_WordStatus_InvalidDataType) = Invalid Data Type
;                               - 4 ($_WordStatus_InvalidObjectType) = Invalid Object Type
;                   @Extended   - Set to true (1) or false (0) depending on the success of $f_tryAttach
; Remark(s):        File will be created if it does not exist.
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordCreate($s_FilePath = "", $f_tryAttach = 0, $f_visible = 1, $f_takeFocus = 1)
    Local $o_Result, $o_object, $o_win, $result, $f_mustUnlock = 0, $i_ErrorStatusCode = $_WordStatus_Success
    
    If Not $f_visible Then $f_takeFocus = 0 ; Force takeFocus to 0 for hidden window
    If $s_FilePath = "" Then $f_tryAttach = 0 ; There is currently no way of attaching to a blank document
    
    If $f_tryAttach Then
        Local $o_Result = _WordAttach($s_FilePath)
        If IsObj($o_Result) Then
            If $f_takeFocus Then
                $o_win = $o_Result.ActiveWindow
                $h_hwnd = __WordGetHWND($o_win)
                If IsHWnd($h_hwnd) Then WinActivate($h_hwnd)
            EndIf
            SetError($_WordStatus_Success)
            SetExtended(1)
            Return $o_Result
        EndIf
    EndIf
    
    If Not $f_visible Then
        $result = __WordLockSetForegroundWindow($WORD_LSFW_LOCK)
        If $result Then $f_mustUnlock = 1
    EndIf

    ; Setup internal error handler to Trap COM errors, turn off error notification
    Local $status = __WordInternalErrorHandlerRegister()
    If Not $status Then __WordErrorNotify("Warning", "_WordCreate", _
            "Cannot register internal error handler, cannot trap COM errors", _
            "Use _WordErrorHandlerRegister() to register a user error handler")
    Local $f_NotifyStatus = _WordErrorNotify() ; save current error notify status
    _WordErrorNotify(False)
    
    Local $o_object = ObjGet("", "Word.Application")
    If Not IsObj($o_object) Or @error = $_WordStatus_ComError Then
        $i_ErrorStatusCode = $_WordStatus_NoMatch
    EndIf
    
    ; restore error notify and error handler status
    _WordErrorNotify($f_NotifyStatus) ; restore notification status
    __WordInternalErrorHandlerDeRegister()
    
    If Not $i_ErrorStatusCode = $_WordStatus_Success Then
        $o_object = ObjCreate("Word.Application")
        If Not IsObj($o_object) Then
            __WordErrorNotify("Error", "_WordCreate", "", "Word Object Creation Failed")
            SetError($_WordStatus_GeneralError)
            Return 0
        EndIf
    EndIf

    $o_object.visible = $f_visible
    
    If $f_mustUnlock Then
        $result = __WordLockSetForegroundWindow($WORD_LSFW_UNLOCK)
        If Not $result Then __WordErrorNotify("Warning", "_WordCreate", "", "Foreground Window Unlock Failed!")
        ; If the unlock doesn't work we will have created an unwanted modal window
    EndIf
    
    If $s_FilePath = "" Then
        _WordDocAdd($o_object)
    Else
        _WordDocOpen($o_object, $s_FilePath)
    EndIf
    SetError(@error)
    Return $o_object
EndFunc   ;==>_WordCreate

;===============================================================================
;
; Function Name:    _WordAttach()
; Description:      Attach to the first existing instance of Microsoft Word where the
;                   search string matches based on the selected mode.
; Parameter(s):     $s_string   - String to search for
;                   $s_mode     - Optional: specifies search mode
;                                   FileName    = Name of the open document
;                                   FilePath    = (Default) Full path to the open document
;                                   HWND        = hwnd of the word window
;                                   Text        = Text from the body of the document
;                                   Title       = Title of the word window
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
;                   On Success  - Returns an object variable pointing to the Word.Application object
;                   On Failure  - Returns 0 and sets @ERROR
;                   @ERROR      - 0 ($_WordStatus_Success) = No Error
;                               - 1 ($_WordStatus_GeneralError) = General Error
;                               - 5 ($_WordStatus_InvalidValue) = Invalid Value
;                               - 7 ($_WordStatus_NoMatch) = No Match
;                   @Extended   - Contains invalid parameter number
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordAttach($s_string, $s_mode = "FilePath")
    $s_mode = StringLower($s_mode)
    
    Local $o_Result, $o_window, $o_windows, $h_hwnd, $return, _
            $i_Extended, $s_ErrorMSG = "", $i_ErrorStatusCode = $_WordStatus_Success
    
    ; Setup internal error handler to Trap COM errors, turn off error notification
    Local $status = __WordInternalErrorHandlerRegister()
    If Not $status Then __WordErrorNotify("Warning", "_WordAttach", _
            "Cannot register internal error handler, cannot trap COM errors", _
            "Use _WordErrorHandlerRegister() to register a user error handler")
    Local $f_NotifyStatus = _WordErrorNotify() ; save current error notify status
    _WordErrorNotify(False)
    
    $o_Result = ObjGet("", "Word.Application")
    If @error = $_WordStatus_ComError And $WordComErrorNumber = -2147221021 And $WordComErrorWinDescription = "Operation unavailable" Then
        $i_ErrorStatusCode = $_WordStatus_NoMatch
    EndIf
    
    If $i_ErrorStatusCode = $_WordStatus_Success Then
        $o_windows = $o_Result.Application.Windows
        If Not IsObj($o_windows) Then
            $i_ErrorStatusCode = $_WordStatus_NoMatch
        EndIf
    EndIf
    
    If $i_ErrorStatusCode = $_WordStatus_Success Then
        For $o_window In $o_windows
            
            Switch $s_mode
                Case "filename"
                    If $o_window.document.Name = $s_string Then
                        $i_ErrorStatusCode = $_WordStatus_Success
                        $o_window.Activate
                        $return = $o_window.Application
                    EndIf
                Case "filepath"
                    If $o_window.document.FullName = $s_string Then
                        $i_ErrorStatusCode = $_WordStatus_Success
                        $o_window.Activate
                        $return = $o_window.Application
                    EndIf
                Case "hwnd"
                    $h_hwnd = __WordGetHWND($o_window)
                    If IsHWnd($h_hwnd) Then
                        If $h_hwnd = $s_string Then
                            $i_ErrorStatusCode = $_WordStatus_Success
                            $o_window.Activate
                            $return = $o_window.Application
                        EndIf
                    EndIf
                Case "text"
                    If StringInStr($o_window.document.Range.Text, $s_string) Then
                        $i_ErrorStatusCode = $_WordStatus_Success
                        $o_window.Activate
                        $return = $o_window.Application
                    EndIf
                Case "title"
                    If ($o_window.Caption & " - " & $o_window.Application.Caption) = $s_string Then
                        $i_ErrorStatusCode = $_WordStatus_Success
                        $o_window.Activate
                        $return = $o_window.Application
                    EndIf
                Case Else
                    ; Invalid Mode
                    $i_ErrorStatusCode = $_WordStatus_InvalidValue
                    $s_ErrorMSG = "Invalid Mode Specified"
                    $i_Extended = 2
            EndSwitch
        Next
        If Not IsObj($return) Then
            $i_ErrorStatusCode = $_WordStatus_NoMatch
        EndIf
    EndIf
    
    ; restore error notify and error handler status
    _WordErrorNotify($f_NotifyStatus) ; restore notification status
    __WordInternalErrorHandlerDeRegister()
    
    Switch $i_ErrorStatusCode
        Case $_WordStatus_Success
            SetError($_WordStatus_Success)
            Return $return
        Case $_WordStatus_NoMatch
            __WordErrorNotify("Warning", "_WordAttach", "$_WordStatus_NoMatch")
            SetError($_WordStatus_NoMatch)
            Return 0
        Case $_WordStatus_InvalidValue
            __WordErrorNotify("Error", "_WordAttach", "$_WordStatus_InvalidValue", $s_ErrorMSG)
            SetError($_WordStatus_InvalidValue, $i_Extended)
            Return 0
        Case Else
            __WordErrorNotify("Error", "_WordAttach", "$_WordStatus_GeneralError", "Invalid Error Status - Notify Word.au3 developer")
            SetError($_WordStatus_GeneralError)
            Return 0
    EndSwitch
EndFunc   ;==>_WordAttach

;===============================================================================
;
; Function Name:    _WordQuit()
; Description:      Close the window and remove the object reference to it
; Parameter(s):     $o_object           - Object variable of a Word.Application
;                   $i_SaveChanges      - Optional: specifies the save action for the document
;                                            0 = Do not save changes
;                                           -1 = Save changes
;                                           -2 = (Default) Prompt to save changes
;                   $i_OriginalFormat   - Optional: specifies the save format for the document
;                                           0 = Word Document
;                                           1 = (Default) Original Document Format
;                                           2 = Prompt User
;                   $f_RouteDocument    - Optional: specifies whether to route the document to the next recipient
;                                           0 = (Default) do not route
;                                           1 = route to next recipient
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Returns 1
;                   On Failure  - Returns 0 and sets @ERROR
;                   @ERROR      - 0 ($_WordStatus_Success) = No Error
;                               - 1 ($_WordStatus_GeneralError) = General Error
;                               - 3 ($_WordStatus_InvalidDataType) = Invalid Data Type
;                               - 4 ($_WordStatus_InvalidObjectType) = Invalid Object Type
;                   @Extended   - Contains invalid parameter number
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordQuit(ByRef $o_object, $i_SaveChanges = -2, $i_OriginalFormat = 1, $f_RouteDocument = 0)
    If Not IsObj($o_object) Then
        __WordErrorNotify("Error", "_WordQuit", "$_WordStatus_InvalidDataType")
        SetError($_WordStatus_InvalidDataType, 1)
        Return 0
    EndIf
    ;
    If Not __WordIsObjType($o_object, "application") Then
        __WordErrorNotify("Error", "_WordQuit", "$_WordStatus_InvalidObjectType")
        SetError($_WordStatus_InvalidObjectType, 1)
        Return 0
    EndIf
    
    $o_object.Quit ($i_SaveChanges, $i_OriginalFormat, $f_RouteDocument)
    $o_object = 0
    SetError($_WordStatus_Success)
    Return 1
EndFunc   ;==>_WordQuit
#endregion
#region Document Functions
;===============================================================================
;
; Function Name:    _WordDocAdd()
; Description:      Returns an object variable representing a new empty document
; Parameter(s):     $o_object       - Object variable of a Word.Application object
;                   $i_DocumentType - Optional: specifies the new document type
;                                       0 = (Default) blank document
;                                       1 = Web page
;                                       2 = Email Message (need to figure out why this doesn't open)
;                                       3 = Frameset
;                                       4 = XML Document
;                   $s_Template     - Optional: specifies name of the template to be used for the new document
;                                       "" = (Default) normal template is used
;                   $f_NewTemplate  - Optional: specifies whether to open the document as a template
;                                       0 = (Default) do not open as template
;                                       1 = open as template
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Returns an object variable pointing to a Word.Application, document object
;                   On Failure  - Returns 0 and sets @ERROR
;                   @ERROR      - 0 ($_WordStatus_Success) = No Error
;                               - 1 ($_WordStatus_GeneralError) = General Error
;                               - 3 ($_WordStatus_InvalidDataType) = Invalid Data Type
;                               - 4 ($_WordStatus_InvalidObjectType) = Invalid Object Type
;                   @Extended   - Contains invalid parameter number
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordDocAdd(ByRef $o_object, $i_DocumentType = 0, $s_Template = "", $f_NewTemplate = 0)
    If Not IsObj($o_object) Then
        __WordErrorNotify("Error", "_WordDocAdd", "$_WordStatus_InvalidDataType")
        SetError($_WordStatus_InvalidDataType, 1)
        Return 0
    EndIf
    ;
    If Not __WordIsObjType($o_object, "application") Then
        __WordErrorNotify("Error", "_WordDocAdd", "$_WordStatus_InvalidObjectType")
        SetError($_WordStatus_InvalidObjectType, 1)
        Return 0
    EndIf
    ;
    Local $o_doc
    
    $o_doc = $o_object.Documents.Add ($s_Template, $f_NewTemplate, $i_DocumentType)
    If Not IsObj($o_doc) Then
        __WordErrorNotify("Error", "_WordDocAdd", "", "Document Object Creation Failed")
        SetError($_WordStatus_GeneralError)
        Return 0
    EndIf
    
    SetError($_WordStatus_Success)
    Return $o_doc
EndFunc   ;==>_WordDocAdd

;===============================================================================
;
; Function Name:    _WordDocOpen()
; Description:      Opens a Microsoft Word Document
; Parameter(s):     $o_object               - Object variable of a Word.Application object
;                   $s_FilePath             - Full path of the document to open (See Remarks)
;                   $f_ConfirmConversions   - Optional: Specifies whether to display the Convert File dialog box
;                                               if the file isn't in Microsoft Word format.
;                                               0 = (Default) Do not display
;                                               1 = Display
;                   $i_Format               - Optional: The file converter to be used to open the document.
;                                               0 = (Default) The existing format
;                                               1 = Microsoft Word Document format
;                                               2 = Microsoft Word Template format
;                                               3 = Rich text format (RTF)
;                                               4 = Unencoded text format
;                                               5 = Unicode text format or Encoded text format
;                                               6 = Microsoft Word format that is backward compatible with earlier versions of Microsoft Word
;                                               7 = HTML format
;                                               8 = XML format
;                   $f_ReadOnly             - Optional: Specifies whether to open the document as read-only.
;                                               Note: This argument doesn't override the read-only recommended setting on a saved document.
;                                               0 = (Default) Open as Read/Write
;                                               1 = Open as Read Only
;                   $f_Revert               - Optional: Controls what happens if $s_FilePath is an open document.
;                                               0 = (Default) Activate the open document
;                                               1 = Discard any unsaved changes to the open document and reopen the file
;                   $f_AddToRecentFiles     - Optional: Specifies whether to add the file name to the list of recently used
;                                               files at the bottom of the File menu.
;                                               0 = (Default) Do not add
;                                               1 = Add
;                   $s_PasswordDocument     - Optional: The password for opening the document.
;                                               "" = (Default) Null
;                   $s_WritePasswordDocument- Optional: The password for saving changes to the document.
;                                               "" = (Default) Null
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Returns an object variable pointing to a Word.Application, document object
;                   On Failure  - Returns 0 and sets @ERROR
;                   @ERROR      - 0 ($_WordStatus_Success) = No Error
;                               - 1 ($_WordStatus_GeneralError) = General Error
;                               - 3 ($_WordStatus_InvalidDataType) = Invalid Data Type
;                               - 4 ($_WordStatus_InvalidObjectType) = Invalid Object Type
;                   @Extended   - Contains invalid parameter number
; Remark(s):        File will be created if it does not exist.
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordDocOpen(ByRef $o_object, $s_FilePath, $f_ConfirmConversions = 0, $i_Format = 0, $f_ReadOnly = 0, $f_Revert = 0, $f_AddToRecentFiles = 0, $s_PasswordDocument = "", $s_WritePasswordDocument = "")
    If Not IsObj($o_object) Then
        __WordErrorNotify("Error", "_WordDocOpen", "$_WordStatus_InvalidDataType")
        SetError($_WordStatus_InvalidDataType, 1)
        Return 0
    EndIf
    ;
    If Not __WordIsObjType($o_object, "application") Then
        __WordErrorNotify("Error", "_WordDocOpen", "$_WordStatus_InvalidObjectType")
        SetError($_WordStatus_InvalidObjectType, 1)
        Return 0
    EndIf
    ;
    Local $o_doc
    
    If Not FileExists($s_FilePath) Then
        __WordErrorNotify("Warning", "_WordDocOpen", "", "The specified file does not exist, but we will attempt to create it.")
        $o_doc = _WordDocAdd($o_object)
        If @error Then
            SetError(@error)
            Return $o_doc
        EndIf
        _WordDocSaveAs($o_doc, $s_FilePath)
        If @error Then
            __WordErrorNotify("Error", "_WordDocOpen", "", "The specified file could not be created.")
            SetError($_WordStatus_GeneralError, 2)
            Return 0
        Else
            __WordErrorNotify("Info", "_WordDocOpen", "", "The specified file was created successfully.")
            SetError($_WordStatus_Success)
            Return $o_doc
        EndIf
    EndIf
    
    $o_doc = $o_object.Documents.Open ($s_FilePath, $f_ConfirmConversions, $f_ReadOnly, $f_AddToRecentFiles, _
            $s_PasswordDocument, "", $f_Revert, $s_WritePasswordDocument, "", $i_Format)
    If Not IsObj($o_doc) Then
        __WordErrorNotify("Error", "_WordDocOpen", "", "Document Object Creation Failed")
        SetError($_WordStatus_GeneralError)
        Return 0
    EndIf
    
    SetError($_WordStatus_Success)
    Return $o_doc
EndFunc   ;==>_WordDocOpen

;===============================================================================
;
; Function Name:    _WordDocSave()
; Description:      Saves a previously opened document
; Parameter(s):     $o_object           - Object variable of a Word.Application, document object
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Returns 1
;                   On Failure  - Returns 0 and sets @ERROR
;                   @ERROR      - 0 ($_WordStatus_Success) = No Error
;                               - 1 ($_WordStatus_GeneralError) = General Error
;                               - 3 ($_WordStatus_InvalidDataType) = Invalid Data Type
;                               - 4 ($_WordStatus_InvalidObjectType) = Invalid Object Type
;                   @Extended   - Contains invalid parameter number
; Remark(s):        If a document hasn't been saved before, the Save As dialog box prompts the user for a file name
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordDocSave(ByRef $o_object)
    If Not IsObj($o_object) Then
        __WordErrorNotify("Error", "_WordDocSave", "$_WordStatus_InvalidDataType")
        SetError($_WordStatus_InvalidDataType, 1)
        Return 0
    EndIf
    ;
    If Not __WordIsObjType($o_object, "document") Then
        __WordErrorNotify("Error", "_WordDocSave", "$_WordStatus_InvalidObjectType")
        SetError($_WordStatus_InvalidObjectType, 1)
        Return 0
    EndIf
    
    If Not FileExists($o_object.FullName) Then
        __WordErrorNotify("Error", "_WordDocSave", "", "The specified document has not be saved, please use _WordDocSaveAs first.")
        SetError($_WordStatus_GeneralError, 1)
        Return 0
    EndIf
    
    $o_object.Save
    SetError($_WordStatus_Success)
    Return 1
EndFunc   ;==>_WordDocSave

;===============================================================================
;
; Function Name:    _WordDocSaveAs()
; Description:      Saves the specified document with a new name or format.
; Parameter(s):     $o_object               - Object variable of a Word.Application, document object
;                   $s_FilePath             - Optional: The full file path for saving the document. (See Remarks)
;                                               "" = (Default) If the document has never been saved,
;                                                   the default name is used (for example, Document1.doc)
;                   $i_Format               - Optional: The format in which the document is saved.
;                                               0 = (Default) Microsoft Word format
;                                               1 = Microsoft Word template format
;                                               2 = Microsoft Windows text format
;                                               3 = Microsoft Windows text format with line breaks preserved
;                                               4 = Microsoft DOS text format
;                                               5 = Microsoft DOS text with line breaks preserved
;                                               6 = Rich text format (RTF)
;                                               7 = Unicode text format or Encoded text format
;                                               8 = Standard HTML format
;                                               9 = Web archive format
;                                               10 = Filtered HTML format
;                                               11 = Extensible Markup Language (XML) format
;                   $f_ReadOnlyRecommended  - Optional: Specifies whether to have Microsoft Word suggest
;                                               read-only status whenever the document is opened.
;                                               0 = (Default) Do not suggest read only
;                                               1 = Suggest read only
;                   $f_AddToRecentFiles     - Optional: Specifies whether to add the file name to the list of recently used
;                                               files at the bottom of the File menu.
;                                               0 = (Default) Do not add
;                                               1 = Add
;                   $f_LockComments         - Optional: Specifies whether to lock the document for comments.
;                                               0 = (Default) Do not lock for comments
;                                               1 = Lock for comments
;                   $s_Password             - Optional: A password string for opening the document. (See Remarks)
;                   $s_WritePassword        - Optional: A password string for saving changes to the document. (See Remarks)
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Returns 1
;                   On Failure  - Returns 0 and sets @ERROR
;                   @ERROR      - 0 ($_WordStatus_Success) = No Error
;                               - 1 ($_WordStatus_GeneralError) = General Error
;                               - 3 ($_WordStatus_InvalidDataType) = Invalid Data Type
;                               - 4 ($_WordStatus_InvalidObjectType) = Invalid Object Type
;                   @Extended   - Contains invalid parameter number
; Remark(s):        If a document with the specified file name already exists, the document is overwritten without the user being prompted first.
;                   Avoid using hard-coded passwords in your applications. If a password is required in a procedure,
;                   request the password from the user, store it in a variable, and then use the variable in your code.
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordDocSaveAs(ByRef $o_object, $s_FilePath = "", $i_Format = 0, $f_ReadOnlyRecommended = 0, $f_AddToRecentFiles = 0, $f_LockComments = 0, $s_Password = "", $s_WritePassword = "")
    If Not IsObj($o_object) Then
        __WordErrorNotify("Error", "_WordDocSaveAs", "$_WordStatus_InvalidDataType")
        SetError($_WordStatus_InvalidDataType, 1)
        Return 0
    EndIf
    ;
    If Not __WordIsObjType($o_object, "document") Then
        __WordErrorNotify("Error", "_WordDocSaveAs", "$_WordStatus_InvalidObjectType")
        SetError($_WordStatus_InvalidObjectType, 1)
        Return 0
    EndIf
    
    If FileExists($s_FilePath) Then
        __WordErrorNotify("Warning", "_WordDocSaveAs", "", "The specified file path already exists and will be overwritten.")
    EndIf
    
    If $s_FilePath = "" Then
        $s_FilePath = $o_object.FullName
    EndIf
    
    $o_object.SaveAs ($s_FilePath, $i_Format, $f_LockComments, $s_Password, _
            $f_AddToRecentFiles, $s_WritePassword, $f_ReadOnlyRecommended)
    SetError($_WordStatus_Success)
    Return 1
EndFunc   ;==>_WordDocSaveAs

;===============================================================================
;
; Function Name:    _WordDocClose()
; Description:      Closes a previously opened word document
; Parameter(s):     $o_object           - Object variable of a Word.Application, document object
;                   $i_SaveChanges      - Optional: specifies the save action for the document
;                                            0 = Do not save changes
;                                           -1 = Save changes
;                                           -2 = (Default) Prompt to save changes
;                   $i_OriginalFormat   - Optional: specifies the save format for the document
;                                           0 = Word Document
;                                           1 = Original Document Format
;                                           2 = (Default) Prompt User
;                   $f_RouteDocument    - Optional: specifies whether to route the document to the next recipient
;                                       0 = (Default) do not route
;                                       1 = route to next recipient
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Returns 1
;                   On Failure  - Returns 0 and sets @ERROR
;                   @ERROR      - 0 ($_WordStatus_Success) = No Error
;                               - 3 ($_WordStatus_InvalidDataType) = Invalid Data Type
;                               - 4 ($_WordStatus_InvalidObjectType) = Invalid Object Type
;                   @Extended   - Contains invalid parameter number
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordDocClose(ByRef $o_object, $i_SaveChanges = -2, $i_OriginalFormat = 2, $f_RouteDocument = 0)
    If Not IsObj($o_object) Then
        __WordErrorNotify("Error", "_WordDocClose", "$_WordStatus_InvalidDataType")
        SetError($_WordStatus_InvalidDataType, 1)
        Return 0
    EndIf
    ;
    If Not __WordIsObjType($o_object, "document") Then
        __WordErrorNotify("Error", "_WordDocClose", "$_WordStatus_InvalidObjectType")
        SetError($_WordStatus_InvalidObjectType, 1)
        Return 0
    EndIf
    
    $o_object.Close ($i_SaveChanges, $i_OriginalFormat, $f_RouteDocument)
    SetError($_WordStatus_Success)
    Return 1
EndFunc   ;==>_WordDocClose

;===============================================================================
;
; Function Name:    _WordDocGetCollection()
; Description:      Returns a collection object containing all documents
; Parameter(s):     $o_object   - Object variable of a Word.Application object
;                   $v_index    - Optional: Specifies whether to return a collection or indexed instance.
;                                   -1 = (Default) Returns a collection
;                                    0 = Returns the Active Document
;                                    The document name or index number to return (1 based)
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Returns an object collection of all documents, @EXTENDED = document count
;                   On Failure  - Returns 0 and sets @ERROR
;                   @ERROR      - 0 ($_WordStatus_Success) = No Error
;                               - 3 ($_WordStatus_InvalidDataType) = Invalid Data Type
;                               - 4 ($_WordStatus_InvalidObjectType) = Invalid Object Type
;                               - 5 ($_WordStatus_InvalidValue) = Invalid Value
;                               - 7 ($_WordStatus_NoMatch) = No Match
;                   @Extended   - Contains invalid parameter number
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordDocGetCollection(ByRef $o_object, $v_index = -1)
    If Not IsObj($o_object) Then
        __WordErrorNotify("Error", "_WordDocGetCollection", "$_WordStatus_InvalidDataType")
        SetError($_WordStatus_InvalidDataType, 1)
        Return 0
    EndIf
    ;
    If Not __WordIsObjType($o_object, "application") Then
        __WordErrorNotify("Error", "_WordDocGetCollection", "$_WordStatus_InvalidObjectType")
        SetError($_WordStatus_InvalidObjectType, 1)
        Return 0
    EndIf
    ;
    If IsNumber($v_index) Then
        Select
            Case $v_index = -1
                SetError($_WordStatus_Success)
                SetExtended($o_object.Documents.Count)
                Return $o_object.Documents
            Case $v_index = 0
                SetError($_WordStatus_Success)
                SetExtended($o_object.Documents.Count)
                Return $o_object.ActiveDocument
            Case $v_index > 0 And $v_index <= $o_object.Documents.Count
                SetError($_WordStatus_Success)
                SetExtended($o_object.Documents.Count)
                Return $o_object.Documents ($v_index)
            Case $v_index < -1
                __WordErrorNotify("Error", "_WordDocGetCollection", "$_WordStatus_InvalidValue")
                SetError($_WordStatus_InvalidValue, 2)
                Return 0
            Case Else
                __WordErrorNotify("Warning", "_WordDocGetCollection", "$_WordStatus_NoMatch")
                SetError($_WordStatus_NoMatch, 2)
                Return 0
        EndSelect
    Else
        For $o_doc In $o_object.Documents
            If $o_doc.Name = $v_index Then
                SetError($_WordStatus_Success)
                SetExtended($o_object.Documents.Count)
                Return $o_doc
            EndIf
        Next
        __WordErrorNotify("Warning", "_WordDocGetCollection", "$_WordStatus_NoMatch")
        SetError($_WordStatus_NoMatch, 2)
        Return 0
    EndIf
EndFunc   ;==>_WordDocGetCollection

;===============================================================================
;
; Function Name:    _WordDocFindReplace()
; Description:      Runs the specified find and replace operation.
; Parameter(s):     $o_object           - Object variable of a Word.Application, document object
;                   $s_FindText         - Optional: The text to be searched for. (See Remarks)
;                                           "" = (Default) Used to search for formatting only.
;                   $s_ReplaceWith      - Optional: The replacement text. (See Remarks)
;                                           "" = (Default) Delete the text specified by $s_FindText
;                   $i_Replace          - Optional: Specifies how many replacements are to be made.
;                                           0 = Replace no occurrences
;                                           1 = Replace the first occurrence encountered
;                                           2 = (Default) Replace all occurrences
;                   $v_SearchRange      - Optional: Specifies the Selection or Range to search.
;                                           -1 = Specifies the current selection
;                                           0 = (Default) Specifies the entire document
;                                           Any range object
;                   $f_MatchCase        - Optional: Specifies whether the find text will be case-sensitive.
;                                           0 = (Default) Not case-sensitive
;                                           1 = Case-sensitive
;                   $f_MatchWholeWord   - Optional: Specifies whether to have the find operation locate only entire words,
;                                           not text that's part of a larger word.
;                                           0 = (Default) Match partial words
;                                           1 = Only match entire words
;                   $f_MatchWildcards   - Optional: Specifies whether to have $s_FindText be a special search operator.
;                                           0 = (Default) Not a special search operator
;                                           1 = Special search operator
;                   $f_MatchSoundsLike  - Optional: Specifies whether to have the find operation locate words that sound similar to $s_FindText.
;                                           0 = (Default) Do not find similar sounding words
;                                           1 = Find similar sounding words
;                   $f_MatchAllWordForms- Optional: Specifies whether to have the find operation locate all forms of the find text
;                                           (for example, "sit" locates "sitting" and "sat").
;                                           0 = (Default) Do not match other word forms
;                                           1 = Match all word forms
;                   $f_Forward          - Optional: Specifies which direction to search.
;                                           0 = Search backward (toward the start of the document)
;                                           1 = (Default) Search forward (toward the end of the document)
;                   $i_Wrap             - Optional: Controls what happens if the search begins at a point other than the beginning of the document
;                                           and the end of the document is reached (or vice versa if $f_Forward is set to 0).
;                                           0 = The find operation ends if the beginning or end of the search range is reached
;                                           1 = (Default) The find operation continues if the beginning or end of the search range is reached
;                   $f_Format           - Optional: Specifies whether to have the find operation locate formatting in addition to or instead of the find text.
;                                           0 = (Default) Do not locate formatting
;                                           1 = Locate formatting
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Returns 1
;                   On Failure  - Returns 0 and sets @ERROR
;                   @ERROR      - 0 ($_WordStatus_Success) = No Error
;                               - 3 ($_WordStatus_InvalidDataType) = Invalid Data Type
;                               - 4 ($_WordStatus_InvalidObjectType) = Invalid Object Type
;                               - 5 ($_WordStatus_InvalidValue) = Invalid Value
;                               - 7 ($_WordStatus_NoMatch) = No Match
;                   @Extended   - Contains invalid parameter number
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordDocFindReplace(ByRef $o_object, $s_FindText = "", $s_ReplaceWith = "", $i_Replace = 2, $v_SearchRange = 0, $f_MatchCase = 0, $f_MatchWholeWord = 0, $f_MatchWildcards = 0, $f_MatchSoundsLike = 0, $f_MatchAllWordForms = 0, $f_Forward = 1, $i_Wrap = 1, $f_Format = 0)
    If Not IsObj($o_object) Then
        __WordErrorNotify("Error", "_WordDocFindReplace", "$_WordStatus_InvalidDataType")
        SetError($_WordStatus_InvalidDataType, 1)
        Return 0
    EndIf
    ;
    If Not __WordIsObjType($o_object, "document") Then
        __WordErrorNotify("Error", "_WordDocFindReplace", "$_WordStatus_InvalidObjectType")
        SetError($_WordStatus_InvalidObjectType, 1)
        Return 0
    EndIf
    ;
    Local $o_Find, $return
    
    Select
        Case $v_SearchRange = -1
            $v_SearchRange = $o_object.Application.Selection.Range
        Case $v_SearchRange = 0
            $v_SearchRange = $o_object.Range
        Case $v_SearchRange > -1
            __WordErrorNotify("Error", "_WordDocFindReplace", "$_WordStatus_InvalidValue")
            SetError($_WordStatus_InvalidValue, 5)
            Return 0
        Case Else
            If Not __WordIsObjType($v_SearchRange, "range") Then
                __WordErrorNotify("Error", "_WordDocFindReplace", "$_WordStatus_InvalidObjectType")
                SetError($_WordStatus_InvalidObjectType, 5)
                Return 0
            EndIf
    EndSelect
    
    $o_Find = $v_SearchRange.Find
    With $o_Find
        .ClearFormatting ()
        .Replacement.ClearFormatting ()
        $return = .Execute($s_FindText, $f_MatchCase, $f_MatchWholeWord, $f_MatchWildcards, $f_MatchSoundsLike, _
                $f_MatchAllWordForms, $f_Forward, $i_Wrap, $f_Format, $s_ReplaceWith, $i_Replace)
    EndWith
    
    If $return Then
        SetError($_WordStatus_Success)
        Return 1
    Else
        __WordErrorNotify("Warning", "_WordDocFindReplace", "$_WordStatus_NoMatch")
        SetError($_WordStatus_NoMatch)
        Return 0
    EndIf
EndFunc   ;==>_WordDocFindReplace

;===============================================================================
;
; Function Name:    _WordDocPrint()
; Description:      Prints all or part of the specified document.
; Parameter(s):     $o_object       - Object variable of a Word.Application, document object
;                   $f_Background   - Optional: Specifies whether to have the script continue while
;                                       Microsoft Word prints the document. (See Remarks)
;                                       0 = (Default) Wait for document to print
;                                       1 = Continue script without waiting
;                   $i_Copies       - Optional: The number of copies to be printed.
;                   $i_Orientation  - Optional: Sets the orientation of the page.
;                                       -1 = (Default) Current document orientation
;                                        0 = Portrait
;                                        1 = Landscape
;                   $f_Collate      - Optional: Specifies whether to print all pages of the document before printing the next copy.
;                                       0 = Do not collate
;                                       1 = (Default) Collate
;                   $s_Printer      - Optional: Sets the name of the printer.
;                   $i_Range        - Optional: Specifies the page range.
;                                       0 = (Default) The entire document
;                                       1 = The current selection
;                                       2 = The current page
;                                       3 = A specified range (must specify $i_From and $i_To)
;                                       4 = A specified range of pages (must specify $s_Pages)
;                   $i_From         - Optional: The starting page number when $i_Range is set to 3.
;                   $i_To           - Optional: The ending page number when $i_Range is set to 3.
;                   $s_Pages        - Optional: The page numbers and page ranges to be printed, separated by commas,
;                                       when $i_Range is set to 4. For example, "2, 6-10" prints page 2 and pages 6 through 10.
;                   $i_PageType     - Optional: The type of pages to be printed.
;                                       0 = (Default) All pages
;                                       1 = Odd-numbered pages only
;                                       2 = Even-numbered pages only
;                   $i_Item         - Optional: The item to be printed.
;                                       0 = (Default) Current document content
;                                       1 = Properties in the current document
;                                       2 = Comments and Markup in the current document
;                                       3 = Styles in the current document
;                                       4 = Autotext entries in the current document
;                                       5 = Key assignments in the current document
;                                       6 = An envelope
;                                       7 = Current document content including markup
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Returns 1
;                   On Failure  - Returns 0 and sets @ERROR
;                   @ERROR      - 0 ($_WordStatus_Success) = No Error
;                               - 1 ($_WordStatus_GeneralError) = General Error
;                               - 2 ($_WordStatus_ComError) = Com Error
;                               - 3 ($_WordStatus_InvalidDataType) = Invalid Data Type
;                               - 4 ($_WordStatus_InvalidObjectType) = Invalid Object Type
;                               - 5 ($_WordStatus_InvalidValue) = Invalid Value
;                   @Extended   - Contains invalid parameter number
; Remark(s):        Specifying $f_Background does NOT pause the script until the document is finished printing,
;                   it only pauses until Microsoft Word finishes sending the document to the printer.
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordDocPrint(ByRef $o_object, $f_Background = 0, $i_Copies = 1, $i_Orientation = -1, $f_Collate = 1, $s_Printer = "", $i_Range = 0, $i_From = "", $i_To = "", $s_Pages = "", $i_PageType = 0, $i_Item = 0)
    If Not IsObj($o_object) Then
        __WordErrorNotify("Error", "_WordDocPrint", "$_WordStatus_InvalidDataType")
        SetError($_WordStatus_InvalidDataType, 1)
        Return 0
    EndIf
    ;
    If Not __WordIsObjType($o_object, "document") Then
        __WordErrorNotify("Error", "_WordDocPrint", "$_WordStatus_InvalidObjectType")
        SetError($_WordStatus_InvalidObjectType, 1)
        Return 0
    EndIf
    ;
    Local $s_ActivePrinter, $i_Extended, $i_DocOrientation = "", $i_ErrorStatusCode = $_WordStatus_Success
    
    Switch $i_Range
        Case 3
            If Not $i_From Or Not $i_To Then
                __WordErrorNotify("Error", "_WordDocPrint", "$_WordStatus_InvalidValue", _
                        "When $i_Range is set to 3, then you must specify $i_From and $i_To.")
                SetError($_WordStatus_InvalidValue, 7)
                Return 0
            EndIf
        Case 4
            If Not $s_Pages Then
                __WordErrorNotify("Error", "_WordDocPrint", "$_WordStatus_InvalidValue", _
                        "When $i_Range is set to 4, you must specify $s_Pages.")
                SetError($_WordStatus_InvalidValue, 7)
                Return 0
            EndIf
    EndSwitch
    
    $i_Orientation = String($i_Orientation)
    If $i_Orientation <> "-1" Then
        Switch $i_Orientation
            Case "0", "1"
                $i_DocOrientation = String($o_object.PageSetup.Orientation)
                If $i_DocOrientation <> $i_Orientation Then
                    $o_object.PageSetup.Orientation = $i_Orientation
                EndIf
            Case Else
                __WordErrorNotify("Error", "_WordDocPrint", "$_WordStatus_InvalidValue")
                SetError($_WordStatus_InvalidValue, 4)
                Return 0
        EndSwitch
    EndIf
    
    ; Setup internal error handler to Trap COM errors, turn off error notification
    Local $status = __WordInternalErrorHandlerRegister()
    If Not $status Then __WordErrorNotify("Warning", "_WordDocPrint", _
            "Cannot register internal error handler, cannot trap COM errors", _
            "Use _WordErrorHandlerRegister() to register a user error handler")
    Local $f_NotifyStatus = _WordErrorNotify() ; save current error notify status
    _WordErrorNotify(False)
    
    If $s_Printer Then
        $s_ActivePrinter = $o_object.Application.ActivePrinter
        $o_object.Application.ActivePrinter = $s_Printer
        If @error = $_WordStatus_ComError And $WordComErrorNumber = -2147352567 And $WordComErrorDescription = "There is a printer error." Then
            $i_ErrorStatusCode = $_WordStatus_InvalidValue
            $s_ErrorMSG = "Invalid printer name specified."
            $i_Extended = 6
        EndIf
    EndIf
    
    $i_From = String($i_From)
    $i_To = String($i_To)
    If Not $i_ErrorStatusCode Then
        $o_object.PrintOut ($f_Background, 0, $i_Range, "", $i_From, $i_To, $i_Item, $i_Copies, $s_Pages, $i_PageType, 0, $f_Collate)
        If @error = $_WordStatus_ComError Then
            $i_ErrorStatusCode = $_WordStatus_ComError
        EndIf
    EndIf
    
    If $i_DocOrientation <> "" And $i_DocOrientation <> $i_Orientation Then
        $o_object.PageSetup.Orientation = $i_DocOrientation
    EndIf
    If $s_ActivePrinter Then
        $o_object.Application.ActivePrinter = $s_ActivePrinter
    EndIf
    
    ; restore error notify and error handler status
    _WordErrorNotify($f_NotifyStatus) ; restore notification status
    __WordInternalErrorHandlerDeRegister()
    
    Switch $i_ErrorStatusCode
        Case $_WordStatus_Success
            SetError($_WordStatus_Success)
            Return 1
        Case $_WordStatus_InvalidValue
            __WordErrorNotify("Error", "_WordDocPrint", "$_WordStatus_InvalidValue", $s_ErrorMSG)
            SetError($_WordStatus_InvalidValue, $i_Extended)
            Return 0
        Case $_WordStatus_ComError
            __WordErrorNotify("Error", "_WordDocPrint", "$_WordStatus_ComError", "There was an error while executing the 'PrintOut' Method.")
            SetError($_WordStatus_ComError)
            Return 0
        Case Else
            __WordErrorNotify("Error", "_WordDocPrint", "$_WordStatus_GeneralError", "Invalid Error Status - Notify Word.au3 developer")
            SetError($_WordStatus_GeneralError)
            Return 0
    EndSwitch
EndFunc   ;==>_WordDocPrint

;===============================================================================
;
; Function Name:    _WordDocPropertyGet()
; Description:      Returns a select property of the Word document.
; Parameter(s):     $o_object   - Object variable of a Word.Application, document object
;                   $v_property - Property selection
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Value of selected Property
;                   On Failure  - Returns 0 and sets @ERROR
;                   @ERROR      - 0 ($_WordStatus_Success) = No Error
;                               - 1 ($_WordStatus_GeneralError) = General Error
;                               - 2 ($_WordStatus_ComError) = Com Error
;                               - 3 ($_WordStatus_InvalidDataType) = Invalid Data Type
;                               - 4 ($_WordStatus_InvalidObjectType) = Invalid Object Type
;                               - 5 ($_WordStatus_InvalidValue) = Invalid Value
;                   @Extended   - Contains invalid parameter number
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordDocPropertyGet(ByRef $o_object, $v_property)
    If Not IsObj($o_object) Then
        __WordErrorNotify("Error", "_WordDocPropertyGet", "$_WordStatus_InvalidDataType")
        SetError($_WordStatus_InvalidDataType, 1)
        Return 0
    EndIf
    ;
    If Not __WordIsObjType($o_object, "document") Then
        __WordErrorNotify("Error", "_WordDocPropertyGet", "$_WordStatus_InvalidObjectType")
        SetError($_WordStatus_InvalidObjectType, 1)
        Return 0
    EndIf
    ;
    Local $s_Property, $s_ErrorMSG, $i_Extended, $i_ErrorStatusCode = $_WordStatus_Success
    
    ; Setup internal error handler to Trap COM errors, turn off error notification
    Local $status = __WordInternalErrorHandlerRegister()
    If Not $status Then __WordErrorNotify("Warning", "_WordDocPropertyGet", _
            "Cannot register internal error handler, cannot trap COM errors", _
            "Use _WordErrorHandlerRegister() to register a user error handler")
    Local $f_NotifyStatus = _WordErrorNotify() ; save current error notify status
    _WordErrorNotify(False)
    
    If IsNumber($v_property) Then
        Switch $v_property
            Case 19, 25 To 28
                $i_ErrorStatusCode = $_WordStatus_InvalidValue
                $s_ErrorMSG = "The specified property is not supported."
                $i_Extended = 2
            Case 1 To 30
                $s_Property = $o_object.BuiltInDocumentProperties ($v_property).value
                If @error = $_WordStatus_ComError Then
                    $i_ErrorStatusCode = $_WordStatus_ComError
                    $s_ErrorMSG = "The specified property has not been defined."
                    $i_Extended = 2
                EndIf
            Case Else
                $i_ErrorStatusCode = $_WordStatus_InvalidValue
                $s_ErrorMSG = "The specified property does not exist."
                $i_Extended = 2
        EndSwitch
    Else
        Switch $v_property
            Case "Title", "Subject", "Author", "Keywords", "Comments", "Template", "Last Author", "Revision Number", "Application Name", _
                    "Last Print Date", "Creation Date", "Last Save Time", "Total Editing Time", "Security", "Category", "Manager", "Company", "Hyperlink base"
                $s_Property = $o_object.BuiltInDocumentProperties ($v_property).value
                If @error = $_WordStatus_ComError Then
                    $i_ErrorStatusCode = $_WordStatus_ComError
                    $s_ErrorMSG = "The specified property has not been defined."
                    $i_Extended = 2
                EndIf
            Case "Pages", "Words", "Characters", "Characters (with spaces)", "Bytes", "Lines", "Paragraphs"
                $s_Property = $o_object.BuiltInDocumentProperties ("Number of " & $v_property).value
                If @error = $_WordStatus_ComError Then
                    $i_ErrorStatusCode = $_WordStatus_ComError
                    $s_ErrorMSG = "The specified property has not been defined."
                    $i_Extended = 2
                EndIf
            Case Else
                $i_ErrorStatusCode = $_WordStatus_InvalidValue
                $s_ErrorMSG = "The specified property does not exist."
                $i_Extended = 2
        EndSwitch
    EndIf
    
    ; restore error notify and error handler status
    _WordErrorNotify($f_NotifyStatus) ; restore notification status
    __WordInternalErrorHandlerDeRegister()
    
    Switch $i_ErrorStatusCode
        Case $_WordStatus_Success
            SetError($_WordStatus_Success)
            Return $s_Property
        Case $_WordStatus_InvalidValue
            __WordErrorNotify("Error", "_WordDocPropertyGet", "$_WordStatus_InvalidValue", $s_ErrorMSG)
            SetError($_WordStatus_InvalidValue, $i_Extended)
            Return 0
        Case $_WordStatus_ComError
            __WordErrorNotify("Error", "_WordDocPropertyGet", "$_WordStatus_ComError", $s_ErrorMSG)
            SetError($_WordStatus_ComError, $i_Extended)
            Return 0
        Case Else
            __WordErrorNotify("Error", "_WordDocPropertyGet", "$_WordStatus_GeneralError", "Invalid Error Status - Notify Word.au3 developer")
            SetError($_WordStatus_GeneralError)
            Return 0
    EndSwitch
EndFunc   ;==>_WordDocPropertyGet

;===============================================================================
;
; Function Name:    _WordDocPropertySet()
; Description:      Set a select property of the Word document.
; Parameter(s):     $o_object   - Object variable of a Word.Application, document object
;                   $v_property - Property selection
;                   $v_newvalue - The new value to be set into the Word Document Property
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Returns 1
;                   On Failure  - Returns 0 and sets @ERROR
;                   @ERROR      - 0 ($_WordStatus_Success) = No Error
;                               - 1 ($_WordStatus_GeneralError) = General Error
;                               - 2 ($_WordStatus_ComError) = Com Error
;                               - 3 ($_WordStatus_InvalidDataType) = Invalid Data Type
;                               - 4 ($_WordStatus_InvalidObjectType) = Invalid Object Type
;                               - 5 ($_WordStatus_InvalidValue) = Invalid Value
;                   @Extended   - Contains invalid parameter number
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordDocPropertySet(ByRef $o_object, $v_property, $v_newvalue)
    If Not IsObj($o_object) Then
        __WordErrorNotify("Error", "_WordDocPropertySet", "$_WordStatus_InvalidDataType")
        SetError($_WordStatus_InvalidDataType, 1)
        Return 0
    EndIf
    ;
    If Not __WordIsObjType($o_object, "document") Then
        __WordErrorNotify("Error", "_WordDocPropertySet", "$_WordStatus_InvalidObjectType")
        SetError($_WordStatus_InvalidObjectType, 1)
        Return 0
    EndIf
    
    Local $s_ErrorMSG, $i_Extended, $i_ErrorStatusCode = $_WordStatus_Success
    
    ; Setup internal error handler to Trap COM errors, turn off error notification
    Local $status = __WordInternalErrorHandlerRegister()
    If Not $status Then __WordErrorNotify("Warning", "_WordDocPropertySet", _
            "Cannot register internal error handler, cannot trap COM errors", _
            "Use _WordErrorHandlerRegister() to register a user error handler")
    Local $f_NotifyStatus = _WordErrorNotify() ; save current error notify status
    _WordErrorNotify(False)
    
    If IsNumber($v_property) Then
        Switch $v_property
            Case 1 To 6, 9, 18, 20, 21, 29
                $o_object.BuiltInDocumentProperties ($v_property).value = $v_newvalue
                If @error = $_WordStatus_ComError Then
                    $i_ErrorStatusCode = $_WordStatus_ComError
                    $s_ErrorMSG = "There was an error while setting the selected property."
                    $i_Extended = 3
                EndIf
            Case 1 To 30
                $i_ErrorStatusCode = $_WordStatus_InvalidValue
                $s_ErrorMSG = "The specified property is not supported."
                $i_Extended = 2
            Case Else
                $i_ErrorStatusCode = $_WordStatus_InvalidValue
                $s_ErrorMSG = "The specified property does not exist."
                $i_Extended = 2
        EndSwitch
    Else
        Switch $v_property
            Case "Title", "Subject", "Author", "Keywords", "Comments", "Template", _
                    "Application Name", "Category", "Manager", "Company", "Hyperlink base"
                $o_object.BuiltInDocumentProperties ($v_property).value = $v_newvalue
                If @error = $_WordStatus_ComError Then
                    $i_ErrorStatusCode = $_WordStatus_ComError
                    $s_ErrorMSG = "There was an error while setting the selected property."
                    $i_Extended = 3
                EndIf
            Case Else
                $i_ErrorStatusCode = $_WordStatus_InvalidValue
                $s_ErrorMSG = "The specified property does not exist."
                $i_Extended = 2
        EndSwitch
    EndIf
    
    ; restore error notify and error handler status
    _WordErrorNotify($f_NotifyStatus) ; restore notification status
    __WordInternalErrorHandlerDeRegister()
    
    Switch $i_ErrorStatusCode
        Case $_WordStatus_Success
            SetError($_WordStatus_Success)
            Return 1
        Case $_WordStatus_InvalidValue
            __WordErrorNotify("Error", "_WordDocPropertySet", "$_WordStatus_InvalidValue", $s_ErrorMSG)
            SetError($_WordStatus_InvalidValue, $i_Extended)
            Return 0
        Case $_WordStatus_ComError
            __WordErrorNotify("Error", "_WordDocPropertySet", "$_WordStatus_ComError", $s_ErrorMSG)
            SetError($_WordStatus_ComError, $i_Extended)
            Return 0
        Case Else
            __WordErrorNotify("Error", "_WordDocPropertySet", "$_WordStatus_GeneralError", "Invalid Error Status - Notify Word.au3 developer")
            SetError($_WordStatus_GeneralError)
            Return 0
    EndSwitch
EndFunc   ;==>_WordDocPropertySet

;===============================================================================
;
; Function Name:    _WordDocLinkGetCollection()
; Description:      Returns a collection object containing all links in the document
; Parameter(s):     $o_object   - Object variable of an Word.Application, document object
;                   $i_index    - Optional: specifies whether to return a collection or indexed instance
;                               - Positive integer returns an indexed instance (1 based)
;                               - -1 = (Default) returns a collection
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Returns an object collection of all links in the document, @EXTENDED = link count
;                   On Failure  - Returns 0 and sets @ERROR
;                   @ERROR      - 0 ($_WordStatus_Success) = No Error
;                               - 3 ($_WordStatus_InvalidDataType) = Invalid Data Type
;                               - 5 ($_WordStatus_InvalidValue) = Invalid Value
;                               - 7 ($_WordStatus_NoMatch) = No Match
;                   @Extended   - Contains invalid parameter number
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordDocLinkGetCollection(ByRef $o_object, $i_index = -1)
    If Not IsObj($o_object) Then
        __WordErrorNotify("Error", "_WordDocLinkGetCollection", "$_WordStatus_InvalidDataType")
        SetError($_WordStatus_InvalidDataType, 1)
        Return 0
    EndIf
    ;
    If Not __WordIsObjType($o_object, "document") Then
        __WordErrorNotify("Error", "_WordDocLinkGetCollection", "$_WordStatus_InvalidObjectType")
        SetError($_WordStatus_InvalidObjectType, 1)
        Return 0
    EndIf
    ;
    $i_index = Number($i_index)
    Select
        Case $i_index = -1
            SetError($_WordStatus_Success)
            SetExtended($o_object.Hyperlinks.Count)
            Return $o_object.Hyperlinks
        Case $i_index > 0 And $i_index <= $o_object.Hyperlinks.Count
            SetError($_WordStatus_Success)
            SetExtended($o_object.Hyperlinks.Count)
            Return $o_object.Hyperlinks.Item ($i_index)
        Case $i_index < -1 Or $i_index = 0
            __WordErrorNotify("Error", "_WordDocLinkGetCollection", "$_WordStatus_InvalidValue")
            SetError($_WordStatus_InvalidValue, 2)
            Return 0
        Case Else
            __WordErrorNotify("Warning", "_WordDocLinkGetCollection", "$_WordStatus_NoMatch")
            SetError($_WordStatus_NoMatch, 2)
            Return 0
    EndSelect
EndFunc   ;==>_WordDocLinkGetCollection

;===============================================================================
;
; Function Name:    _WordDocAddLink()
; Description:      Add a hyperlink to the document
; Parameter(s):     $o_object           - Object variable of a Word.Application, document object
;                   $o_Anchor           - Optional: The text or graphic that you want turned into a hyperlink.
;                                           "" = (Default) Uses entire document as range
;                   $s_Address          - Optional: The address for the specified link. The address can be an
;                                           e-mail address, an Internet address, or a file name.
;                                           "" = (Default) Link to the specified document is used
;                   $s_SubAddress       - Optional: The name of a location within the destination file, such as
;                                           a bookmark, named range, or slide number.
;                   $s_ScreenTip        - Optional: The text that appears as a ScreenTip when the mouse pointer is
;                                           positioned over the specified hyperlink.
;                                           "" = (Default) Uses value of $s_Address
;                   $s_TextToDisplay    - Optional: The display text of the specified hyperlink. The value of this
;                                           argument replaces the text or graphic specified by Anchor.
;                                           "" = (Default) Uses value of $s_Address
;                   $s_Target           - Optional: The name of the frame or window in which you want to load the specified hyperlink.
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Returns 1
;                   On Failure  - Returns 0 and sets @ERROR
;                   @ERROR      - 0 ($_WordStatus_Success) = No Error
;                               - 3 ($_WordStatus_InvalidDataType) = Invalid Data Type
;                               - 4 ($_WordStatus_InvalidObjectType) = Invalid Object Type
;                   @Extended   - Contains invalid parameter number
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordDocAddLink(ByRef $o_object, $o_Anchor = "", $s_Address = "", $s_SubAddress = "", $s_ScreenTip = "", $s_TextToDisplay = "", $s_Target = "")
    If Not IsObj($o_object) Then
        __WordErrorNotify("Error", "_WordDocAddLink", "$_WordStatus_InvalidDataType")
        SetError($_WordStatus_InvalidDataType, 1)
        Return 0
    EndIf
    ;
    If Not __WordIsObjType($o_object, "document") Then
        __WordErrorNotify("Error", "_WordDocAddLink", "$_WordStatus_InvalidObjectType")
        SetError($_WordStatus_InvalidObjectType, 1)
        Return 0
    EndIf
    
    If $o_Anchor = "" Then
        $o_Anchor = $o_object.Range
    EndIf
    
    If $s_Address = "" Then
        $s_Address = $o_object.FullName
    EndIf
    
    $o_object.Hyperlinks.Add ($o_Anchor, $s_Address, $s_SubAddress, $s_ScreenTip, $s_TextToDisplay, $s_Target)
    SetError($_WordStatus_Success)
    Return 1
EndFunc   ;==>_WordDocAddLink

;===============================================================================
;
; Function Name:    _WordDocAddPicture()
; Description:      Add a picture to the document
; Parameter(s):     $o_object           - Object variable of a Word.Application, document object.
;                   $s_FilePath         - The path and file name of the picture.
;                   $f_LinkToFile       - Optional: Specifies whether to link the picture to the file from which it was created.
;                                           0 = (Default) Make the picture an independent copy of the file
;                                           1 = Link the picture to the file from which it was created
;                   $f_SaveWithDocument - Optional: Specifies whether to save the linked picture with the document.
;                                           0 = (Default) Do not save the linked picture with the document
;                                           1 = Save the linked picture with the document
;                   $o_Range            - Optional: The location where the picture will be placed in the text.
;                                           "" = (Default) The picture is placed automatically
;                                           Any range object
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Returns an object variable pointing to a Word.Application, shape object
;                   On Failure  - Returns 0 and sets @ERROR
;                   @ERROR      - 0 ($_WordStatus_Success) = No Error
;                               - 1 ($_WordStatus_GeneralError) = General Error
;                               - 2 ($_WordStatus_ComError) = Com Error
;                               - 3 ($_WordStatus_InvalidDataType) = Invalid Data Type
;                               - 4 ($_WordStatus_InvalidObjectType) = Invalid Object Type
;                               - 5 ($_WordStatus_InvalidValue) = Invalid Value
;                   @Extended   - Contains invalid parameter number
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordDocAddPicture(ByRef $o_object, $s_FilePath, $f_LinkToFile = 0, $f_SaveWithDocument = 0, $o_Range = "")
    If Not IsObj($o_object) Then
        __WordErrorNotify("Error", "_WordDocAddPicture", "$_WordStatus_InvalidDataType")
        SetError($_WordStatus_InvalidDataType, 1)
        Return 0
    EndIf
    ;
    If Not __WordIsObjType($o_object, "document") Then
        __WordErrorNotify("Error", "_WordDocAddPicture", "$_WordStatus_InvalidObjectType")
        SetError($_WordStatus_InvalidObjectType, 1)
        Return 0
    EndIf
    ;
    If Not FileExists($s_FilePath) Then
        __WordErrorNotify("Error", "_WordDocAddPicture", "$_WordStatus_InvalidValue", "The specified file does not exist.")
        SetError($_WordStatus_InvalidValue, 2)
        Return 0
    EndIf
    ;
    Local $o_Shape, $f_Range, $i_ErrorStatusCode = $_WordStatus_Success
    
    If $o_Range = "" Then
        $f_Range = False
    Else
        If Not __WordIsObjType($o_Range, "range") Then
            __WordErrorNotify("Error", "_WordDocAddPicture", "$_WordStatus_InvalidObjectType")
            SetError($_WordStatus_InvalidObjectType, 5)
            Return 0
        EndIf
        $f_Range = True
    EndIf

    ; Setup internal error handler to Trap COM errors, turn off error notification
    Local $status = __WordInternalErrorHandlerRegister()
    If Not $status Then __WordErrorNotify("Warning", "_WordDocAddPicture", _
            "Cannot register internal error handler, cannot trap COM errors", _
            "Use _WordErrorHandlerRegister() to register a user error handler")
    Local $f_NotifyStatus = _WordErrorNotify() ; save current error notify status
    _WordErrorNotify(False)
    
    If $f_Range Then
        $o_Shape = $o_object.InlineShapes.AddPicture ($s_FilePath, $f_LinkToFile, $f_SaveWithDocument, $o_Range)
    Else
        $o_Shape = $o_object.InlineShapes.AddPicture ($s_FilePath, $f_LinkToFile, $f_SaveWithDocument)
    EndIf
    If @error = $_WordStatus_ComError Then $i_ErrorStatusCode = $_WordStatus_ComError
    
    ; restore error notify and error handler status
    _WordErrorNotify($f_NotifyStatus) ; restore notification status
    __WordInternalErrorHandlerDeRegister()
    
    Switch $i_ErrorStatusCode
        Case $_WordStatus_Success
            SetError($_WordStatus_Success)
            Return $o_Shape
        Case $_WordStatus_ComError
            __WordErrorNotify("Error", "_WordDocAddPicture", "$_WordStatus_ComError", "There was an error while executing the 'AddPicture' Method.")
            SetError($_WordStatus_ComError)
            Return 0
        Case Else
            __WordErrorNotify("Error", "_WordDocAddPicture", "$_WordStatus_GeneralError", "Invalid Error Status - Notify Word.au3 developer")
            SetError($_WordStatus_GeneralError)
            Return 0
    EndSwitch
EndFunc   ;==>_WordDocAddPicture
#endregion
#region Error Handling
;===============================================================================
;
; Function Name:   _WordErrorHandlerRegister()
; Description:      Register and enable a user COM error handler
; Parameter(s):     $s_functionName - String variable with the name of a user-defined COM error handler
;                                     defaults to the internal COM error handler in this UDF
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Returns 1
;                   On Failure  - Returns 0 and sets @ERROR
;                   @ERROR      - 0 ($_WordStatus_Success) = No Error
;                               - 1 ($_WordStatus_GeneralError) = General Error
;                   @Extended   - Contains invalid parameter number
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordErrorHandlerRegister($s_functionName = "__WordInternalErrorHandler")
    $sWordUserErrorHandler = $s_functionName
    $oWordErrorHandler = ""
    $oWordErrorHandler = ObjEvent("AutoIt.Error", $s_functionName)
    If IsObj($oWordErrorHandler) Then
        SetError($_WordStatus_Success)
        Return 1
    Else
        __WordErrorNotify("Error", "_WordErrorHandlerRegister", "$_WordStatus_GeneralError", _
                "Error Handler Not Registered - Check existance of error function")
        SetError($_WordStatus_GeneralError, 1)
        Return 0
    EndIf
EndFunc   ;==>_WordErrorHandlerRegister

;===============================================================================
;
; Function Name:   _WordErrorHandlerDeRegister()
; Description:      Disable a registered user COM error handler
; Parameter(s):     None
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Returns 1
;                   On Failure  - None
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordErrorHandlerDeRegister()
    $sWordUserErrorHandler = ""
    $oWordErrorHandler = ""
    SetError($_WordStatus_Success)
    Return 1
EndFunc   ;==>_WordErrorHandlerDeRegister
#endregion
#region Utility Functions
;===============================================================================
;
; Function Name:   _WordErrorNotify()
; Description:      Specifies whether Word.au3 automatically notifies of Warnings and Errors (to the console)
; Parameter(s):     $f_notify   - Optional: specifies whether notification should be on or off
;                               - -1 = (Default) return current setting
;                               - True = Turn On
;                               - False = Turn Off
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - If $f_notify = -1, returns the current notification setting, else returns 1
;                   On Failure  - Returns 0
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordErrorNotify($f_notify = -1)
    Switch Number($f_notify)
        Case (-1)
            Return $_WordErrorNotify
        Case 0
            $_WordErrorNotify = False
            Return 1
        Case 1
            $_WordErrorNotify = True
            Return 1
        Case Else
            __WordErrorNotify("Error", "_WordErrorNotify", "$_WordStatus_InvalidValue")
            Return 0
    EndSwitch
EndFunc   ;==>_WordErrorNotify

;===============================================================================
;
; Function Name:    _WordMacroRun()
; Description:      Runs a Visual Basic macro
; Parameter(s):     $o_object           - Object variable of a Word.Application object
;                   $s_MacroName        - The name of the macro. Can be any combination of template,
;                                           module, and macro name. (See Remarks)
;                   $v_Arg1             - Optional: The first parameter to pass to the macro
;                   ...                 ...
;                   $v_Arg30            - Optional: The thirtieth parameter to pass to the macro
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Returns 1
;                   On Failure  - Returns 0 and sets @ERROR
;                   @ERROR      - 0 ($_WordStatus_Success) = No Error
;                               - 1 ($_WordStatus_GeneralError) = General Error
;                               - 2 ($_WordStatus_ComError) = Com Error
;                               - 3 ($_WordStatus_InvalidDataType) = Invalid Data Type
;                               - 4 ($_WordStatus_InvalidObjectType) = Invalid Object Type
;                   @Extended   - Contains invalid parameter number
; Remark(s):        If you specify the document name, your code can only run macros in documents
;                   related to the current context — not just any macro in any document.
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordMacroRun(ByRef $o_object, $s_MacroName, $v_Arg1 = Default, $v_Arg2 = Default, $v_Arg3 = Default, $v_Arg4 = Default, $v_Arg5 = Default, $v_Arg6 = Default, $v_Arg7 = Default, $v_Arg8 = Default, $v_Arg9 = Default, $v_Arg10 = Default, $v_Arg11 = Default, $v_Arg12 = Default, $v_Arg13 = Default, $v_Arg14 = Default, $v_Arg15 = Default, $v_Arg16 = Default, $v_Arg17 = Default, $v_Arg18 = Default, $v_Arg19 = Default, $v_Arg20 = Default, $v_Arg21 = Default, $v_Arg22 = Default, $v_Arg23 = Default, $v_Arg24 = Default, $v_Arg25 = Default, $v_Arg26 = Default, $v_Arg27 = Default, $v_Arg28 = Default, $v_Arg29 = Default, $v_Arg30 = Default)

    If Not IsObj($o_object) Then
        __WordErrorNotify("Error", "_WordMacroRun", "$_WordStatus_InvalidDataType")
        SetError($_WordStatus_InvalidDataType, 1)
        Return 0
    EndIf
    ;
    If Not __WordIsObjType($o_object, "application") Then
        __WordErrorNotify("Error", "_WordMacroRun", "$_WordStatus_InvalidObjectType")
        SetError($_WordStatus_InvalidObjectType, 1)
        Return 0
    EndIf
    ;
    Local $s_ErrorMSG, $i_Extended, $i_ErrorStatusCode = $_WordStatus_Success
    
    ; Setup internal error handler to Trap COM errors, turn off error notification
    Local $status = __WordInternalErrorHandlerRegister()
    If Not $status Then __WordErrorNotify("Warning", "_WordMacroRun", _
            "Cannot register internal error handler, cannot trap COM errors", _
            "Use _WordErrorHandlerRegister() to register a user error handler")
    Local $f_NotifyStatus = _WordErrorNotify() ; save current error notify status
    _WordErrorNotify(False)
    
    $o_object.Run($s_MacroName, $v_Arg1, $v_Arg2, $v_Arg3, $v_Arg4, $v_Arg5, _
            $v_Arg6, $v_Arg7, $v_Arg8, $v_Arg9, $v_Arg10, _
            $v_Arg11, $v_Arg12, $v_Arg13, $v_Arg14, $v_Arg15, _
            $v_Arg16, $v_Arg17, $v_Arg18, $v_Arg19, $v_Arg20, _
            $v_Arg21, $v_Arg22, $v_Arg23, $v_Arg24, $v_Arg25, _
            $v_Arg26, $v_Arg27, $v_Arg28, $v_Arg29, $v_Arg30)
    
    If @error = $_WordStatus_ComError Then
        If $WordComErrorNumber = -2147352567 Then
            $i_ErrorStatusCode = $_WordStatus_InvalidValue
            Switch $WordComErrorWinDescription
                Case "Member not found."
                    $s_ErrorMSG = "The specified macro does not exist."
                    $i_Extended = 2
                Case "Invalid number of parameters."
                    $s_ErrorMSG = "Invalid number of parameters."
                    $i_Extended = -1
            EndSwitch
        Else
            $i_ErrorStatusCode = $_WordStatus_ComError
        EndIf
    EndIf
;~  ConsoleWrite("Error: " & $WordComErrorNumber & @CR)
;~  ConsoleWrite("Desc: " & $WordComErrorWinDescription & @CR)
    
    ; restore error notify and error handler status
    _WordErrorNotify($f_NotifyStatus) ; restore notification status
    __WordInternalErrorHandlerDeRegister()
    
    Switch $i_ErrorStatusCode
        Case $_WordStatus_Success
            SetError($_WordStatus_Success)
            Return 1
        Case $_WordStatus_InvalidValue
            __WordErrorNotify("Error", "_WordMacroRun", "$_WordStatus_InvalidValue", $s_ErrorMSG)
            SetError($_WordStatus_InvalidValue, $i_Extended)
            Return 0
        Case $_WordStatus_ComError
            __WordErrorNotify("Error", "_WordMacroRun", "$_WordStatus_ComError", "There was an error while executing the 'Run' Method.")
            SetError($_WordStatus_ComError)
            Return 0
        Case Else
            __WordErrorNotify("Error", "_WordMacroRun", "$_WordStatus_GeneralError", "Invalid Error Status - Notify Word.au3 developer.")
            SetError($_WordStatus_GeneralError)
            Return 0
    EndSwitch
EndFunc   ;==>_WordMacroRun

;===============================================================================
;
; Function Name:    _WordPropertyGet()
; Description:      Returns a select property of the Word Application
; Parameter(s):     $o_object   - Object variable of a Word.Application
;                   $s_property - Property selection
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Value of selected Property
;                   On Failure  - Returns 0 and sets @ERROR
;                   @ERROR      - 0 ($_WordStatus_Success) = No Error
;                               - 3 ($_WordStatus_InvalidDataType) = Invalid Data Type
;                               - 4 ($_WordStatus_InvalidObjectType) = Invalid Object Type
;                               - 5 ($_WordStatus_InvalidValue) = Invalid Value
;                   @Extended   - Contains invalid parameter number
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordPropertyGet(ByRef $o_object, $s_Property)
    If Not IsObj($o_object) Then
        __WordErrorNotify("Error", "_WordPropertyGet", "$_WordStatus_InvalidDataType")
        SetError($_WordStatus_InvalidDataType, 1)
        Return 0
    EndIf
    ;
    If Not __WordIsObjType($o_object, "wordobj") Then
        __WordErrorNotify("Error", "_WordPropertyGet", "$_WordStatus_InvalidObjectType")
        SetError($_WordStatus_InvalidObjectType, 1)
        Return 0
    EndIf
    
    $s_Property = StringLower($s_Property)
    Switch $s_Property
        Case "activeprinter"
            SetError($_WordStatus_Success)
            Return $o_object.Application.ActivePrinter ()
        Case "capslock"
            SetError($_WordStatus_Success)
            Return $o_object.Application.CapsLock ()
        Case "screentips"
            If __WordIsObjType($o_object, "window") Then
                SetError($_WordStatus_Success)
                Return $o_object.DisplayScreenTips ()
            Else
                SetError($_WordStatus_Success)
                Return $o_object.Application.DisplayScreenTips ()
            EndIf
        Case "scrollbars"
            SetError($_WordStatus_Success)
            Return $o_object.Application.DisplayScrollBars ()
        Case "statusbar"
            SetError($_WordStatus_Success)
            Return $o_object.Application.DisplayStatusBar ()
        Case "height"
            If __WordIsObjType($o_object, "window") Then
                SetError($_WordStatus_Success)
                Return $o_object.Height ()
            Else
                SetError($_WordStatus_Success)
                Return $o_object.Application.Height ()
            EndIf
        Case "language"
            SetError($_WordStatus_Success)
            Return $o_object.Application.Language ()
        Case "left"
            If __WordIsObjType($o_object, "window") Then
                SetError($_WordStatus_Success)
                Return $o_object.Left ()
            Else
                SetError($_WordStatus_Success)
                Return $o_object.Application.Left ()
            EndIf
        Case "numlock"
            SetError($_WordStatus_Success)
            Return $o_object.Application.Numlock ()
        Case "path"
            If __WordIsObjType($o_object, "document") Then
                SetError($_WordStatus_Success)
                Return $o_object.Path ()
            Else
                SetError($_WordStatus_Success)
                Return $o_object.Application.Path ()
            EndIf
        Case "screenupdating"
            SetError($_WordStatus_Success)
            Return $o_object.Application.ScreenUpdating ()
        Case "startuppath"
            SetError($_WordStatus_Success)
            Return $o_object.Application.StartupPath ()
        Case "top"
            If __WordIsObjType($o_object, "window") Then
                SetError($_WordStatus_Success)
                Return $o_object.Top ()
            Else
                SetError($_WordStatus_Success)
                Return $o_object.Application.Top ()
            EndIf
        Case "version"
            SetError($_WordStatus_Success)
            Return $o_object.Application.Version ()
        Case "visible"
            If __WordIsObjType($o_object, "window") Then
                SetError($_WordStatus_Success)
                Return $o_object.Visible ()
            Else
                SetError($_WordStatus_Success)
                Return $o_object.Application.Visible ()
            EndIf
        Case "width"
            If __WordIsObjType($o_object, "window") Then
                SetError($_WordStatus_Success)
                Return $o_object.Width ()
            Else
                SetError($_WordStatus_Success)
                Return $o_object.Application.Width ()
            EndIf
        Case "windowstate"
            If __WordIsObjType($o_object, "window") Then
                SetError($_WordStatus_Success)
                Return $o_object.WindowState ()
            Else
                SetError($_WordStatus_Success)
                Return $o_object.Application.WindowState ()
            EndIf
        Case Else
            ; Unsupported Property
            __WordErrorNotify("Error", "_WordPropertyGet", "$_WordStatus_InvalidValue", "Invalid Property")
            SetError($_WordStatus_InvalidValue, 2)
            Return 0
    EndSwitch
EndFunc   ;==>_WordPropertyGet

;===============================================================================
;
; Function Name:    _WordPropertySet()
; Description:      Set a select property of the Word Application
; Parameter(s):     $o_object   - Object variable of a Word.Application Object
;                   $s_property - Property selection
;                   $v_newvalue - The new value to be set into the Word Application Property
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Returns 1
;                   On Failure  - Returns 0 and sets @ERROR
;                   @ERROR      - 0 ($_WordStatus_Success) = No Error
;                               - 3 ($_WordStatus_InvalidDataType) = Invalid Data Type
;                               - 4 ($_WordStatus_InvalidObjectType) = Invalid Object Type
;                               - 5 ($_WordStatus_InvalidValue) = Invalid Value
;                   @Extended   - Contains invalid parameter number
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _WordPropertySet(ByRef $o_object, $s_Property, $v_newvalue)
    If Not IsObj($o_object) Then
        __WordErrorNotify("Error", "_WordPropertySet", "$_WordStatus_InvalidDataType")
        SetError($_WordStatus_InvalidDataType, 1)
        Return 0
    EndIf
    ;
    If Not __WordIsObjType($o_object, "wordobj") Then
        __WordErrorNotify("Error", "_WordPropertySet", "$_WordStatus_InvalidObjectType")
        SetError($_WordStatus_InvalidObjectType, 1)
        Return 0
    EndIf
    
    $s_Property = StringLower($s_Property)
    Switch $s_Property
        Case "activeprinter"
            SetError($_WordStatus_Success)
            $o_object.Application.ActivePrinter = $v_newvalue
            Return 1
        Case "screentips"
            If __WordIsObjType($o_object, "window") Then
                SetError($_WordStatus_Success)
                $o_object.DisplayScreenTips = $v_newvalue
                Return 1
            Else
                SetError($_WordStatus_Success)
                $o_object.Application.DisplayScreenTips = $v_newvalue
                Return 1
            EndIf
        Case "scrollbars"
            SetError($_WordStatus_Success)
            $o_object.Application.DisplayScrollBars = $v_newvalue
            Return 1
        Case "statusbar"
            SetError($_WordStatus_Success)
            $o_object.Application.DisplayStatusBar = $v_newvalue
            Return 1
        Case "height"
            If __WordIsObjType($o_object, "window") Then
                SetError($_WordStatus_Success)
                $o_object.Height = $v_newvalue
                Return 1
            Else
                SetError($_WordStatus_Success)
                $o_object.Application.Height = $v_newvalue
                Return 1
            EndIf
        Case "left"
            If __WordIsObjType($o_object, "window") Then
                SetError($_WordStatus_Success)
                $o_object.Left = $v_newvalue
                Return 1
            Else
                SetError($_WordStatus_Success)
                $o_object.Application.Left = $v_newvalue
                Return 1
            EndIf
        Case "screenupdating"
            SetError($_WordStatus_Success)
            $o_object.Application.ScreenUpdating = $v_newvalue
            Return 1
        Case "startuppath"
            SetError($_WordStatus_Success)
            $o_object.AApplication.StartupPath = $v_newvalue
            Return 1
        Case "top"
            If __WordIsObjType($o_object, "window") Then
                SetError($_WordStatus_Success)
                $o_object.Top = $v_newvalue
                Return 1
            Else
                SetError($_WordStatus_Success)
                $o_object.Application.Top = $v_newvalue
                Return 1
            EndIf
        Case "visible"
            If __WordIsObjType($o_object, "window") Then
                SetError($_WordStatus_Success)
                $o_object.visible = $v_newvalue
                Return 1
            Else
                SetError($_WordStatus_Success)
                $o_object.Application.Visible = $v_newvalue
                Return 1
            EndIf
        Case "width"
            If __WordIsObjType($o_object, "window") Then
                SetError($_WordStatus_Success)
                $o_object.Width = $v_newvalue
                Return 1
            Else
                SetError($_WordStatus_Success)
                $o_object.Application.Width = $v_newvalue
                Return 1
            EndIf
        Case "windowstate"
            If __WordIsObjType($o_object, "window") Then
                SetError($_WordStatus_Success)
                $o_object.WindowState = $v_newvalue
                Return 1
            Else
                SetError($_WordStatus_Success)
                $o_object.Application.WindowState = $v_newvalue
                Return 1
            EndIf
        Case Else
            ; Unsupported Property
            __WordErrorNotify("Error", "_WordPropertySet", "$_WordStatus_InvalidValue", "Invalid Property")
            SetError($_WordStatus_InvalidValue, 2)
            Return 0
    EndSwitch
EndFunc   ;==>_WordPropertySet
#endregion
#region General Functions
;===============================================================================
;
; Function Name:    _Word_VersionInfo()
; Description:      Returns an array of information about the Word.au3 version
; Parameter(s):     None
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Returns an array ($WordAU3VersionInfo)
;                               - $WordAU3VersionInfo[0] = Release Type (T=Test or V=Production)
;                               - $WordAU3VersionInfo[1] = Major Version
;                               - $WordAU3VersionInfo[2] = Minor Version
;                               - $WordAU3VersionInfo[3] = Sub Version
;                               - $WordAU3VersionInfo[4] = Release Date (YYYYMMDD)
;                               - $WordAU3VersionInfo[5] = Display Version (e.g. T0.1-0)
;                   On Failure  - None
; Author(s):        Bob Anthony (Code based off IE.au3)
;
;===============================================================================
;
Func _Word_VersionInfo()
    __WordErrorNotify("Information", "_Word_VersionInfo", "version " & _
            $WordAU3VersionInfo[0] & _
            $WordAU3VersionInfo[1] & "." & _
            $WordAU3VersionInfo[2] & "-" & _
            $WordAU3VersionInfo[3], "Release date: " & $WordAU3VersionInfo[4])
    SetError($_WordStatus_Success)
    Return $WordAU3VersionInfo
EndFunc   ;==>_Word_VersionInfo
#endregion
#region Internal Functions
;===============================================================================
;
; Function Name:   __WordGetHWND()
; Description:      Returns the hwnd of a word object
; Parameter(s):     None
; Requirement(s):   AutoIt3 Beta with COM support (post 3.1.1)
; Return Value(s):  On Success  - Returns 1
;                   On Failure  - None
; Author(s):        Bob Anthony
;
;===============================================================================
;
Func __WordGetHWND(ByRef $o_object)
    If Not IsObj($o_object) Then
        SetError($_WordStatus_InvalidDataType, 1)
        Return 0
    EndIf
    
    If Not __WordIsObjType($o_object, "window") Then
        SetError($_WordStatus_InvalidObjectType, 1)
        Return 0
    EndIf
    
    ; Setup internal error handler to Trap COM errors, turn off error notification
    Local $status = __WordInternalErrorHandlerRegister()
    If Not $status Then __WordErrorNotify("Warning", "internal function __WordGetHWND", _
            "Cannot register internal error handler, cannot trap COM errors", _
            "Use _WordErrorHandlerRegister() to register a user error handler")
    Local $f_NotifyStatus = _WordErrorNotify() ; save current error notify status
    _WordErrorNotify(False)
    ;
    Local $s_Title
    
    $s_Title = ($o_object.Caption & " - " & $o_object.Application.Caption)
    If Not $oWordErrorHandler.number = 0 Then
        SetError($_WordStatus_ComError)
        Return 0
    EndIf
    
    ; restore error notify and error handler status
    _WordErrorNotify($f_NotifyStatus) ; restore notification status
    __WordInternalErrorHandlerDeRegister()
    
    $hWnd = WinGetHandle($s_Title)
    If @error Then
        SetError($_WordStatus_GeneralError)
        Return 0
    EndIf
    
    SetError($_WordStatus_Success)
    Return $hWnd
EndFunc   ;==>__WordGetHWND

Func __WordErrorNotify($s_severity, $s_func, $s_status = "", $s_message = "")
    If $_WordErrorNotify Or $__WordAU3Debug Then
        Local $sStr = "--> Word.au3 " & $s_severity & " from function " & $s_func
        If Not $s_status = "" Then $sStr &= ", " & $s_status
        If Not $s_message = "" Then $sStr &= " (" & $s_message & ")"
        ConsoleWrite($sStr & @CR)
    EndIf
    Return 1
EndFunc   ;==>__WordErrorNotify

Func __WordInternalErrorHandlerRegister()
    Local $sCurrentErrorHandler = ObjEvent("AutoIt.Error")
    If $sCurrentErrorHandler <> "" And Not IsObj($oWordErrorHandler) Then
        ; We've got trouble... User COM Error handler assigned without using _WordUserErrorHandlerRegister
        SetError($_WordStatus_GeneralError)
        Return 0
    EndIf
    $oWordErrorHandler = ""
    $oWordErrorHandler = ObjEvent("AutoIt.Error", "__WordInternalErrorHandler")
    If IsObj($oWordErrorHandler) Then
        SetError($_WordStatus_Success)
        Return 1
    Else
        SetError($_WordStatus_GeneralError)
        Return 0
    EndIf
EndFunc   ;==>__WordInternalErrorHandlerRegister

Func __WordInternalErrorHandlerDeRegister()
    $oWordErrorHandler = ""
    If $sWordUserErrorHandler <> "" Then
        $oWordErrorHandler = ObjEvent("AutoIt.Error", $sWordUserErrorHandler)
    EndIf
    SetError($_WordStatus_Success)
    Return 1
EndFunc   ;==>__WordInternalErrorHandlerDeRegister

Func __WordInternalErrorHandler()
    $WordComErrorScriptline = $oWordErrorHandler.scriptline
    $WordComErrorNumber = $oWordErrorHandler.number
    $WordComErrorNumberHex = Hex($oWordErrorHandler.number, 8)
    $WordComErrorDescription = StringStripWS($oWordErrorHandler.description, 2)
    $WordComErrorWinDescription = StringStripWS($oWordErrorHandler.WinDescription, 2)
    $WordComErrorSource = $oWordErrorHandler.Source
    $WordComErrorHelpFile = $oWordErrorHandler.HelpFile
    $WordComErrorHelpContext = $oWordErrorHandler.HelpContext
    $WordComErrorLastDllError = $oWordErrorHandler.LastDllError
    $WordComErrorOutput = ""
    $WordComErrorOutput &= "--> COM Error Encountered in " & @ScriptName & @CR
    $WordComErrorOutput &= "----> $WordComErrorScriptline = " & $WordComErrorScriptline & @CR
    $WordComErrorOutput &= "----> $WordComErrorNumberHex = " & $WordComErrorNumberHex & @CR
    $WordComErrorOutput &= "----> $WordComErrorNumber = " & $WordComErrorNumber & @CR
    $WordComErrorOutput &= "----> $WordComErrorWinDescription = " & $WordComErrorWinDescription & @CR
    $WordComErrorOutput &= "----> $WordComErrorDescription = " & $WordComErrorDescription & @CR
    $WordComErrorOutput &= "----> $WordComErrorSource = " & $WordComErrorSource & @CR
    $WordComErrorOutput &= "----> $WordComErrorHelpFile = " & $WordComErrorHelpFile & @CR
    $WordComErrorOutput &= "----> $WordComErrorHelpContext = " & $WordComErrorHelpContext & @CR
    $WordComErrorOutput &= "----> $WordComErrorLastDllError = " & $WordComErrorLastDllError & @CR
    If $_WordErrorNotify Or $__WordAU3Debug Then ConsoleWrite($WordComErrorOutput & @CR)
    SetError($_WordStatus_ComError)
    Return
EndFunc   ;==>__WordInternalErrorHandler

;===============================================================================
;
; Function Name:    __WordLockSetForegroundWindow()
; Description:      Locks (and Unlocks) current Foreground Window focus to prevent a new window
;                   from stealing it (e.g. when creating invisible window)
; Parameter(s):     $nLockCode  - 1 Lock Foreground Window Focus, 2 Unlock Foreground Window Focus
; Requirement(s):   Windows 2000/Windows ME or higher
; Return Value(s):  On Success  - 1
;                   On Failure  - 0  and sets @ERROR and @EXTENDED to non-zero values
; Author(s):        Valik
;
;===============================================================================
;
Func __WordLockSetForegroundWindow($nLockCode)
    Local $aRet = DllCall("user32.dll", "int", "LockSetForegroundWindow", "int", $nLockCode)
    If @error Then
        SetError(@error, @extended)
        Return False
    EndIf
    Return $aRet[0]
EndFunc   ;==>__WordLockSetForegroundWindow

;===============================================================================
; Function Name:    __WordIsObjType()
; Description:      Check to see if an object variable is of a specific type
; Author(s):        Bob Anthony (Code based off IE.au3)
;===============================================================================
Func __WordIsObjType(ByRef $o_object, $s_type)
    If Not IsObj($o_object) Then
        SetError($_WordStatus_InvalidDataType, 1)
        Return 0
    EndIf
    
    ; Setup internal error handler to Trap COM errors, turn off error notification
    Local $status = __WordInternalErrorHandlerRegister()
    If Not $status Then __WordErrorNotify("Warning", "internal function __WordIsObjType", _
            "Cannot register internal error handler, cannot trap COM errors", _
            "Use _WordErrorHandlerRegister() to register a user error handler")
    Local $f_NotifyStatus = _WordErrorNotify() ; save current error notify status
    _WordErrorNotify(False)
    ;
    Local $s_Name = ObjName($o_object), $objectOK = False, $oTemp
    
    Switch $s_type
        Case "wordobj"
            If __WordIsObjType($o_object, "application") Then
                $objectOK = True
            ElseIf __WordIsObjType($o_object, "window") Then
                $objectOK = True
            ElseIf __WordIsObjType($o_object, "document") Then
                $objectOK = True
            EndIf
        Case "application"
            If $s_Name = "_Application" Then $objectOK = True
        Case "document"
            If $s_Name = "_Document" Then $objectOK = True
        Case "documents"
            If $s_Name = "Documents" Then $objectOK = True
        Case "range"
            If $s_Name = "Range" Then $objectOK = True
        Case "window"
            If $s_Name = "Window" Then $objectOK = True
        Case "windows"
            If $s_Name = "Windows" Then $objectOK = True
        Case Else
            ; Unsupported ObjType specified
            SetError($_WordStatus_InvalidValue, 2)
            Return 0
    EndSwitch
    
    ; restore error notify and error handler status
    _WordErrorNotify($f_NotifyStatus) ; restore notification status
    __WordInternalErrorHandlerDeRegister()
    
    If $objectOK Then
        SetError($_WordStatus_Success)
        Return 1
    Else
        SetError($_WordStatus_InvalidObjectType, 1)
        Return 0
    EndIf
    
EndFunc   ;==>__WordIsObjType
#endregion
Edited by madmorgan
Link to comment
Share on other sites

  • Moderators

madmorgan,

See what you think of this: :mellow:

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <file.au3>

#include <Word.au3>

Global $EXT = ""
Global $oWordApp = 0 ; <<<<<<<<<<<<<<<<<<<< Or error in Exit function

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 307, 308, 192, 124)
$Browse = GUICtrlCreateButton("Browse", 112, 120, 75, 25)
$Input1 = GUICtrlCreateInput("", 24, 88, 249, 21)
$Group1 = GUICtrlCreateGroup("Read Text File.", 8, 32, 289, 265)
$Label1 = GUICtrlCreateLabel("Please Select A Text File Fromat To Be Read Out.", 32, 64, 241, 17)
$PlayFile = GUICtrlCreateButton("PLAY", 202, 232, 75, 25)
GUICtrlSetState(-1, $GUI_DISABLE) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Initially disabled
$PauseFile = GUICtrlCreateButton("PAUSE", 111, 232, 75, 25)
GUICtrlSetState(-1, $GUI_DISABLE) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Initially disabled
$EnablePause = GUICtrlCreateCheckbox("Enable Pause", 111, 265, 100, 25)
$CLOSEFILEREADER = GUICtrlCreateButton("CLOSE", 24, 232, 75, 25)
$Slider1 = GUICtrlCreateSlider(72, 192, 150, 29)
$slidelim = GUICtrlSetLimit($Slider1, 100, 2)
$startpoint = 50
GUICtrlSetData($Slider1, $startpoint)
$Label2 = GUICtrlCreateLabel("Volume", 120, 168, 39, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE, $CLOSEFILEREADER
            _On_Exit()
        Case $Browse
            $file = FileOpenDialog("Please Select A TEXT FILE FORMAT TO Be Read Out", @ScriptDir, "Text Files (*.txt;*.Doc;*.Docx)", 1 + 2)
            GUICtrlSetData($Input1, $file)
            ; Set EXT value
            $EXT = StringRegExpReplace($file, "^.*\.", ".$1")  ; <<<<<<<<<<<<<<<<<<<<<<<<<
        Case $PlayFile
            Switch $EXT ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
                Case ".txt"
                    $sText = FileRead($file)
                    _ReadText($sText) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
                ;using the WORD UDF FROM THE SITE.
                Case ".Doc", ".Docx"
                    $sFilePath = ($file)
                    $oWordApp = _WordCreate($sFilePath, 0, 0)
                    $oDoc = $oWordApp.ActiveDocument
                    $sText = $oDoc.Range.Text
                    _ReadText($sText) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<
                    _WordQuit($oWordApp, 0)
            EndSwitch
    EndSwitch

    ; <<<<<<<<<<<<<<<<<<<
    ; Toggle PAUSE button depending on checkbox state
    If GUICtrlRead($EnablePause) = 1 And BitAND(GUICtrlGetState($PauseFile), $GUI_DISABLE) = $GUI_DISABLE Then
        GUICtrlSetState($PauseFile, $GUI_ENABLE)
    ElseIf GUICtrlRead($EnablePause) = 4 And BitAND(GUICtrlGetState($PauseFile), $GUI_ENABLE) = $GUI_ENABLE Then
        GUICtrlSetState($PauseFile, $GUI_DISABLE)
    EndIf

    ; Enable PLAY button if a file is selected
    If $EXT <> "" And BitAND(GUICtrlGetState($PlayFile), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($PlayFile, $GUI_ENABLE)
    ; <<<<<<<<<<<<<<<<<<<<
    
WEnd

Func _ReadText($sText)
    
    ; Disable PLAY button
    GUICtrlSetState($PlayFile, $GUI_DISABLE)
    $volume = GUICtrlRead($Slider1)
    $start = _StartTTS()
    _SetVolume($start, $volume)
    ; See if PAUSE is enabled
    If GUICtrlRead($EnablePause) = 1 Then
        ; Start speaking with pause enabled
        _Speak($start, $sText, 1)
        ; Look for other actions until all speech ended
        Do
            $nMsg = GUIGetMsg()
            Switch $nMsg
                Case $GUI_EVENT_CLOSE, $CLOSEFILEREADER
                    _On_Exit()
                Case $PauseFile
                    ; Pause/resume speech and adjust button title
                    If GUICtrlRead($PauseFile) = "PAUSE" Then
                        _Pause($start)
                        GUICtrlSetData($PauseFile, "RESUME")
                    Else
                        _Resume($start)
                        GUICtrlSetData($PauseFile, "PAUSE")
                    EndIf
            EndSwitch
        Until _Silence($start) = 1
    Else
        ; Start speaking uninterrupted
        _Speak($start, $sText)
        ; Wait until speech ended
        Do
            Sleep(10)
        Until _Silence($start) = 1
    EndIf
    ; Reenable PLAY button
    GUICtrlSetState($PlayFile, $GUI_ENABLE)

EndFunc

Func _On_Exit()
    _WordQuit($oWordApp, 0)
    $start = 0
    Exit
EndFunc

#include-once

; #FUNCTION# ====================================================================================================================
; Name...........: _StartTTS
; Description ...: Creates a object to be used with Text-to-Speak Functions.
; Syntax.........: _StartTTS()
; Parameters ....:
; Return values .: Success - Returns a object
; Author ........: bchris01

; Example .......: Yes
; ===============================================================================================================================
Func _StartTTS()
    Return ObjCreate("SAPI.SpVoice")
EndFunc   ;==>_StartTTS

; #FUNCTION# ====================================================================================================================
; Name...........: _SetRate
; Description ...: Sets the rendering rate of the voice. (How fast the voice talks.)
; Syntax.........: _SetRate(ByRef $Object, $iRate)
; Parameters ....: $Object        - Object returned from _StartTTS().
;                  $iRate         - Value specifying the speaking rate of the voice. Supported values range from -10 to 10
; Return values .:  None
; Author ........: bchris01
; Example .......: Yes
; ===============================================================================================================================
Func _SetRate(ByRef $Object, $iRate); Rates can be from -10 to 10
    $Object.Rate = $iRate
EndFunc   ;==>_SetRate

; #FUNCTION# ====================================================================================================================
; Name...........: _SetVolume
; Description ...: Sets the volume of the voice.
; Syntax.........: _SetVolume(ByRef $Object, $iVolume)
; Parameters ....: $Object        - Object returned from _StartTTS().
;                  $iVolume       - Value specifying the volume of the voice. Supported values range from 0-100. Default = 100
; Return values .:  None
; Author ........: bchris01
; Example .......: Yes
; ===============================================================================================================================
Func _SetVolume(ByRef $Object, $iVolume);Volume
    $Object.Volume = $iVolume
EndFunc   ;==>_SetVolume

; #FUNCTION# ====================================================================================================================
; Name...........: _SetVoice
; Description ...: Sets the identity of the voice used for text synthesis.
; Syntax.........: _SetVoice(ByRef $Object, $sVoiceName)
; Parameters ....: $Object        - Object returned from _StartTTS().
;                  $sVoiceName    - String matching one of the voices installed.
; Return values .:  Success - Sets object to voice.
;                   Failure - Sets @error to 1
; Author ........: bchris01
; Example .......: Yes
; ===============================================================================================================================
Func _SetVoice(ByRef $Object, $sVoiceName)
    Local $VoiceNames, $VoiceGroup = $Object.GetVoices
    For $VoiceNames In $VoiceGroup
        If $VoiceNames.GetDescription() = $sVoiceName Then
            $Object.Voice = $VoiceNames
            Return
        EndIf
    Next
    Return SetError(1)
EndFunc   ;==>_SetVoice

; #FUNCTION# ====================================================================================================================
; Name...........: _GetVoices
; Description ...: Retrives the currently installed voice identitys.
; Syntax.........: _GetVoices(ByRef $Object[, $Return = True])
; Parameters ....: $Object        - Object returned from _StartTTS().
;                  $bReturn       - String of text you want spoken.
;                  |If $bReturn = True then a 0-based array is returned.
;                  |If $bReturn = False then a string seperated by delimiter "|" is returned.
; Return values .:  Success - Returns an array or string containing installed voice identitys.
; Author ........: bchris01
; Example .......: Yes
; ===============================================================================================================================
Func _GetVoices(ByRef $Object, $bReturn = True)
    Local $sVoices, $VoiceGroup = $Object.GetVoices
    For $Voices In $VoiceGroup
        $sVoices &= $Voices.GetDescription() & '|'
    Next
    If $bReturn Then Return StringSplit(StringTrimRight($sVoices, 1), '|', 2)
    Return StringTrimRight($sVoices, 1)
EndFunc   ;==>_GetVoices

; #FUNCTION# ====================================================================================================================
; Name...........: _Speak
; Description ...: Speaks the contents of the text string.
; Syntax.........: _Speak(ByRef $Object, $sText, $iSyncState)
; Parameters ....: $Object        - Object returned from _StartTTS().
;                  $sText         - String of text you want spoken.
;                  $iSyncState    - 1 = Asynchronous speech - pausing enabled
; Return values .:  Success - Speaks the text.
; Author ........: bchris01
; Example .......: Yes
; ===============================================================================================================================
Func _Speak(ByRef $Object, $sText, $iSyncState = 0)
    $Object.Speak($sText, $iSyncState)
EndFunc   ;==>_Speak

Func _Silence(ByRef $Object)
    Return $Object.Status.RunningState()
EndFunc

Func _Pause(ByRef $Object)
    $Object.Pause()
EndFunc

Func _Resume(ByRef $Object)
    $Object.Resume()
EndFunc

I have included your TTS.au3 file within this code as I have added a few new functions and altered the _Speak function. You can easily adapt the original.

You will see where I have modified your initial code in detail by looking for the <<<<<<<<<<<<<<<<<<<. In summary:

1. Added code to permit pausing, which is selected by the checkbox and actioned by the PAUSE button (what else!)

2. Various buttons are disabled and enabled as the script progresses so you cannot play a file before any have been selected, action PLAY again before the speech has ended, or PAUSE an unpauseable speech action.

3. The main speech code has been put in a separate function to save code, as has the exit code because you can now exit from within pauseable speech. If you go for unpauseable speech then the whole script is blocked until the speech ends - which also explains why the button stays in its toggled state.

4. To make this single function possible, the whole text file is read in one go, rather than put into an array as you did. There was nothing wrong with your approach, but it had to be this way to get the single function to work!

I hope this is close to what you want - let me know if there is anything not quite right. :(

M23

Edit: Added point 4.

Edited by Melba23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

WOW Melba23

YOU made this better than i thought it could be i see hos the array was the probelm now and WOW you add in more functions, which i was going to try to do latter on so thanks Melba23 for your help this is now a 10/10+ addon to my final year project thanks.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...