Войти

Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 [24] 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

NikLok
26-04-2008, 17:55
amel27, Насколько я понял речь о символических ссылках, »
да совершенно верное понимание проблемы. Просто я этих стандартных API не знаю.

М..маленький прбмерчик бы!

amel27
28-04-2008, 08:57
NikLok
ну вроде что-то получилось - для обычного каталога UDF воспроизводит переданный в параметре путь к каталогу и устанавливает @extended=0, если каталог является только ссылкой, то восстанавливается его реальный путь и значение @extended=1 :#include <Constants.au3>

Func _DirGetJunctionTarget($sDirPath)
If StringInStr(FileGetAttrib($sDirPath),"D") =0 Then Return SetError(1, 0, "") ; Ошибка: параметр не является каталогом
Local $tRet = DllStructCreate("dword"), $aRet
Local $tBuf = DllStructCreate("byte["& 1024 *16 &"]")
Local $REPARSE_MOUNTPOINT_DATA_BUFFER = _
DllStructCreate("int ReparseTag;dword ReparseDataLength;ushort;ushort ReparseTargetLength;ushort ReparseTargetMaximumLength;ushort;wchar ReparseTarget[260]", _
DllStructGetPtr($tBuf))
Local $aFile = DllCall("kernel32.dll", "int", "CreateFile", _
"str", $sDirPath, "dword", 0, "dword", 0, "ptr", 0, "dword", $OPEN_EXISTING, "dword", 0x2200000, "ptr", 0 )
If Not(IsArray($aFile)) Then Return SetError(2, 1, "") ; Ошибка вызова DLL
If $aFile[0]=-1 Then
$aRet = DllCall("kernel32.dll", "int", "GetLastError")
Return SetError(3, $aRet[0], "") ; Ошибка доступа к каталогу
EndIf
$aRet = DllCall("kernel32.dll", "int", "DeviceIoControl", _
"hwnd", $aFile[0], "dword", 0x900A8, "ptr", 0, "dword", 0, "ptr", DllStructGetPtr($tBuf), "dword", DllStructGetSize($tBuf), "ptr", DllStructGetPtr($tRet), "ptr", 0)
DllCall("kernel32.dll", "int", "CloseHandle", "int", $aFile[0])
If Not(IsArray($aRet)) Then Return SetError(2, 2, "") ; Ошибка вызова DLL
If $aRet[0]=0 Then
$aRet = DllCall("kernel32.dll", "int", "GetLastError")
If $aRet[0] = 0x1126 Then Return SetError(0, 0, $sDirPath)
Return SetError(4, $aRet[0], "") ; Другие ошибки ввода/вывода
EndIf
$sDirPath = StringRegExpReplace(DllStructGetData($REPARSE_MOUNTPOINT_DATA_BUFFER,"ReparseTarget"),"^\\\?\?\\","")
Return SetError(0, DllStructGetData($REPARSE_MOUNTPOINT_DATA_BUFFER, "ReparseTag")=0xA0000003, $sDirPath)
EndFunc

NikLok
28-04-2008, 22:20
amel27, Огроменное спасибо! Все замечательно работает!!!

amel27
29-04-2008, 06:57
Огроменное спасибо »
Спасибо сайту FlexHEX (http://www.flexhex.com/docs/articles/hard-links.phtml) за исходники и описание недокументированных структур,
кстати, там есть и бинарники на случай CMD :)

NikLok
29-04-2008, 20:44
amel27, А в GUI можно мигающую строку (элемент ListView) сделать. Или обязательно программно самому мигать!?

amel27
30-04-2008, 04:04
NikLok
это не ко мне - в визуальных эффектах я не силен, имхо тут достаточно спецов по ГУИ

Creat0R
можно как то поправить и твои функции, чтобы поддерживали Unicode? »
легко ;) :

- заменить во всех структурах "char" на "wchar";
- в DllCall() жестко задать вызов WideChar-редакции API функции;
- заменить в SendMessage() коды сообщений с ANSI на WideChar.

Maza Faka
30-04-2008, 08:19
А в GUI можно мигающую строку (элемент ListView) сделать. Или обязательно программно самому мигать!? »

По моему только программно и можно:
#include <GuiConstants.au3>

Global $color = 0xFF0000

$hGUI = GUICreate("Test GUI", 300, 200)

$hListView = GUICtrlCreateListView("Item|SubItem", 10, 10, 280, 180)

$LV_Item = GUICtrlCreateListViewItem("Item1|SubItem1", $hListView)
GUICtrlSetColor(-1, $color)

GUISetState()

AdlibEnable("_FlashItem", 500)

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

AdlibDisable()

Func _FlashItem()
$color = BitNOT($color)
GUICtrlSetColor($LV_Item, $color)
EndFunc
Можно конечно и с помощью CallBack сделать, но много возни с рисованием текста и его раскрашиванием. :)

Creat0R
01-05-2008, 06:44
amel27, легко :
- заменить во всех структурах "char" на "wchar";
- в DllCall() жестко задать вызов WideChar-редакции API функции;
- заменить в SendMessage() коды сообщений с ANSI на WideChar. »
Спасибо! Теперь я буду знать как добавлять поддержку Unicode! :up

HORRIBLE
01-05-2008, 17:25
А как переводить числа из 10-ой в двоичную систему??

Maza Faka
02-05-2008, 08:16
А как переводить числа из 10-ой в двоичную систему?? »
Наверное Binary()

babaytugur
02-05-2008, 20:26
Прошу помощи
Есть код
Dim $mass[1], $x=0,$Stop = 0
Do
$mass[$x] = FileReadLine ("denylist.txt",$x+1)
If @error=-1 Then
$Stop=1
ReDim $Mass[$x]
Else
$x = $x+1
ReDim $Mass[$x+1]
EndIf

Until $Stop=1
Do
$var = WinList()
For $x=0 To UBound ($mass)-1
For $i = 1 to $var[0][0]
If $var[$i][0] <> "" AND IsVisible($var[$i][1]) Then
if StringInStr($var[$i][0], $mass[$x])<>0 Then
beep(1000,250)
MsgBox (16,"Сообщение для " & @UserName,$mass[$x] & " - НЕТ ДОСТУПА!",7)
$GWP = WinGetProcess ($var[$i][0]) ;Получаем имя процесса по имени окна
if WinGetProcess("explorer.exe") Then ;Если процесс explorer.exe тогда просто закроем окно(если открыта папка, а то как-то некрасиво ))) )
WinClose ($var[$i][0])
Else
ProcessClose($GWP); Киляем полученный процесс

EndIf
EndIf
EndIf
Next
Next
Sleep(1000)
Until $i=1

Func IsVisible($handle)
If BitAnd( WinGetState($handle), 2 ) Then
Return 1
Else
Return 0
EndIf

EndFuncСмысл скрипта в том, что он висит в памяти компьютера и блокирует окна в которых содержатся запрещенные слова

Последние содержатся в denylist.txt
icq
qip
и т.д.

Все работает, но скрипт сильно напрягает процессор
вопрос как разгрузить процессор?

Creat0R
03-05-2008, 00:38
babaytugur,
как разгрузить процессор? »
Хм, проверять только при изменении списка? Я бы немного подругому сделал:

#include <File.au3>

HotKeySet("^q", "QuitApp")

Dim $aDenyList, $aWinList, $aOld_WinList

;Читаем в массив файл denylist.txt
_FileReadToArray("denylist.txt", $aDenyList)

While 1
$aWinList = WinList()

;Проверяем окна только если есть изменения в списке (с момента последней проверки)

If Not _Array2DIsIdentical($aWinList, $aOld_WinList) Then
$aOld_WinList = $aWinList

For $i = 1 To UBound($aWinList)-1
For $j = 1 To UBound($aDenyList)-1
If _WinIsVisible($aWinList[$i][1]) And StringInStr($aWinList[$i][0], $aDenyList[$j]) Then
Beep(1000, 250)
_MsgBox(16, "Сообщение для " & @UserName, $aDenyList[$j] & " - НЕТ ДОСТУПА!", $aWinList[$i][1])

$iWinProcess = WinGetProcess($aWinList[$i][1])

If WinGetTitle("[CLASS:CabinetWClass;TITLE:" & $aWinList[$i][0] & "]") = $aWinList[$i][0] Then
WinClose($aWinList[$i][1])
Else
ProcessClose($iWinProcess)
EndIf
EndIf
Next
Next
EndIf

Sleep(1000)
WEnd

Func _MsgBox($MsgBoxType, $MsgBoxTitle, $MsgBoxText, $Main_GUI=0)
Local $aRet = DllCall("user32.dll", "int", "MessageBoxW", _
"hwnd", $Main_GUI, _
"wstr", $MsgBoxText, _
"wstr", $MsgBoxTitle, _
"int", $MsgBoxType)
Return $aRet[0]
EndFunc

Func _Array2DIsIdentical($av2DArray_a, $av2DArray_b, $iLastElement=1)
If UBound($av2DArray_a) <> UBound($av2DArray_b) Then Return False

For $i = 0 To UBound($av2DArray_a)-1
For $j = 0 To $iLastElement
If $av2DArray_a[$i][$j] <> $av2DArray_b[$i][$j] Then Return False
Next
Next

Return True
EndFunc

Func _WinIsVisible($handle)
Return BitAnd(WinGetState($handle), 2)
EndFunc

Func QuitApp()
Exit
EndFunc

babaytugur
03-05-2008, 00:58
Спасибо!!!
все работает
буду анализировать код

TERMINAL
03-05-2008, 14:27
Creat0R, Помоги плз написать скрипт....
Есть 40-50 папок с разными названиями, в каждой, из этих файлов, лежит скрипт с именем Auto.exe.
Мне нужно чтобы этот скрипт запускался по очереди (я так думаю это юудет команда RunWait ) из каждой папки и с помощью команды TrayTip("Установка скрипта №", "Выполняется установка NAME", 5, 4), где №-номер очередной папки по счёту, а NAME имя папки из которой стартует скрипт, отображал данную процедуру...
А то приходится вручною прописывать каждую процедуру....Возможно ли вышеуказанное сделать на скрипте?!

Maza Faka
03-05-2008, 15:29
TERMINAL
Помоги плз написать скрипт
Ты сам сможешь написать такой скрипт, ничего сложного в реализации я не вижу :)
Поищи на форуме примеры рекурсивного перебора файлов-папок (FileFindFirstFile()) и переделай под свою задачу, если не получится - поможем. ;)

TERMINAL
03-05-2008, 17:49
Maza Faka, спс-сделал !

amel27
04-05-2008, 11:13
Смысл скрипта в том, что он висит в памяти компьютера и блокирует окна в которых содержатся запрещенные слова »
Идентифицировать приложение по его окнам само по себе неэффективно, имхо сподручней использовать свойства файла - образа процесса (закладка "версия") такие как: "название продукта", "производитель", etc. В этом случае достаточно запускать скрипт только при появлении нового процесса (кстати, для этого можно использовать штатные средства WMI). $ProductName = FileGetVersion("C:\Program Files\ICQLite\ICQLite.exe", "ProductName")
$CompanyName = FileGetVersion("C:\Program Files\ICQLite\ICQLite.exe", "CompanyName")

MsgBox(0, "ICQLite Product Name", $ProductName)
MsgBox(0, "ICQLite Company Name", $CompanyName)

NikLok
04-05-2008, 15:46
amel27, А случайно кода для tftp сервера нету у Вас. А так же и binlsrv.py из пакета Ris-linux.

HORRIBLE
05-05-2008, 00:12
Maza Faka,
Binarу, я что то не понимаю, а как тогда, к примеру число 301 превратить в такое 100101101, а то эта команда что то не то выдает.
Спасибо.

amel27
05-05-2008, 03:21
NikLok
случайно кода для tftp сервера нету у Вас. А так же и binlsrv.py из пакета Ris-linux »
не понял вопроса - все указанные пакеты идут в исходниках

HORRIBLE
все не так просто - для текстового представления чисел предназначена ф-ция StringFormat(), но AutoIT штатно поддерживает только представления по основанию 16 и 8, для других оснований придется ваять UDF, как один из вариантов:ConsoleWrite(_Bin(301) & @CRLF)

Func _Bin($iNumber)
If Not IsInt($iNumber) Then Return SetError(1, 0, "")
Local $sHex = StringFormat("%X",$iNumber), $sBin = ""
Local Const $aHexToBin[16] = ["0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"]
For $i=1 To StringLen($sHex)
$sBin &= $aHexToBin[Dec(StringMid($sHex,$i,1))]
Next
Return StringRegExpReplace($sBin, "^0+", "")
EndFunc

ADD: Более "продвинутый" вариант:ConsoleWrite(_Bin(301) & @CRLF)

Func _Bin($iNumber)
If Not IsInt($iNumber) Then Return SetError(1, 0, "")
Local $sBin = ""
If $iNumber>0 Then
While $iNumber
$sBin = BitAND($iNumber,1) & $sBin
$iNumber = BitShift($iNumber,1)
WEnd
Return $sBin
ElseIf $iNumber<0 Then
For $i=1 To 32
$sBin = BitAND($iNumber,1) & $sBin
$iNumber = BitRotate($iNumber, -1, "D")
Next
Return $sBin
EndIf
Return "0"
EndFunc




© OSzone.net 2001-2012