Описание функции


TextFromWindowPosition

Захват текста под курсором

TextFromWindowPosition(*Name.String, *Value.String)

Параметры

*Name.String Структура строки, в которую возвращается результат
*Value.String Структура строки, в которую возвращается результат

Пример

; Автор: fizban (изменения от AZJIO)
; https://www.purebasic.fr/english/viewtopic.php?t=33954

EnableExplicit

;-Перечисления гаджетов
Enumeration Gadgets
    #txtValue
    #txtName
    #edValue
    #edName
    #imgCursor
    #frmOptions
    #txtDrag
EndEnumeration

;-Изображения
Enumeration Images
    #picHand
    #picNo
EndEnumeration

;-Прототипы
Prototype.l ProtoAccessibleObjectFromPoint(ptScreen.q, *ppacc, *pvarChild)
Global AccessibleObjectFromPoint.ProtoAccessibleObjectFromPoint
Define hdll.l

; Приложения должны инициализировать библиотеку COM, прежде чем они смогут вызывать функции библиотеки COM
CoInitialize_(0)
hdll = OpenLibrary(#PB_Any, "Oleacc.dll")
If hdll
    AccessibleObjectFromPoint = GetFunction(hdll, "AccessibleObjectFromPoint")
Else
    MessageRequester("", "Не удалось открыть Oleacc.dll")
    End
EndIf

Procedure TextFromWindowPosition(*Name.String, *Value.String)
    Protected p.POINT, vt.VARIANT, *pIAcc.IAccessible, *pName
    GetCursorPos_(@p)
;     PeekQ(@p) тоже что p\y<<32|p\x
    If AccessibleObjectFromPoint(PeekQ(@p), @*pIAcc, @vt) = #S_OK
        *Name\s = ""
        If *pIAcc\get_accName(vt, @*pName) = #S_OK
            *Name\s = PeekS(*pName)
            SysFreeString_(*pName)
        EndIf
        *Value\s = ""
        If *pIAcc\get_accValue(vt, @*pName) = #S_OK
            *Value\s = PeekS(*pName, -1, #PB_Unicode)
            SysFreeString_(*pName)
        EndIf
        *pIAcc\Release()
    EndIf
    ProcedureReturn #True
EndProcedure

;-Define
Define dragging.b
Define name.string, value.string
Define handcursor = LoadCursor_(0, #IDC_HAND)
Define normalcursor = LoadCursor_(0, #IDC_ARROW)
Define nocursor = LoadCursor_(0, #IDC_NO)

;-GUI
If OpenWindow(0, 0, 0, 345, 218, "Захват текста", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget)
    TextGadget(#txtName, 10, 0, 88, 20, "Имя:")
    EditorGadget(#edName, 10, 20, 326, 50)
    TextGadget(#txtValue, 10, 74, 88, 20, "Значение:")
    EditorGadget(#edValue, 10, 94, 326, 50)
    ImageGadget(#imgCursor, 40, 154, 24, 24, handcursor)
    TextGadget(#txtDrag, 13, 180, 222, 40, "Тащи курсор на элемент окна")
    FrameGadget(#frmOptions, 10, 144, 226, 66, "")
    ;-Основной цикл
    Repeat
        Select WaitWindowEvent()
            Case #PB_Event_Gadget
                Select EventGadget()
                    Case #imgCursor
                        If EventType() = #PB_EventType_LeftClick
                            SetCapture_(WindowID(0))
                            SetCursor_(handcursor)
                            SetGadgetState(#imgCursor, nocursor)
                            dragging = #True
                        EndIf
                EndSelect
            Case #WM_MOUSEMOVE
                If dragging = #True
                    TextFromWindowPosition(@name, @value)
                    SetGadgetText(#edName, name\s)
                    SetGadgetText(#edValue, value\s)
                EndIf
            Case #WM_LBUTTONUP
                If dragging = #True
                    ReleaseCapture_()
                    SetCursor_(normalcursor)
                    SetGadgetState(#imgCursor, handcursor)
                    dragging = #False
                    SetClipboardText(name\s + #CRLF$ + value\s)
                EndIf
            Case #PB_Event_CloseWindow
                Break
        EndSelect
    ForEver
EndIf
CoUninitialize_()
CloseLibrary(hdll)