Войти

Показать полную графическую версию : [Архив - Часть 1.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

Creat0R
25-04-2007, 20:26
mrak1990
на компе одного из знакомых сообщение не выскакивает
Так а в чём проблема? файлы ведь заменяются? зачем нужно это сообщение? :)

mrak1990
25-04-2007, 21:43
mrak1990

Цитата:
на компе одного из знакомых сообщение не выскакивает


Так а в чём проблема? файлы ведь заменяются? зачем нужно это сообщение?

Я имел в виду следующее. Скрипт заменяет оригинальный файл Notepad.exe на мой. Но через некоторое время срабатывает защита от подмены файлов и Windows возвращает старый, оригинальный файл Notepad.exe.

Creat0R
25-04-2007, 21:54
mrak1990
через некоторое время срабатывает защита от подмены файлов и Windows возвращает старый, оригинальный файл Notepad.exe.
А откуда она его берёт? наскольео я помню именно с c:\windows\system32\dllcache\Notepad.exe, может изменить последовательность замеы:

c:\windows\system32\dllcache\Notepad.exe
c:\windows\Notepad.exe
c:\windows\system32\Notepad.exe

mrak1990
25-04-2007, 22:03
Из дистрибутива к Notepad++. Точнее, из аддона к этой проге, который заменяет блокнот на Notepad++.

mrak1990
26-04-2007, 15:48
Появился вопрос насчёт работы AutoIt с SysTreeView321. А именно я бы хотел заставить работать с окном: Свойства папки. Но подходящих операторов что-то не нашёл. Только в папке Include есть файл с нужными функциями:


; _GUICtrlTreeViewDeleteItem
; _GUICtrlTreeViewExpand
; _GUICtrlTreeViewGetBkColor
; _GUICtrlTreeViewGetCount
; _GUICtrlTreeViewGetIndent
; _GUICtrlTreeViewGetLineColor
; _GUICtrlTreeViewGetParentHandle
; _GUICtrlTreeViewGetParentID
; _GUICtrlTreeViewGetState
; _GUICtrlTreeViewGetText
; _GUICtrlTreeViewGetTextColor
; _GUICtrlTreeViewGetTree
; _GUICtrlTreeViewInsertItem
; _GUICtrlTreeViewSelectItem
; _GUICtrlTreeViewSetBkColor
; _GUICtrlTreeViewSetIcon
; _GUICtrlTreeViewSetIndent
; _GUICtrlTreeViewSetLineColor
; _GUICtrlTreeViewSetState
; _GUICtrlTreeViewSetText
; _GUICtrlTreeViewSetTextColor
; _GUICtrlTreeViewSort


Но у меня такое ощущение, что они работают только с создаными GUI.

Creat0R
26-04-2007, 16:39
mrak1990
Но у меня такое ощущение, что они работают только с создаными GUI.
Угу, эти функции предназначены только для работы с AutoIt'овским GUI.

Для управления внешними элементами, нужно пробовать ControlClick(), ControlCommand(), и им подобные.
Но именно со случаем Свойства папки будет сложновато, я как то пытался управлять элементами, но там идентификатор управляющих (Control ID) почти не распознаётся (программой Au3Info).

mrak1990
26-04-2007, 17:01
mrak1990

Цитата:
Но у меня такое ощущение, что они работают только с создаными GUI.


Угу, эти функции предназначены только для работы с AutoIt'овским GUI.

Для управления внешними элементами, нужно пробовать ControlClick(), ControlCommand(), и им подобные.
Но именно со случаем Свойства папки будет сложновато, я как то пытался управлять элементами, но там идентификатор управляющих (Control ID) почти не распознаётся (программой Au3Info).

А ты какой Control ID имеешь ввиду? Всего дерева или отдельных пунктов? У всего дерева я знаю какой код: 30120
Сейчас попробовал повозиться с прогой Winspector. В конце концов нашёл команду, которая ставит или убирает галочку: TVM_SETITEMW

И плюс к этому прога выдаёт ещё какую-то инфу:

Item: 0*00094d88
Mask: TVIF_HANDLE | TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT
IParam: 0*000ee458
Text: Отображать "Панель управления" в папке "Мой компьютер"



Это вообще может как-то пригодиться?

Creat0R
26-04-2007, 17:34
mrak1990
В конце концов нашёл команду, которая ставит или убирает галочку: TVM_SETITEMW

Как то так может:

Opt("WinTitleMatchMode", 4)
$hWnd = WinGetHandle("Свойства папки")

DllCall("user32.dll", "long", "SendMessage", "hwnd", $hWnd, "int", "TVM_SETITEMW", "int", "0*00094d88", "int", 0)

Это неверно, но направление кажется верное :)...

Все эти опции можно редактировать из реестра - HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced

mrak1990
26-04-2007, 18:47
Как то так может:


Код:
Opt("WinTitleMatchMode", 4)
$hWnd = WinGetHandle("Свойства папки")

DllCall("user32.dll", "long", "SendMessage", "hwnd", $hWnd, "int", "TVM_SETITEMW", "int", "0*00094d88", "int", 0)

Это неверно, но направление кажется верное ...


А можно где-нибудь поподробнее узнать о синтаксисе?



Все эти опции можно редактировать из реестра - HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced

Просто уменя не пашет через реестр одна из опций: Скрывать защищённые системные файлы.

mrak1990
26-04-2007, 19:37
В общем раскопал справочник по WinAPI. Но мне от него толку маловато:


Функция SendMessage

Описание:
function SendMessage(Wnd: HWnd; Msg, wParam: Word; lParam: Longint): Longint;

Посылает сообщение оконной функции указанного окна. Возвpат из функции осуществляется только после обpаботки сообщения.

Паpаметpы:
Wnd: Окно, пpинимающее сообщение или $FFFF для посылки всем всплывающим окнам в системе.
Msg: Тип сообщения.
wParam: Дополнительная инфоpмация о сообщении.
lParam: Дополнительная инфоpмация о сообщении.

Возвpащаемое значение:
Значение, возвpащенное пpинимающей оконной функцией.

функция находится в файле user32.dll

Ну а это, я думаю все разобрались что такое:

DllCall ( "dll", "return type", "function" [, "type1", param1 [, "type n", param n]] )


В общем, кто хоть что-то в этом деле смыслит помогите разобраться.

Creat0R
26-04-2007, 21:12
mrak1990
Просто уменя не пашет через реестр одна из опций: Скрывать защищённые системные файлы.
Всё очень просто:


RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "ShowSuperHidden", "REG_DWORD", 1) ;если 0, тогда файлы будут показываться.


Если нужно обновить программно все папки и даже рабочий стол, см. мою утилитку для отката расширении файлов и скрытых папок тут (http://creator-lab.ucoz.ru/load/3-1-0-14) (исходники естественно в архиве прилагаются ;) ).

раскопал справочник по WinAPI
На русском? можно ссылку на источник?

qeraser
27-04-2007, 10:11
Задача - запуск и работа 1с с конкретной конфигурацией с флэш-диска на любом компьютере.
Платформа + база находятся на флэш.
Т.е подключив флэшку и запустив 1с с нее же, загружалась нужная конфигурация.
Чтобы 1с видел базы пути к ним должны быть прописаны пути в реестре.

Я могу написать bat, au3 файл который вносил бы соотв. записи в реестр, но в путях к базам нужно указать букву диска. Проблема в том, что компьютеры разные, соответственно флэш-диск будет иметь разные буквы в системе.

Как можно поэлегантнее реализовать?

amel27
27-04-2007, 11:12
qeraser

для BAT подстановка %~d0 возвращает букву диска, откуда запущен скрипт
для AU3 выражение StringLeft (@ScriptDir, 2) работает аналогично

qeraser
27-04-2007, 11:49
amel27
Спасибо, разобрался :)

TERMINAL
27-04-2007, 13:47
Как определить - есть ли на диске свободных 1 гиг, если есть то вывести сообщений №1, если нет-вывести сообщение №2?!

amel27
А возможно чтобы обновления записывальсь в текстовый файл?
где изменения сделать?

mrak1990
27-04-2007, 14:51
На русском? можно ссылку на источник?

Без проблем:

http://foxpopuli.narod.ru/books/api_help.zip

mrak1990
27-04-2007, 15:49
Creat0R
Func UpdateExplorer()
Local $WinExpListArr = _ExplWinGetList()
Local $OldOpt = Opt("WinTitleMatchMode", 4)
Local $GetWinState, $Hwnd
If IsArray($WinExpListArr) Then
For $iWin = 1 To $WinExpListArr[0]
$GetWinState = WinGetState($WinExpListArr[$iWin])
$Hwnd = WinGetHandle($WinExpListArr[$iWin])
DllCall("user32.dll", "long", "SendMessage", "hwnd", $hWnd, "int", 0x111, "int", 28931, "int", 0)
Next
EndIf

$Hwnd = WinGetHandle("classname=Progman")
DllCall("user32.dll", "long", "SendMessage", "hwnd", $hWnd, "int", 0x111, "int", 28931, "int", 0)
Opt("WinTitleMatchMode", $OldOpt)
EndFunc

Func _ExplWinGetList()
Local $OldOpt = Opt("WinTitleMatchMode", 4)
Local $WinList = WinList("classname=CabinetWClass")
Opt("WinTitleMatchMode", $OldOpt)
If IsArray($WinList) Then
Local $WinListArr[$WinList[0][0]+1]
For $iW = 1 To $WinList[0][0]
$WinListArr[$iW] = $WinList[$iW][0]
Next
$WinListArr[0] = $WinList[0][0]
Return $WinListArr
Else
Return ""
EndIf
EndFunc

У меня вопрос вот по этому коду. Можешь просто описать в общих чертах, как он работает?

Creat0R
27-04-2007, 17:49
TERMINAL
Как определить - есть ли на диске свободных 1 гиг, если есть то вывести сообщений №1, если нет-вывести сообщение №2?!


$CD = "C:\"
$FreeSpace = DriveSpaceFree($CD)
If $FreeSpace >= 1024 Then
MsgBox(64, "", "Ok, есть на диске <" & $CD & "> " & $FreeSpace & " мб свободного места.")
Else
MsgBox(48, "", "На диске <" & $CD & "> не хватает свободного места (" & $FreeSpace & " мб).")
EndIf


mrak1990

Без проблем:
Спасибо!

Можешь просто описать в общих чертах, как он работает?
Конечно...

Первая функция ( UpdateExplorer() ), в начале использует вторую ( _ExplWinGetList() ), чтобы получить список заголовок всех окон которые являются папками (мы же не хотим обновлять к примеру Internet Explorer :) ).
Затем для каждого найденого окна (из полученного списка в массиве), происходит обновление (это делает вызов Dll), всё это в принципе для одной цели - обновить программно все открытые эксплореровские окна (в том числе и рабочий стол), не активируя их и не используя никаких посылании клавишь типа F5 :) , а просто прямой вызов функции (для конкретного окна) обновления окна (та же функция которая выполняется Windows после нажатия F5).

mrak1990
27-04-2007, 17:53
Creat0R
Остался один вопрос. Для чего ты вызываешь два раза функцию DllCall? Один раз для папок, а другой для рабочего стола?

Creat0R
27-04-2007, 18:10
mrak1990
Для чего ты вызываешь два раза функцию DllCall? Один раз для папок, а другой для рабочего стола?
Да, для рабочего стола класс заголовка окнка немного другой, поэтому получить его из списка одновременно не получается... хотя можно было конечно во второй функции добавить последний элемент в массив который содержал бы заголовок окна для рабочего стола, но так тоже нормально работает :)

И ещё, $GetWinState = WinGetState($WinExpListArr[$iWin]) там уже лишнее, это раньше у меня не получалось напрямую обновлять окна, поэтому приходилось активировать их, посылать им обновление, и затем возвращать окно в исходное положение (свёрнутое/развёрнутое, активное/не активное).

Вот обновил функции, теперь список всех окон возвращается средствами функции _ExplWinGetList(), а также убрал лишние строчки:


Func UpdateExplorer()
Local $OldOpt = Opt("WinTitleMatchMode", 4)
Local $WinExpListArr = _ExplWinGetList()
Local $Hwnd
If IsArray($WinExpListArr) Then
For $iWin = 1 To $WinExpListArr[0]
$Hwnd = WinGetHandle($WinExpListArr[$iWin])
DllCall("user32.dll", "long", "SendMessage", "hwnd", $hWnd, "int", 0x111, "int", 28931, "int", 0)
Next
EndIf
Opt("WinTitleMatchMode", $OldOpt)
EndFunc

Func _ExplWinGetList()
Local $WinList = WinList("classname=CabinetWClass")
If IsArray($WinList) Then
Local $WinListArr[$WinList[0][0]+2]
For $iW = 1 To $WinList[0][0]
$WinListArr[$iW] = $WinList[$iW][0]
Next
$WinListArr[0] = $WinList[0][0]+1
$WinListArr[$WinListArr[0]] = "classname=Progman"
Return $WinListArr
Else
Return ""
EndIf
EndFunc




© OSzone.net 2001-2012