Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.
amel27, Насколько я понял речь о символических ссылках, »
да совершенно верное понимание проблемы. Просто я этих стандартных API не знаю.
М..маленький прбмерчик бы!
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
amel27, Огроменное спасибо! Все замечательно работает!!!
Огроменное спасибо »
Спасибо сайту FlexHEX (http://www.flexhex.com/docs/articles/hard-links.phtml) за исходники и описание недокументированных структур,
кстати, там есть и бинарники на случай CMD :)
amel27, А в GUI можно мигающую строку (элемент ListView) сделать. Или обязательно программно самому мигать!?
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 сделать, но много возни с рисованием текста и его раскрашиванием. :)
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
и т.д.
Все работает, но скрипт сильно напрягает процессор
вопрос как разгрузить процессор?
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, спс-сделал !
Смысл скрипта в том, что он висит в памяти компьютера и блокирует окна в которых содержатся запрещенные слова »
Идентифицировать приложение по его окнам само по себе неэффективно, имхо сподручней использовать свойства файла - образа процесса (закладка "версия") такие как: "название продукта", "производитель", 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)
amel27, А случайно кода для tftp сервера нету у Вас. А так же и binlsrv.py из пакета Ris-linux.
HORRIBLE
05-05-2008, 00:12
Maza Faka,
Binarу, я что то не понимаю, а как тогда, к примеру число 301 превратить в такое 100101101, а то эта команда что то не то выдает.
Спасибо.
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.