Что нового

Автоматическое копирование в буфер выделеного кода в SciTE ?

agikon

Знающий
Сообщения
789
Репутация
17
Подскажиет пожалуйста, можно ли как то настроить чтобы в SciTE выделеный код сразу заносился в буфер?
От действительно бы эта возможность не помешала бы.
 

WSWR

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

Так у нас же есть скрипты на эту тему:
С кнопкой:
http://autoit-script.ru/index.php?topic=12613.msg81483#msg81483
Только поменять там строку
Код:
Global $shWinList = 'Notepad.*|OpusApp|OperaWindowClass|TfrmTabber\.UnicodeClass'

на
Код:
Global $shWinList = 'Notepad.*|OpusApp|OperaWindowClass|TfrmTabber\.UnicodeClass|SciTEWindow'


Или
переделанный скрипт отсюда:
http://autoit-script.ru/index.php?action=downloads;sa=view;down=17
Копирует автоматом, что может быть не всегда удобно
Код:
#NoTrayIcon
#include <Constants.au3>
#include <Misc.au3>
#include <MouseOnEvent.au3>

Opt('TrayMenuMode', 1)
TraySetIcon('shell32.dll', -135)
TraySetClick(16)
TraySetState()

$CopyUseSelection_TrayItem = TrayCreateItem('Копировать по выделению')
TrayItemSetState(-1, $TRAY_CHECKED)

$SwitchMonitoring_TrayItem = TrayCreateItem('Мониторинг выделения включён')
TrayItemSetState(-1, $TRAY_CHECKED)

TrayCreateItem('')

$Exit_TrayItem = TrayCreateItem('Выход')

Global $sCopy_HotKey = '^+c'
Global $sToggleScriptPause_HotKey = '^+p'
Global $sExit_HotKey = '^+e'

Global $iMouse_X_Position = MouseGetPos(0)
Global $iSelected = False
Global $iPaused = True

Global $shWinList = '\.UnicodeClass|SciTEWindow' ; список классов окон, где будет работать

;Global $sFile = @ScriptDir & '\SelectedText.txt'

HotKeySet($sExit_HotKey, '_Quit')
HotKeySet($sToggleScriptPause_HotKey, '_SwitchMonitoring_Proc')

_SwitchMonitoring_Proc()

While 1
	Switch TrayGetMsg()
		Case $TRAY_EVENT_PRIMARYUP, $SwitchMonitoring_TrayItem
			_SwitchMonitoring_Proc()
		Case $CopyUseSelection_TrayItem
			If TrayItemGetState($CopyUseSelection_TrayItem) = 65 Then
				_SetMouseEvent_Proc(1)
				HotKeySet($sCopy_HotKey)
			Else
				_SetMouseEvent_Proc(0)
				HotKeySet($sCopy_HotKey, '_CopyUseHotkey_Proc')
			EndIf
		Case $Exit_TrayItem
			_Quit()
	EndSwitch
	
	If $iSelected Then
		$iSelected = False
		$sSelection = _GetSelectedText()
		If $sSelection <> '' Then ConsoleWrite($sSelection & @CRLF)
	EndIf
WEnd

Func MousePrimaryDown_Event()
	$iMouse_X_Position = MouseGetPos(0)
EndFunc   ;==>MousePrimaryDown_Event

Func MousePrimaryUp_Event()
	If $iMouse_X_Position <> MouseGetPos(0) Then $iSelected = True
EndFunc   ;==>MousePrimaryUp_Event

Func _GetSelectedText()
	Local $sSelected_Data
	
	;This one is crashing the script :(
;~ 	Local $hWnd = WinGetHandle('')
;~ 	Local $sCtrlClass = ControlGetFocus($hWnd);~
;~ 	If Not StringInStr($sCtrlClass, 'Scintilla') Then
;~ 		$sSelected_Data = ControlCommand($hWnd, '', $sCtrlClass, 'GetSelected')
;~ 		If IsString($sSelected_Data) Then Return $sSelected_Data
;~ 	EndIf
	
;~ 	Local $sOld_Clipboard_Data = ClipGet()
	If WinActive('[REGEXPCLASS:^(' & $shWinList & ')$]') Then
		ClipPut('')
		Send('^{INS}')
		$sSelected_Data = ClipGet()
;~ 	ClipPut($sOld_Clipboard_Data)
	EndIf
	Return $sSelected_Data
EndFunc   ;==>_GetSelectedText

Func _CopyUseHotkey_Proc()
	$iSelected = True
EndFunc   ;==>_CopyUseHotkey_Proc

Func _SwitchMonitoring_Proc()
	$iPaused = Not $iPaused
	
	If $iPaused Then
		TrayItemSetText($SwitchMonitoring_TrayItem, 'Мониторинг выделения выключен')
		TrayItemSetState($SwitchMonitoring_TrayItem, $TRAY_UNCHECKED)
		TraySetIcon('shell32.dll', -66)
		
		_SetMouseEvent_Proc(0)
	Else
		TrayItemSetText($SwitchMonitoring_TrayItem, 'Мониторинг выделения включен')
		TrayItemSetState($SwitchMonitoring_TrayItem, $TRAY_CHECKED)
		TraySetIcon('shell32.dll', -135)
		
		_SetMouseEvent_Proc(1)
	EndIf
EndFunc   ;==>_SwitchMonitoring_Proc

Func _SetMouseEvent_Proc($iSet = 1)
	If $iSet = 1 And TrayItemGetState($CopyUseSelection_TrayItem) = 68 Then Return 0
	
	Switch $iSet
		Case 1
			_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, 'MousePrimaryDown_Event')
			_MouseSetOnEvent($MOUSE_PRIMARYUP_EVENT, 'MousePrimaryUp_Event')
		Case Else
			_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT)
			_MouseSetOnEvent($MOUSE_PRIMARYUP_EVENT)
	EndSwitch
EndFunc   ;==>_SetMouseEvent_Proc

Func _Quit()
	_SetMouseEvent_Proc(0)
	Exit
EndFunc   ;==>_Quit


Или вариант с дополнительным нажатием ALT:
http://forum.ru-board.com/topic.cgi?forum=5&topic=29240&start=2500#16
Код:
#NoTrayIcon
#include <Misc.au3>
#include <MouseOnEvent.au3>

Global $hUser32_Dll = DllOpen('User32.dll')
Global $iSelected = False
Global $iPaused = True

HotKeySet('^+e', '_Quit')
HotKeySet('^+w', '_TogglePause')

_TogglePause()

While 1
	Sleep(10)

	If $iSelected Then
		$iSelected = False

		If _IsPressed('12', $hUser32_Dll) Then
			While _IsPressed('12', $hUser32_Dll)
				Sleep(10)
			WEnd

			$sSelection = _GetSelectedText()
			If $sSelection <> '' Then ConsoleWrite($sSelection & @CRLF)
		EndIf
	EndIf
WEnd

Func MousePrimaryUp_Event()
	$iSelected = True
EndFunc   ;==>MousePrimaryUp_Event

Func _GetSelectedText()
	Local $sOld_Clipboard_Data = ClipGet()

	ClipPut('')
	Send('^{Insert}')
	Sleep(100)
	Local $sSelected_Data = ClipGet()
;~ 	ClipPut($sOld_Clipboard_Data)

	Return $sSelected_Data
EndFunc   ;==>_GetSelectedText

Func _TogglePause()
	$iPaused = Not $iPaused

	If $iPaused Then
		_MouseSetOnEvent($MOUSE_PRIMARYUP_EVENT)
	Else
		_MouseSetOnEvent($MOUSE_PRIMARYUP_EVENT, 'MousePrimaryUp_Event')
	EndIf
EndFunc   ;==>_TogglePause

Func _Quit()
	DllClose($hUser32_Dll)
	Exit
EndFunc   ;==>_Quit

Для всех примеров свежая MouseOnEvent.au3 здесь
http://autoit-script.ru/index.php/topic,198.0.html
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
Самым близким вариантом вроде бы по Вашему описанию подошел бы вот этот код. Но он то ли у меня, то ли ещё что-то, вобщем не хочет работать.

Код:
#NoTrayIcon
#include <Constants.au3>
#include <Misc.au3>
#include <MouseOnEvent.au3>

Opt('TrayMenuMode', 1)
TraySetIcon('shell32.dll', -135)
TraySetClick(16)
TraySetState()

$CopyUseSelection_TrayItem = TrayCreateItem('Копировать по выделению')
TrayItemSetState(-1, $TRAY_CHECKED)

$SwitchMonitoring_TrayItem = TrayCreateItem('Мониторинг выделения включён')
TrayItemSetState(-1, $TRAY_CHECKED)

TrayCreateItem('')

$Exit_TrayItem = TrayCreateItem('Выход')

Global $sCopy_HotKey = '^+c'
Global $sToggleScriptPause_HotKey = '^+p'
Global $sExit_HotKey = '^+e'

Global $iMouse_X_Position = MouseGetPos(0)
Global $iSelected = False
Global $iPaused = True

Global $shWinList = '\.UnicodeClass|SciTEWindow' ; список классов окон, где будет работать

;Global $sFile = @ScriptDir & '\SelectedText.txt'

HotKeySet($sExit_HotKey, '_Quit')
HotKeySet($sToggleScriptPause_HotKey, '_SwitchMonitoring_Proc')

_SwitchMonitoring_Proc()

While 1
    Switch TrayGetMsg()
        Case $TRAY_EVENT_PRIMARYUP, $SwitchMonitoring_TrayItem
            _SwitchMonitoring_Proc()
        Case $CopyUseSelection_TrayItem
            If TrayItemGetState($CopyUseSelection_TrayItem) = 65 Then
                _SetMouseEvent_Proc(1)
                HotKeySet($sCopy_HotKey)
            Else
                _SetMouseEvent_Proc(0)
                HotKeySet($sCopy_HotKey, '_CopyUseHotkey_Proc')
            EndIf
        Case $Exit_TrayItem
            _Quit()
    EndSwitch

    If $iSelected Then
        $iSelected = False
        $sSelection = _GetSelectedText()
        If $sSelection <> '' Then ConsoleWrite($sSelection & @CRLF)
    EndIf
WEnd

Func MousePrimaryDown_Event()
    $iMouse_X_Position = MouseGetPos(0)
EndFunc   ;==>MousePrimaryDown_Event

Func MousePrimaryUp_Event()
    If $iMouse_X_Position <> MouseGetPos(0) Then $iSelected = True
EndFunc   ;==>MousePrimaryUp_Event

Func _GetSelectedText()
    Local $sSelected_Data

    ;This one is crashing the script :(
;~  Local $hWnd = WinGetHandle('')
;~  Local $sCtrlClass = ControlGetFocus($hWnd);~
;~  If Not StringInStr($sCtrlClass, 'Scintilla') Then
;~      $sSelected_Data = ControlCommand($hWnd, '', $sCtrlClass, 'GetSelected')
;~      If IsString($sSelected_Data) Then Return $sSelected_Data
;~  EndIf

;~  Local $sOld_Clipboard_Data = ClipGet()
    If WinActive('[REGEXPCLASS:^(' & $shWinList & ')$]') Then
        ClipPut('')
        Send('^{INS}')
        $sSelected_Data = ClipGet()
;~  ClipPut($sOld_Clipboard_Data)
    EndIf
    Return $sSelected_Data
EndFunc   ;==>_GetSelectedText

Func _CopyUseHotkey_Proc()
    $iSelected = True
EndFunc   ;==>_CopyUseHotkey_Proc

Func _SwitchMonitoring_Proc()
    $iPaused = Not $iPaused

    If $iPaused Then
        TrayItemSetText($SwitchMonitoring_TrayItem, 'Мониторинг выделения выключен')
        TrayItemSetState($SwitchMonitoring_TrayItem, $TRAY_UNCHECKED)
        TraySetIcon('shell32.dll', -66)

        _SetMouseEvent_Proc(0)
    Else
        TrayItemSetText($SwitchMonitoring_TrayItem, 'Мониторинг выделения включен')
        TrayItemSetState($SwitchMonitoring_TrayItem, $TRAY_CHECKED)
        TraySetIcon('shell32.dll', -135)

        _SetMouseEvent_Proc(1)
    EndIf
EndFunc   ;==>_SwitchMonitoring_Proc

Func _SetMouseEvent_Proc($iSet = 1)
    If $iSet = 1 And TrayItemGetState($CopyUseSelection_TrayItem) = 68 Then Return 0

    Switch $iSet
        Case 1
            _MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, 'MousePrimaryDown_Event')
            _MouseSetOnEvent($MOUSE_PRIMARYUP_EVENT, 'MousePrimaryUp_Event')
        Case Else
            _MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT)
            _MouseSetOnEvent($MOUSE_PRIMARYUP_EVENT)
    EndSwitch
EndFunc   ;==>_SetMouseEvent_Proc

Func _Quit()
    _SetMouseEvent_Proc(0)
    Exit
EndFunc   ;==>_Quit

Вот только что этот код запускал в XP и в 7ке. И ни там ни там не работает. А именно после запуска этого кода сразу как будто левая кнопка мыши вообще не реагирует ни на клик, ни на выделение. Как будто кнопка неисправная. Скрипт отключаю и всё возвращается на место.
 

WSWR

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

MouseOnEvent.au3 какой версии? Последняя 1.9
http://autoit-script.ru/index.php?action=downloads;sa=view;down=244

Кто-нибудь еще, пожалуйста, проверьте и отпишитесь.
У меня работает на 2 компах
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
WSWR
Правда у меня стояла 1,8. Но обновил до 1,9 но практически ничего не поменялось.
А вернее теперь буквы выделяются, на клики система реагирует, о в буфер не копируется.
Я ж ведь правильно понимаю что достаточно лищь выделить часть кода мышкой и этот код долж автоматически скопироваться в буфер?
Ну ни в XP ни в 7 всё-равно не хочет.
Может из-за мышки, она у меня с драйвером.можт драйвер мыши мешает? Дело в том, что на компе где хп и 7ка одинаковые мыши стоят.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
agikon [?]
чтобы в SciTE выделеный код сразу заносился в буфер
Попробуйте этот вариант. Выделять можно и мышью и клавиатурой.
Код:
#include <Misc.au3>

HotKeySet("{F9}", "Pause")
OnAutoItExitRegister("End")

Global $Pause = False, $dll = DllOpen("user32.dll"), $PrevSel = "", $NowSel = ""

Do
  If Not $Pause And WinActive("[CLASS:SciTEWindow]") And _
     Not (_IsPressed("01", $dll) Or _IsPressed("10", $dll)) Then
    $NowSel = ControlCommand("[CLASS:SciTEWindow]", "", "", "GetSelected")
    If $NowSel <> $PrevSel Then
      Send("^{ins}")
      $PrevSel = $NowSel
    EndIf
  EndIf
  Sleep(500)
Until 0

Func Pause()
  $Pause = Not $Pause
EndFunc

Func End()
  DllClose($dll)
EndFunc
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
Всем спасибо!

Inni
Ваш скрипт работает!
 
Верх