Что нового

Как получить кнопку под выделенными словами

StarEdik

Новичок
Сообщения
365
Репутация
4
Привет всем !!!
Помогите написать скрипт - пожалуйста. Почти во всех текстовых редакторах и Html страницах сайта, когда на слове делаешь DblClick, слово выделяется. К примеру, у нас на форуме при выделении появляется надпись «Цитировать». Надо с помощью скрипта, получить такой эффект. Нужно, чтоб в Word , Notepad, Html, Qip появлялась кнопка.( под выделенным словом)
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
StarEdik

Код:
#include <MouseOnEvent.au3>
#include <GUIConstantsEx.au3>

$Form = GUICreate('Form1', 100, 30, -1, -1, $WS_POPUPWINDOW, BitOR($WS_EX_TOPMOST, 0x08000000))
$button1 = GUICtrlCreateButton('кнопка', 5, 5, 90, 20)
GUISetState(@SW_HIDE, $Form)

_MouseSetOnEvent($MOUSE_PRIMARYDBLCLK_EVENT, '_Out1') ; отображение окошка по двойному клику левой кнопки
_MouseSetOnEvent($MOUSE_SECONDARYDOWN_EVENT, '_Out2') ; скрытие окошка по клику правой кнопкой

While 1
	;Sleep(30)
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $button1			 
			Send('^{INS}')
			MsgBox(0, 'Сообщение', ClipGet())
	EndSwitch
WEnd

Func _Out1()
If WinActive ('[REGEXPCLASS:SciTEWindow|Notepad]') Then ; вписать классы нужных окон	
	GUISetState(@SW_HIDE, $Form)
	$pos = MouseGetPos()	
	GUISetState(@SW_SHOW, $Form)
	WinMove($Form, '', $pos[0], $pos[1] + 20)
EndIf
EndFunc   ;==>_Out1

Func _Out2()
	GUISetState(@SW_HIDE, $Form)
EndFunc   ;==>_Out2


MouseOnEvent.au3
http://autoit-script.ru/index.php/topic,198.0.html
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
WSWR,
Не должно это работать.

Проверил - не работает (у меня).
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
StarEdik
CreatoR на ru-board'де давно выкладывал пример цитатника, событие при выделении текста. В принципе остаётся только кнопку нарисовать по событию.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
madmasles
У меня работает на 2 ПК
У вас MouseOnEvent.au3 от июля 2012?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
http://autoit-script.ru/index.php?action=downloads;sa=view;down=17
после выделения текста отправляет сразу в буфер обмена.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
WSWR [?]
У меня работает на 2 ПК
У вас MouseOnEvent.au3 от июля 2012?
Была 1.8, поставил 1.9 - работает. Я бы паузу в цикле убрал, чтобы не было проблем с окном.
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
WSWR
Спасибо за хороший пример. То, что нужно. Только вот, он везде срабатывает. Можно сделать так, чтоб скрипт действовал только в Word , Notepad и Html.

AZJIO
По идее, при DblClick выделенное слово сразу должно копироваться в буфер, а оттуда в файл. Но этого не происходит.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
StarEdik
Я изменил пример, там можно вписать классы окон, в которых будет работать.
В принципе, можно добавить еще проверку на тип курсора.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
#include <MouseOnEvent.au3>
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>

;Список классов окон (с поддержкой рег. выражения)
Global $hWinList[4] = ['Notepad.*', 'OpusApp', '(OpWindow|OperaWindowClass)', 'TfrmTabber\.UnicodeClass']

$hGUI = GUICreate('Копировать', 80, 25, -1, -1, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW))
$iCopy_Button = GUICtrlCreateButton('Копировать', 0, 0, 80, 25)
$hCopy_Button = GUICtrlGetHandle(-1)

_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, '_Cklick_Event')
_MouseSetOnEvent($MOUSE_PRIMARYDBLCLK_EVENT, '_DblClick_Event')

While 1
	$nMsg = GUIGetMsg()
	
	Switch $nMsg
		Case $iCopy_Button
			GUISetState(@SW_HIDE, $hGUI)
			Send('^{INS}')
			ConsoleWrite('Скопировано: ' & ClipGet() & @LF)
	EndSwitch
WEnd

Func _Cklick_Event()
	If Not _WinFromListActive() Then
		Return 0
	EndIf
	
	Local $tPoint = DllStructCreate($tagPOINT)
	DllStructSetData($tPoint, "x", MouseGetPos(0))
    DllStructSetData($tPoint, "y", MouseGetPos(1))
	
	If _WinAPI_WindowFromPoint($tPoint) <> $hCopy_Button Then
		GUISetState(@SW_HIDE, $hGUI)
	EndIf
EndFunc

Func _DblClick_Event()
	If Not _WinFromListActive() Then
		Return 0
	EndIf
	
	Local $aMPos = MouseGetPos()
	WinMove($hGUI, '', $aMPos[0] + 10, $aMPos[1] + 15)
	
	GUISetState(@SW_SHOW, $hGUI)
EndFunc

Func _WinFromListActive()
	For $i = 0 To UBound($hWinList)-1
		If WinActive('[REGEXPCLASS:' & $hWinList[$i] & ']') Then
			Return 1
		EndIf
	Next
	
	Return 0
EndFunc
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
CreatoR
WSWR

Спасибо вам обоим. В блокноте оба скрипта работают на ура. Но в Word (Class:shok:pusApp) при DblClick ( не выделяется и по этому ) не копируется слово под курсором и вставляется то что было скопировано в блокноте. В Operе контесктное меню прикрывает кнопку .
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
StarEdik [?]
в Word (Class:shok:pusApp) при DblClick ( не выделяется и по этому ) не копируется слово под курсором
Ну а скрипт ещё выделять должен уметь? :laugh:

В Operе контесктное меню прикрывает кнопку
Меню по двойному нажатию можно отключить («F12 -> Расширенные -> Панели -> Меню по двойному щелчку левой кнопкой мышки»).
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
CreatoR
Ну а скрипт ещё выделять должен уметь?
Обычно при DblClick, word выделяет слово. :whistle: Но после запуска вашего скрипта ( и у скрипта WSWR ), это свойство у Word исчезает. :scratch: И по этому слово не копируется. А у Блокнота это свойство остается и при даблклик, выделяется слово и копируется
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
StarEdik [?]
после запуска вашего скрипта ( и у скрипта WSWR ), это свойство у Word исчезает
Это из за активирования окна кнопки, вот исправленный вариант:

Код:
#include <MouseOnEvent.au3>
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>

;Список классов окон (с поддержкой рег. выражения)
Global $shWinList = 'Notepad.*|OpusApp|OperaWindowClass|TfrmTabber\.UnicodeClass'

$hGUI = GUICreate('Копировать', 80, 25, -1, -1, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW))
$iCopy_Button = GUICtrlCreateButton('Копировать', 0, 0, 80, 25)
$hCopy_Button = GUICtrlGetHandle(-1)

_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, '_Cklick_Event')
_MouseSetOnEvent($MOUSE_PRIMARYDBLCLK_EVENT, '_DblClick_Event')

HotKeySet('{ESC}', '_Exit')

While 1
	$nMsg = GUIGetMsg()
	
	Switch $nMsg
		Case $iCopy_Button
			GUISetState(@SW_HIDE, $hGUI)
			Send('^{INS}')
			Sleep(100)
			ConsoleWrite('Скопировано: ' & ClipGet() & @LF)
	EndSwitch
WEnd

Func _Cklick_Event()
	Local $tPoint = DllStructCreate($tagPOINT)
	
	DllStructSetData($tPoint, "x", MouseGetPos(0))
    DllStructSetData($tPoint, "y", MouseGetPos(1))
	
	If _WinAPI_WindowFromPoint($tPoint) <> $hCopy_Button Then
		GUISetState(@SW_HIDE, $hGUI)
	EndIf
EndFunc

Func _DblClick_Event()
	If WinActive('[REGEXPCLASS:^(' & $shWinList & ')$]') Then
		$aMPos = MouseGetPos()
		WinMove($hGUI, '', $aMPos[0] + 10, $aMPos[1] + 15)
		GUISetState(@SW_SHOWNOACTIVATE, $hGUI)
	EndIf
EndFunc

Func _Exit()
	Exit
EndFunc
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
CreatoR
Все просто и гениально.Спасибо :IL_AutoIt_1:
 
Верх