Описание функции
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)