Что нового

Как програмно открыть и закрыть файлы в SciTE

StarEdik

Новичок
Сообщения
365
Репутация
4
Привет всем. У меня к вам 2 вопроса. Надеюсь на ваш опыт и знания.
1-ый вопрос
Для просмотра файлов .au3, нужно как то автоматизировать процесс открытия файлов в редакторе SciTE. Меню File -> Open -> «С:\qwe.au3» -> Открыт. Вот Этот процесс как программно выполнить. Прошу помощи.
У меня получился 3 способа.
1-ый способ удовлетворяет, но при выполнении мелькает диалоговое окно ,так как оно быстро открывается и практически сразу закрывается и иногда диалоговое окно открывается и дальше код не выполняется .Скорость открытия устраивает.
2-ой и 3-ий способ из за тормозов при открытии следующих скриптов не удовлетворяют меня.
Может, кто ни будь знает о других способах.

2-ой вопрос
Как закрыть .au3 файл в редакторе SciTE –то есть вкладку с именем нужного файла.

Код:
HotKeySet("{F6}", "_OpenFileInSciTE1");1-ый Способ
HotKeySet("{F7}", "_OpenFileInSciTE2");2-ой Способ
HotKeySet("{F8}", "_OpenFileInSciTE3");3-ий Способ
HotKeySet("{Esc}", "_Exit")
Global $hSciTE ,$FileName
$hSciTE = WinGetHandle('[Class:SciTEWindow]')
$FileName=FileGetShortName("C:\qwe.au3")
While 1
	Sleep(200)
WEnd
;1-ый Способ
Func _OpenFileInSciTE1()
	
   ControlFocus($hSciTE, "", "[CLASS:Scintilla; INSTANCE:1]")
   ControlSend($hSciTE, "", 0, "{CTRLDOWN}o{CTRLUP}")
	 ControlFocus("[Class:#32770]", "", "[CLASS:Edit; INSTANCE:1]")
     ControlSetText("[Class:#32770]", "", "[CLASS:Edit; INSTANCE:1]", $FileName)
	   ControlClick('[Class:#32770]', '', '[CLASS:Button; INSTANCE:2]', "left", 1)
	  
EndFunc
;2-ой Способ
Func _OpenFileInSciTE2()
		Run("C:\Program Files\AutoIt3\SciTE\SciTE.exe" & " " & $FileName)
EndFunc
;3-ий Способ
Func _OpenFileInSciTE3()
	   ShellExecute($FileName, "", "", "edit")
EndFunc
   
Func _Exit()
	Exit
EndFunc
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
StarEdik [?]
2-ой и 3-ий способ из за тормозов при открытии следующих скриптов не удовлетворяют
Эти способы тормозят из за того что они заново пытаются открывать редактор SciTE.А надо открывать уже в открытом редакторе SciTE. Без закрывания окна. Может быть это возможно зная хендл,пид программы? :scratch:
Допустим скриптом открыли файл C:\Test.txt в блокноте. Как тепер открыт файл C:\Test2.txt в этом же блокноте.Без закрывания окна :scratch:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
В SciTE есть опция «Open Files Here», вот перед открытием её можно включать, правда у меня она почему то неактивна.


Добавлено:
Сообщение автоматически объединено:

Вот так можно:

Код:
$sFileName = @DesktopDir & "\Test.au3"

HotKeySet("{F6}", "_OpenFileInSciTE")
HotKeySet("{Esc}", "_Exit")

While 1
	Sleep(10)
WEnd

Func _OpenFileInSciTE()
	SendSciTE_Command("close:")
	SendSciTE_Command("open:" & StringReplace($sFileName, '\', '\\'))
EndFunc
   
Func _Exit()
	Exit
EndFunc 

Func SendSciTE_Command($sCmd)
	Local $iOpt = Opt("WinSearchChildren", 1)
	; Get SciTE DirectorHandle
	$SciTE_hwnd = WinGetHandle("DirectorExtension")
	Local $WM_COPYDATA = 74
	Local $CmdStruct = DllStructCreate('Char[' & StringLen($sCmd) + 1 & ']')
	DllStructSetData($CmdStruct, 1, $sCmd)
	Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr')
	DllStructSetData($COPYDATA, 1, 1)
	DllStructSetData($COPYDATA, 2, StringLen($sCmd) + 1)
	DllStructSetData($COPYDATA, 3, DllStructGetPtr($CmdStruct))
	DllCall('User32.dll', 'None', 'SendMessage', 'HWnd', $SciTE_hwnd,  'Int', $WM_COPYDATA, 'HWnd', 0, 'Ptr', DllStructGetPtr($COPYDATA))
	Opt("WinSearchChildren", $iOpt)
EndFunc
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
если мне память не изменяет у Scite есть COM-helper. может оптимальнее всего через него управлять редактором?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Kaster [?]
если мне память не изменяет у Scite есть COM-helper
Кажется изменяет, у него есть «DirectorExtension», через который я и сделал последний пример.

OffTopic:
Пишу SciTE UDF, скоро выложу (осталось документацию написать).
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Kaster
Так его ещё установить нужно (регистрировать dll), кроме этого, он требует msvbvm50.dll (его нет в версиях Win XP SP2 и выше).

Но там есть полезные функции, например получение выделенного текста, его замена и т.п.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
CreatoR
любой com-helper надо устанавливать. как же без этого :smile:
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
CreatoR
Спасибо за отличный пример. Постараюсь приспособить ваш пример к своему скрипту и отпишусь.

За некоторое время у меня набрался большое количество рабочих и не рабочих ,нужных и не нужных примеров. Теперь надо оставит нужные и рабочие а все не нужную и не рабочие удалить.
Для этого собрал «Просмотровшик»
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
HotKeySet("{F9}", "_RunFile")
Global $iIndexOld = -10
Global $hSciTE,$FileSource, $aFileList, $FileList,$FileName,$LblFileName, $aItems, $iI, $sText, $Pr1, $P2, $Pr3
$Form1 = GUICreate("Поиск .au3 файлов", 251, 597, @DesktopWidth - 260, @DesktopHeight - 690)
$Input1 = GUICtrlCreateInput("C:\Program Files\AutoIt3\Examples\Helpfile\", 3, 4, 217, 21)
$BtSelFolder = GUICtrlCreateButton("...", 223, 3, 25, 23)
$LblFileName = GUICtrlCreateLabel("Путь и Имя Файла", 5, 27, 230, 37, $SS_Left)
$ListView1 = GUICtrlCreateListView("", 0, 68, 249, 447)
$ListView1 = GUICtrlGetHandle($ListView1)
_GUICtrlListView_AddColumn($ListView1, "Результаты поиска AutoIt файлов", 224)
$BtRun = GUICtrlCreateButton("Run F9", 64, 524, 61, 25)
$BtSciTE = GUICtrlCreateButton("SciTE", 128, 524, 57, 25)
$BtExit = GUICtrlCreateButton("Exit", 191, 561, 57, 25)
$BtDeltoRECYCLER = GUICtrlCreateButton("В корзину", 65, 561, 61, 25)
$BtDelete = GUICtrlCreateButton("Удалить", 129, 561, 57, 25)
$BtSearch = GUICtrlCreateButton("Найти", 190, 524, 57, 24)
$BtMove = GUICtrlCreateButton("Move", 4, 561, 57, 25)
$BtCloseFile= GUICtrlCreateButton("Close File", 3, 524, 57, 25)
GUISetState()
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')

_SciTEWindow()
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
		Case $GUI_EVENT_CLOSE, $BtExit ; + EXIT
			_ControlSend_Ctrl_W()
            Exit

        Case $BtSearch                                        ; + Поиск
			_GUICtrlListView_DeleteAllItems($ListView1)
            _SearchFiles($aFileList)

		  Case $BtRun                                         ; + Запуск файла на выполнение
		     _RunFile()

        Case $BtSciTE                                         ; - Открыт файл в редакторе
			$FileName= GUICtrlRead($LblFileName)
             _OpenFileInSciTE()

		Case $BtDelete


		Case $BtDeltoRECYCLER       			; Удалить файл в корзину
			 _DeleteFileToRecycle()
             ;_ListViewRefresh()
			 ;_LoadFileToListView()
              _GUICtrlListView_DeleteAllItems($ListView1)
			;ControlSend($hSciTE, "", 0, "{CTRLDOWN}w{CTRLUP}")
			;ControlSend($hSciTE, "", 0, "{CTRLDOWN}n{CTRLUP}")

		Case $BtCloseFile
			_ControlSend_Ctrl_W()
			ControlSend($hSciTE, "", 0, "{CTRLDOWN}n{CTRLUP}")


        Case $BtMove
            _MoveFileToDestination()
             ;_ListViewRefresh()
			 ;_LoadFileToListView()

    EndSwitch
WEnd

Func _SearchFiles(ByRef $a_FileList)
    Local $FileMask = "*.au3", $FileSource = GUICtrlRead($Input1), $aItems[1]
    $a_FileList = 0
    $a_FileList = _FileSearch($FileSource, $FileMask)
    If @error Then
        $a_FileList = 0
        Return
    EndIf
    ReDim $aItems[$a_FileList[0]][1]
    For $i = 1 To $a_FileList[0]
        $aItems[$i - 1][0] = StringRegExpReplace($a_FileList[$i], '^.*\\', '')
    Next
    _GUICtrlListView_BeginUpdate($ListView1)
    _GUICtrlListView_DeleteAllItems($ListView1)
    _GUICtrlListView_AddArray($ListView1, $aItems)
    _GUICtrlListView_EndUpdate($ListView1)
EndFunc   ;==>_SearchFiles

Func _FileSearch($sPath, $sFileMask = "*", $iFlag = 0, $iSubDir = 1, $iSort = 0)
    ;CreatoR; http://autoit-script.ru/index.php/topic,8266.msg55775
    Local $sOutBin, $sOut, $aOut, $aMasks, $sRead, $hDir, $sAttrib, $sFiles

    If Not StringInStr(FileGetAttrib($sPath), "D") Then
        Return SetError(1, 0, 0)
    EndIf
    If $iSubDir = 1 Then
        $sAttrib &= ' /S'
    EndIf
    If $iSort = 1 Then
        $sAttrib &= ' /O:N'
    EndIf
    Switch $iFlag
        Case 1
            $sAttrib &= ' /A-D'
        Case 2
            $sAttrib &= ' /AD'
        Case Else
            $sAttrib &= ' /A'
    EndSwitch
    $sOut = StringToBinary('0' & @CRLF, 2)
    $sPath = StringRegExpReplace($sPath, '\\+$', '')
    $sFileMask = StringRegExpReplace($sFileMask, '^;+|;+$', '')
    $sFileMask = StringRegExpReplace($sFileMask, ';{2,}', ';')
    $aMasks = StringSplit($sFileMask, ';')
    For $i = 1 To $aMasks[0]
        If StringStripWS($aMasks[$i], 8) = "" Then
            ContinueLoop
        EndIf
        $sFiles &= '"' & $sPath & '\' & $aMasks[$i] & '"'
        If $i < $aMasks[0] Then
            $sFiles &= ';'
        EndIf
    Next
    $hDir = Run(@ComSpec & ' /U /C DIR ' & $sFiles & ' /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)
    While 1
        $sRead = StdoutRead($hDir, False, True)
        If @error Then
            ExitLoop
        EndIf
        If $sRead <> "" Then
            $sOut &= $sRead
        EndIf
        Sleep(10)
    WEnd
    $aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)
    If @error Or UBound($aOut) < 2 Then
        Return SetError(2, 0, 0)
    EndIf
    $aOut[0] = UBound($aOut) - 1
    Return $aOut
EndFunc   ;==>_FileSearch

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $tNMHDR, $hWndFrom, $iCode, $tInfo, $iIndexNow, $sNewText, $Pr, $Pr2
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = DllStructGetData($tNMHDR, 'hWndFrom')
    $iCode = DllStructGetData($tNMHDR, 'Code')

    Switch $hWndFrom
        Case $ListView1
            Switch $iCode
                Case $LVN_ITEMCHANGED
                    If IsArray($aFileList) Then
                        $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                        $iIndexNow = DllStructGetData($tInfo, 'Index')
                        If $iIndexOld <> $iIndexNow Then
                            $iIndexOld = $iIndexNow
                            GUICtrlSetData($LblFileName, $aFileList[$iIndexOld + 1])
							;$FileName= GUICtrlRead($LblFileName)
							  _OpenFileInSciTE()
							  WinActivate($Form1)
							  ;_GUICtrlListView_SetItemSelected($ListView1, $iIndexOld,1)
                        EndIf
                    EndIf
                Case $NM_DBLCLK
				    _RunFile()
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func _ControlSend_Ctrl_W()
    Local $hSciTE = WinGetHandle('[Class:SciTEWindow]')
     ControlFocus($hSciTE, "", "[CLASS:Scintilla; INSTANCE:1]")
   	  ControlSend($hSciTE, "", 0, "{CTRLDOWN}w{CTRLUP}")
EndFunc

Func _SciTEWindow()
	Local $hSciTE = WinGetHandle('[Class:SciTEWindow]')
	If WinExists("[Class:SciTEWindow]") Then
	   WinActivate("[Class:SciTEWindow]", "")
       Local $hSciTE = WinGetHandle('[Class:SciTEWindow]')
	   ControlFocus($hSciTE, "", "[CLASS:Scintilla; INSTANCE:1]")
	   ControlSend($hSciTE, "", 0, "{CTRLDOWN}n{CTRLUP}")
	Else
		Run("C:\Program Files\AutoIt3\SciTE\SciTE.exe")
		WinActivate("[Class:SciTEWindow]", "")
		Local $hSciTE = WinGetHandle('[Class:SciTEWindow]')
	    ControlFocus($hSciTE, "", "[CLASS:Scintilla; INSTANCE:1]")
	    ControlSend($hSciTE, "", 0, "{CTRLDOWN}n{CTRLUP}")
	EndIf
        ;_SciTEResize()
		WinMove ($hSciTE, "", 0, 0, @DesktopWidth - 260 , @DesktopHeight - 30)
EndFunc

Func _SciTEResize()
  Local $x = 0
  Local $y = 0
  Local $wi = @DesktopWidth - 260 ; Ширина окна
  Local $he = @DesktopHeight - 30; Высота окна
   $hSciTE = WinGetHandle('[Class:SciTEWindow]')
  Local $tTitle=WinGetTitle($hSciTE)
  Sleep(100)
        WinMove ($hSciTE, "", $x, $y, $wi, $he)

EndFunc

Func _OpenFileInSciTE()
	Local $hSciTE = WinGetHandle('[Class:SciTEWindow]')
		Local $FileName=FileGetShortName(GUICtrlRead($LblFileName))
 ControlFocus($hSciTE, "", "[CLASS:Scintilla; INSTANCE:1]")
 ControlSend($hSciTE, "", 0, "{CTRLDOWN}w{CTRLUP}")
   ControlFocus($hSciTE, "", "[CLASS:Scintilla; INSTANCE:1]")
   ControlSend($hSciTE, "", 0, "{CTRLDOWN}o{CTRLUP}")
     ControlFocus("[Class:#32770]", "", "[CLASS:Edit; INSTANCE:1]")
     ControlSetText("[Class:#32770]", "", "[CLASS:Edit; INSTANCE:1]", $FileName)
	   ControlClick('[Class:#32770]', '', '[CLASS:Button; INSTANCE:2]', "left", 1)
EndFunc

Func _RunFile()
	$FileName=FileGetShortName(GUICtrlRead($LblFileName))
	  Run("C:\Program Files\AutoIt3\AutoIt3.exe" & " " & $FileName)
EndFunc
Func _LoadFileToListView()
	 Local $aItems[1500][1]
			$FileList = _FileSearch($FileSource, "*.au3")
			If Not @error Then
			   For $i = 1 To $FileList[0]
                  $aItems[$i][0] =$FileList[$i]
			   Next
		   EndIf
	_GUICtrlListView_AddArray($ListView1, $aItems)

EndFunc

Func _ListViewRefresh()
	Local $aDell
	$aDell = _GUICtrlListView_GetSelectedIndices($ListView1, True)
            If $aDell[0] Then
                For $i = $aDell[0] To 1 Step -1
                    _GUICtrlListView_DeleteItem($ListView1, $aDell[$i])
                Next
            EndIf
		$aDell = 0
		_GUICtrlListView_SetItemSelected($ListView1, -1, False)
		;ConsoleWrite("Файл " & $aDel  & " Удален" & @CRLF)
EndFunc


Func _MoveFileToDestination()
	Local $aMov,$FileDestination
	  $aMov=GUICtrlRead($LblFileName)
	  $FileDestination ="D:\Move_AU3_File";  GUICtrlRead($Input2)
	  FileMove($aMov,$FileDestination,8)
		;ConsoleWrite("Файл " & $aMov  & " переместили в " & $FileDestination & @CRLF)
EndFunc

Func _DeleteFileToRecycle()
	Local $aDel
		$aDel=GUICtrlRead($LblFileName)
		FileRecycle($aDel) ; FileDelete($aDel)
EndFunc

Func _SciTEexit()
	ControlSend($hSciTE, "", 0, "{ALTDOWN}F4{ALTUP}")
EndFunc

Альтернативный способ. Нет подсветки.

Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#Include <File.au3>
#include <GuiDateTimePicker.au3>
#include <GuiListView.au3>
#include <StaticConstants.au3>
#include <WinAPIEx.au3>
#include <Date.au3>
Global $iIndexOld = -10
Global $FileSource, $ComboText,$FileList, $FilList,$aItems,$iI,$sText,$Pr1,$P2, $Pr3
Global $EdWidht,$EdHeight

$Form2 = GUICreate("Form2", @DesktopWidth-8, @DesktopHeight-70, 0, 0)
$Edit1 = GUICtrlCreateEdit("", 277, 24, @DesktopWidth-290,@DesktopHeight-100)
$nInput = GUICtrlCreateLabel('текст', 290, 4, @DesktopWidth-290, 20)
$Button1 = GUICtrlCreateButton("Cansel", 8, 105, 63, 25)
$ButtonDelete = GUICtrlCreateButton("Delete", 73, 105, 64, 25)
$ButtonMove = GUICtrlCreateButton("Move", 139, 105, 64, 25)
$ButtonSearch = GUICtrlCreateButton("Search", 205, 105, 63, 25)
$ListView1 = GUICtrlCreateListView("", 8, 151, 260, @DesktopHeight-310)
   $ListView1 = GUICtrlGetHandle($ListView1)
     _GUICtrlListView_AddColumn($ListView1, "Files", 250)
$Input1 = GUICtrlCreateInput("G:\", 8, 29, 260, 21)
     $FileSource= GUICtrlRead($Input1)
$Input2 = GUICtrlCreateInput("D:\Au3", 8, 76, 259, 21)
     $FileDestination = GUICtrlRead($Input2)
$ButtonSource = GUICtrlCreateButton("... Source", 8, 6, 82, 19)
$ButtonDestination = GUICtrlCreateButton("... Destination", 9, 55, 82, 19)
$Combo1 = GUICtrlCreateCombo("File Mask", 200, 4, 69, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
	 GUICtrlSetData($Combo1,"|*.au3|*.txt|*.*","*.au3")
     $ComboText = GUICtrlRead($Combo1)

$btRunAu3 = GUICtrlCreateButton("Run au3", 8, @DesktopHeight-150, 80, 25)
$btSetEdit = GUICtrlCreateButton("Set Data", 100, @DesktopHeight-150, 80, 25)
$btExit = GUICtrlCreateButton("Exit", 192, @DesktopHeight-120, 80, 25)
GUISetState()
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE;,$btExit
            Exit
        Case $btSetEdit
			_GetData()
		Case $btRunAu3
			Run("C:\Program Files\AutoIt3\AutoIt3.exe" & " " & $Pr3)
   Case $Combo1 ;Маска файлов
            $ComboText = GUICtrlRead($Combo1)

		Case $Button1 ;Cansel
             Exit

        Case $ButtonDelete ;Удалить выбранный файл из папки
             _DeleteFileToRecycle()
             ;_ListViewRefresh()
			 _LoadFileToListView()
        Case $ButtonMove ;Переместит выбранный файл
             _MoveFileToDestination()
             ;_ListViewRefresh()
			 _LoadFileToListView()
		Case $ButtonSearch ; Поиск файлов по маске
             _LoadFileToListView()

		Case $ButtonSource ; Выбор диска - папки для поиска файлов по маске
           $FileSource = FileSelectFolder("",'')
		   GUICtrlSetData($Input1,$FileSource)
		    If @error Then
				ContinueLoop
            EndIf

		 Case $ButtonDestination ;; Выбор диска - папки для перемешения нужных файлов по маске
			 $FileDestination =FileSelectFolder("",'')
			 GUICtrlSetData($Input2,$FileDestination)
			If @error Then
				ContinueLoop
			EndIf

	EndSwitch
WEnd

Func _LoadFileToListView()
	 Local $aItems[1500][1]
			$FileList = _FileSearch($FileSource, $ComboText)
			If Not @error Then
			   For $i = 1 To $FileList[0]
                  $aItems[$i][0] =$FileList[$i]
			   Next
		   EndIf
	_GUICtrlListView_AddArray($ListView1, $aItems)

EndFunc

Func _MoveFileToDestination()
	Local $aMov,$FileDestination
	  $aMov=GUICtrlRead($nInput)
	  $FileDestination = GUICtrlRead($Input2)
	  FileMove($aMov,$FileDestination)
		;ConsoleWrite("Файл " & $aMov  & " переместили в " & $FileDestination & @CRLF)
EndFunc

Func _DeleteFileToRecycle()
	Local $aDel
		$aDel=GUICtrlRead($nInput)
		FileRecycle($aDel) ; FileDelete($aDel)
EndFunc

Func _ListViewRefresh()
	Local $aDell
	$aDell = _GUICtrlListView_GetSelectedIndices($ListView1, True)
            If $aDell[0] Then
                For $i = $aDell[0] To 1 Step -1
                    _GUICtrlListView_DeleteItem($ListView1, $aDell[$i])
                Next
            EndIf
		$aDell = 0
		_GUICtrlListView_SetItemSelected($ListView1, -1, False)
		;ConsoleWrite("Файл " & $aDel  & " Удален" & @CRLF)
EndFunc


Func _GetData()
	$Pr3=GUICtrlRead($nInput)
	$sText=FileRead($Pr3)
	GUICtrlSetData($Edit1, $sText)
EndFunc

;GUICtrlSetData($LABEL,GUICtrlRead($COMBO))
;$Hide = GUICtrlRead($Combo1)
;CreatoR; http://autoit-script.ru/index.php?topic=315.msg18672#msg18672
Func _FileSearch($s_Path_Search, $s_File_Mask = '*', $i_Flag = 0, $i_SubDir = 1);1
    ;фильтры для поиска нужно указывать через ";"
    ;$i_Flag = 0 - Файлы и папки (по умолчанию)
    ;$i_Flag = 1 - Только файлы
    ;$i_Flag = 2 - Только папки (если ищем конкретную папку, то надо добавлять к имени * в начало  или в конец)
    ;$i_SubDir = 1 - Искать во всех подкаталогах (по умолчанию). Возвращает полные пути.
    ;$i_SubDir = 0 - Искать только в самой папке. Возвращает только имена файлов(папок).
    Local $s_Out, $a_Out, $s_Read, $h_Dir, $s_Attrib, $s_Subdir, $a_Masks

    If StringRight($s_Path_Search, 1) == '\' Then ;нужно, если $s_Path_Search - диск (например C:\)
        $s_Path_Search = StringTrimRight($s_Path_Search, 1)
    EndIf
    If $i_SubDir Then
        $s_Subdir = ' /S /B'
    Else
        $s_Subdir = ' /B'
    EndIf
    Switch $i_Flag
        Case 1
            $s_Attrib = ' /A-D'
        Case 2
            $s_Attrib = ' /AD'
        Case Else
            $s_Attrib = ' /A'
    EndSwitch
    $s_Out = StringToBinary('0' & @CRLF, 2)
    $a_Masks = StringSplit($s_File_Mask, ';')
    For $i = 1 To $a_Masks[0]
        $h_Dir = Run(@ComSpec & ' /U /C DIR "' & $s_Path_Search & '\' & $a_Masks[$i] & '"' & $s_Subdir & $s_Attrib, @SystemDir, @SW_HIDE, 6)
        If Not $h_Dir Then Return SetError(1)
        While 1
            $s_Read = StdoutRead($h_Dir, False, True)
            If @error Then
                ExitLoop
            EndIf
            If $s_Read Then
                $s_Out &= $s_Read
            EndIf
            Sleep(10)
        WEnd
    Next
    $a_Out = StringRegExp(BinaryToString($s_Out, 2), '[^\r\n]+', 3)
    If @error Then Return SetError(1)
    $a_Out[0] = UBound($a_Out) - 1
    Return $a_Out
EndFunc   ;==>_FileSearch

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $tNMHDR, $hWndFrom, $iCode, $tInfo, $iIndexNow, $sNewText,$Pr,$Pr2
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = DllStructGetData($tNMHDR, 'hWndFrom')
    $iCode = DllStructGetData($tNMHDR, 'Code')

    Switch $hWndFrom
        Case $ListView1
            Switch $iCode
                Case $LVN_ITEMCHANGING
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                    $iIndexNow = DllStructGetData($tInfo, 'Index')
                    If $iIndexOld <> $iIndexNow Then
                        $iIndexOld = $iIndexNow
						GUICtrlSetData($nInput, _GUICtrlListView_GetItemText($ListView1, $iIndexOld))
						$Pr=GUICtrlRead($nInput)
						;ConsoleWrite($Pr & @CRLF)
						_GetData()
                    EndIf
                Case $NM_DBLCLK
					$Pr2=GUICtrlRead($nInput)
					;ConsoleWrite($Pr2 & @CRLF)
                    ;ShellExecute($Pr2)

            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

У CreatoR есть пример для подсветки html , и если бы было пример для RightEdit, наверно многие были бы рады и благодарны.

Kaster
Благодарью за ссылку.

Буду рад к любым добавлениям и конструктивной критике.
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
CreatoR
Если в пути к файлу имеется русские буквы скрипт выдает ошибку.Вместо русских букв в MsgBox показывают квадратики. Наверно сможете подправить скрипт
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
StarEdik [?]
если бы было пример для RightEdit
[Элементы GUI] Вывод текста в элемент RichEdit с поддержкой тегов.

[?]
Вместо русских букв в месаже показывают квадратики
Во-первых слова «месаже» нет в русском языке, а во-вторых хотелось бы посмотреть на пример производящий данную ошибку.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
StarEdik [?]
Если в пути к файлу имеется русские буквы скрипт выдает ошибку.Вместо русских букв в месаже показывают квадратики.

Перед открытием файла, путь надо преобразовать:
Код:
$sPath = BinaryToString(StringToBinary($sPath, 4))
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
CreatoR
хотелось бы посмотреть на пример производящий данную ошибку.
Представляю скрипт.
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
HotKeySet("{F9}", "_RunFile")
Global $iIndexOld = -10
Global $hSciTE,$FileSource, $tPath, $aFileList, $FileList,$FileName,$LblFileName, $aItems, $iI, $sText, $Pr1, $P2, $Pr3
$Form1 = GUICreate("Поиск .au3 файлов", 251, @DesktopHeight - 60, @DesktopWidth - 260, 0)
$Input1 = GUICtrlCreateInput("C:\Program Files\AutoIt3\Examples\Helpfile\", 3, 4, 217, 21)
$BtSelFolder = GUICtrlCreateButton("...", 223, 3, 25, 23)
$LblFileName = GUICtrlCreateLabel("Путь и Имя Файла", 5, 27, 230, 37, $SS_Left)
$ListView1 = GUICtrlCreateListView("", 0, 68, 249, 547)
$ListView1 = GUICtrlGetHandle($ListView1)
_GUICtrlListView_AddColumn($ListView1, "Результаты поиска AutoIt файлов", 224)
$BtRun = GUICtrlCreateButton("Run F9", 64, 624, 61, 25)
$BtSciTE = GUICtrlCreateButton("SciTE", 128, 624, 57, 25)
$BtExit = GUICtrlCreateButton("Exit", 191, 661, 57, 25)
$BtDeltoRECYCLER = GUICtrlCreateButton("В корзину", 65, 661, 61, 25)
$BtDelete = GUICtrlCreateButton("Удалить", 129, 661, 57, 25)
$BtSearch = GUICtrlCreateButton("Найти", 190, 624, 57, 24)
$BtMove = GUICtrlCreateButton("Move", 4, 661, 57, 25)
$BtCloseFile= GUICtrlCreateButton("Close File", 3, 624, 57, 25)
_SciTEWindow()
GUISetState()
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')


While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
		Case $GUI_EVENT_CLOSE, $BtExit ; + EXIT
			;_ControlSend_Ctrl_W()
            Exit

        Case $BtSearch                                        ; + Поиск
			_GUICtrlListView_DeleteAllItems($ListView1)
            _SearchFiles($aFileList)

		  Case $BtRun                                         ; + Запуск файла на выполнение
		     _RunFile()

        Case $BtSciTE                                         ; - Открыт файл в редакторе
			$FileName= GUICtrlRead($LblFileName)
             _OpenFileInSciTE()

    	Case $BtDelete


		Case $BtDeltoRECYCLER       			; Удалить файл в корзину
			 _DeleteFileToRecycle()
             ;_ListViewRefresh()
			 ;_LoadFileToListView()
              _GUICtrlListView_DeleteAllItems($ListView1)

		Case $BtCloseFile
			_ControlSend_Ctrl_W()
			;ControlSend($hSciTE, "", 0, "{CTRLDOWN}n{CTRLUP}")

        Case $BtMove
            _MoveFileToDestination()
             ;_ListViewRefresh()
			 ;_LoadFileToListView()
		 Case $BtSelFolder
			   $tPath = FileSelectFolder('Выберите папку', '', 2, "", $Form1)
			   GUICtrlSetData( $Input1,$tPath)


EndSwitch
WinSetOnTop($Form1,"",1)
WEnd

Func _SearchFiles(ByRef $a_FileList)
    Local $FileMask = "*.au3", $FileSource = GUICtrlRead($Input1), $aItems[1]
    $a_FileList = 0
    $a_FileList = _FileSearch($FileSource, $FileMask)
    If @error Then
        $a_FileList = 0
        Return
    EndIf
    ReDim $aItems[$a_FileList[0]][1]
    For $i = 1 To $a_FileList[0]
        $aItems[$i - 1][0] = StringRegExpReplace($a_FileList[$i], '^.*\\', '')
    Next
    _GUICtrlListView_BeginUpdate($ListView1)
    _GUICtrlListView_DeleteAllItems($ListView1)
    _GUICtrlListView_AddArray($ListView1, $aItems)
    _GUICtrlListView_EndUpdate($ListView1)
EndFunc   ;==>_SearchFiles

Func _FileSearch($sPath, $sFileMask = "*", $iFlag = 0, $iSubDir = 1, $iSort = 0)
    ;CreatoR; http://autoit-script.ru/index.php/topic,8266.msg55775
    Local $sOutBin, $sOut, $aOut, $aMasks, $sRead, $hDir, $sAttrib, $sFiles

    If Not StringInStr(FileGetAttrib($sPath), "D") Then
        Return SetError(1, 0, 0)
    EndIf
    If $iSubDir = 1 Then
        $sAttrib &= ' /S'
    EndIf
    If $iSort = 1 Then
        $sAttrib &= ' /O:N'
    EndIf
    Switch $iFlag
        Case 1
            $sAttrib &= ' /A-D'
        Case 2
            $sAttrib &= ' /AD'
        Case Else
            $sAttrib &= ' /A'
    EndSwitch
    $sOut = StringToBinary('0' & @CRLF, 2)
    $sPath = StringRegExpReplace($sPath, '\\+$', '')
    $sFileMask = StringRegExpReplace($sFileMask, '^;+|;+$', '')
    $sFileMask = StringRegExpReplace($sFileMask, ';{2,}', ';')
    $aMasks = StringSplit($sFileMask, ';')
    For $i = 1 To $aMasks[0]
        If StringStripWS($aMasks[$i], 8) = "" Then
            ContinueLoop
        EndIf
        $sFiles &= '"' & $sPath & '\' & $aMasks[$i] & '"'
        If $i < $aMasks[0] Then
            $sFiles &= ';'
        EndIf
    Next
    $hDir = Run(@ComSpec & ' /U /C DIR ' & $sFiles & ' /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)
    While 1
        $sRead = StdoutRead($hDir, False, True)
        If @error Then
            ExitLoop
        EndIf
        If $sRead <> "" Then
            $sOut &= $sRead
        EndIf
        Sleep(10)
    WEnd
    $aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)
    If @error Or UBound($aOut) < 2 Then
        Return SetError(2, 0, 0)
    EndIf
    $aOut[0] = UBound($aOut) - 1
    Return $aOut
EndFunc   ;==>_FileSearch

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $tNMHDR, $hWndFrom, $iCode, $tInfo, $iIndexNow, $sNewText, $Pr, $Pr2
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = DllStructGetData($tNMHDR, 'hWndFrom')
    $iCode = DllStructGetData($tNMHDR, 'Code')

    Switch $hWndFrom
        Case $ListView1
            Switch $iCode
                Case $LVN_ITEMCHANGED
                    If IsArray($aFileList) Then
                        $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                        $iIndexNow = DllStructGetData($tInfo, 'Index')
                        If $iIndexOld <> $iIndexNow Then
                            $iIndexOld = $iIndexNow
                            GUICtrlSetData($LblFileName, $aFileList[$iIndexOld + 1])
							  _OpenFileInSciTE()
							   WinActivate($Form1)
                        EndIf
                    EndIf
                Case $NM_DBLCLK
				    _RunFile()
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func _ControlSend_Ctrl_W()
    Local $hSciTE = WinGetHandle('[Class:SciTEWindow]')
     ControlFocus($hSciTE, "", "[CLASS:Scintilla; INSTANCE:1]")
   	  ControlSend($hSciTE, "", 0, "{CTRLDOWN}w{CTRLUP}")
EndFunc

Func _SciTEWindow()
	If WinExists("[Class:SciTEWindow]") Then
	    WinActivate("[Class:SciTEWindow]", "")
	    WinWaitActive("[Class:SciTEWindow]", "")
	     ; WinMove ("[Class:SciTEWindow]", "", 0, 0, @DesktopWidth - 260 , @DesktopHeight - 30)
	Else
		Run("C:\Program Files\AutoIt3\SciTE\SciTE.exe")
		 WinActivate("[Class:SciTEWindow]", "")
		 WinWaitActive("[Class:SciTEWindow]", "")
		   ;WinMove ("[Class:SciTEWindow]", "", 0, 0, @DesktopWidth - 260 , @DesktopHeight - 30)
	EndIf
        WinMove ("[Class:SciTEWindow]", "", 0, 0, @DesktopWidth - 260 , @DesktopHeight - 30)
EndFunc

Func _RunFile()
	$FileName=FileGetShortName(GUICtrlRead($LblFileName))
	  Run("C:\Program Files\AutoIt3\AutoIt3.exe" & " " & $FileName)
  EndFunc

Func _LoadFileToListView()
	 Local $aItems[1500][1]
			$FileList = _FileSearch($FileSource, "*.au3")
			If Not @error Then
			   For $i = 1 To $FileList[0]
                  $aItems[$i][0] =$FileList[$i]
			   Next
		   EndIf
	_GUICtrlListView_AddArray($ListView1, $aItems)

EndFunc

Func _ListViewRefresh()
	Local $aDell
	$aDell = _GUICtrlListView_GetSelectedIndices($ListView1, True)
            If $aDell[0] Then
                For $i = $aDell[0] To 1 Step -1
                    _GUICtrlListView_DeleteItem($ListView1, $aDell[$i])
                Next
            EndIf
		$aDell = 0
		_GUICtrlListView_SetItemSelected($ListView1, -1, False)

EndFunc

Func _MoveFileToDestination()
	Local $aMov,$FileDestination
	  $aMov=GUICtrlRead($LblFileName)
	  $FileDestination ="D:\Move_AU3_File";  GUICtrlRead($Input2)
	  FileMove($aMov,$FileDestination,8)

EndFunc

Func _DeleteFileToRecycle()
	Local $aDel
		$aDel=GUICtrlRead($LblFileName)
		FileRecycle($aDel)
		; FileDelete($aDel)
EndFunc

Func _OpenFileInSciTE()
	$FileName= GUICtrlRead($LblFileName)
    SendSciTE_Command("close:")
    SendSciTE_Command("open:" & StringReplace($FileName, '\', '\\'))
EndFunc

Func SendSciTE_Command($sCmd)
    Local $iOpt = Opt("WinSearchChildren", 1)
    ; Get SciTE DirectorHandle
    $SciTE_hwnd = WinGetHandle("DirectorExtension")
    Local $WM_COPYDATA = 74
    Local $CmdStruct = DllStructCreate('Char[' & StringLen($sCmd) + 1 & ']')
    DllStructSetData($CmdStruct, 1, $sCmd)
    Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr')
    DllStructSetData($COPYDATA, 1, 1)
    DllStructSetData($COPYDATA, 2, StringLen($sCmd) + 1)
    DllStructSetData($COPYDATA, 3, DllStructGetPtr($CmdStruct))
    DllCall('User32.dll', 'None', 'SendMessage', 'HWnd', $SciTE_hwnd,  'Int', $WM_COPYDATA, 'HWnd', 0, 'Ptr', DllStructGetPtr($COPYDATA))
    Opt("WinSearchChildren", $iOpt)
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
StarEdik
А если так просто попробовать:

Код:
SendSciTE_Command("open:c:\\путь\\file.au3")


?
:scratch:
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
CreatoR
Не могу знать.
Но я с вашего позволения, сделал как посоветовал asdf8 .
Код:
Func _OpenFileInSciTE()
	Local $FileName
	$FileName= GUICtrlRead($LblFileName)
	$FileName= BinaryToString(StringToBinary($FileName, 4))

    SendSciTE_Command("close:")
	SendSciTE_Command("open:" & StringReplace($FileName, '\', '\\'))
EndFunc

и так работает нормально.Ваше мнение
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
StarEdik [?]
Что мешает проверить?

так работает нормально.Ваше мнение
Дело совсем не в SendSciTE_Command, а в кодировке от GUICtrlRead, видимо оно передаёт данные как UTF-8.

Вот пример, работает?

Код:
#include <GUIConstantsEx.au3>

$hGUI = GUICreate("")

;Create script file
FileClose(FileOpen(@ScriptDir & '\тест\test.au3', 8+2))

$nInput = GUICtrlCreateInput(@ScriptDir & '\тест\test.au3', 10, 20, 350, 20)
$nOpen = GUICtrlCreateButton('Open', 20, 50)

GUISetState(@SW_SHOW, $hGUI)

While 1
	$nMsg = GUIGetMsg()

	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nOpen
			$FileName = GUICtrlRead($nInput)
			SendSciTE_Command("open:" & StringReplace($FileName, '\', '\\'))
	EndSwitch
WEnd

Func SendSciTE_Command($sCmd)
    Local $iOpt = Opt("WinSearchChildren", 1)
    ; Get SciTE DirectorHandle
    $SciTE_hwnd = WinGetHandle("DirectorExtension")
    Local $WM_COPYDATA = 74
    Local $CmdStruct = DllStructCreate('Char[' & StringLen($sCmd) + 1 & ']')
    DllStructSetData($CmdStruct, 1, $sCmd)
    Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr')
    DllStructSetData($COPYDATA, 1, 1)
    DllStructSetData($COPYDATA, 2, StringLen($sCmd) + 1)
    DllStructSetData($COPYDATA, 3, DllStructGetPtr($CmdStruct))
    DllCall('User32.dll', 'None', 'SendMessage', 'HWnd', $SciTE_hwnd,  'Int', $WM_COPYDATA, 'HWnd', 0, 'Ptr', DllStructGetPtr($COPYDATA))
    Opt("WinSearchChildren", $iOpt)
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
asdf8 [?]
Такая фигня началась у Скайта с версии больше 1.79
Значит дело в SciTE ;)

А если так:

Код:
Func SendSciTE_Command($sCmd)
    Local $iOpt = Opt("WinSearchChildren", 1)
    ; Get SciTE DirectorHandle
    $SciTE_hwnd = WinGetHandle("DirectorExtension")
    Local $WM_COPYDATA = 74
    Local $CmdStruct = DllStructCreate('wchar[' & (StringLen($sCmd) * 2) + 1 & ']')
    DllStructSetData($CmdStruct, 1, $sCmd)
    Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr')
    DllStructSetData($COPYDATA, 1, 1)
    DllStructSetData($COPYDATA, 2, (StringLen($sCmd) * 2) + 1)
    DllStructSetData($COPYDATA, 3, DllStructGetPtr($CmdStruct))
    DllCall('User32.dll', 'None', 'SendMessageW', 'HWnd', $SciTE_hwnd,  'Int', $WM_COPYDATA, 'HWnd', 0, 'Ptr', DllStructGetPtr($COPYDATA))
    Opt("WinSearchChildren", $iOpt)
EndFunc


?
:scratch:
 
Верх