Показать полную графическую версию : [Архив - Часть 1.3] AutoIt скрипты
mrak1990
на компе одного из знакомых сообщение не выскакивает
Так а в чём проблема? файлы ведь заменяются? зачем нужно это сообщение? :)
mrak1990
25-04-2007, 21:43
mrak1990
Цитата:
на компе одного из знакомых сообщение не выскакивает
Так а в чём проблема? файлы ведь заменяются? зачем нужно это сообщение?
Я имел в виду следующее. Скрипт заменяет оригинальный файл Notepad.exe на мой. Но через некоторое время срабатывает защита от подмены файлов и Windows возвращает старый, оригинальный файл Notepad.exe.
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.
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: Отображать "Панель управления" в папке "Мой компьютер"
Это вообще может как-то пригодиться?
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]] )
В общем, кто хоть что-то в этом деле смыслит помогите разобраться.
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
На русском? можно ссылку на источник?
Задача - запуск и работа 1с с конкретной конфигурацией с флэш-диска на любом компьютере.
Платформа + база находятся на флэш.
Т.е подключив флэшку и запустив 1с с нее же, загружалась нужная конфигурация.
Чтобы 1с видел базы пути к ним должны быть прописаны пути в реестре.
Я могу написать bat, au3 файл который вносил бы соотв. записи в реестр, но в путях к базам нужно указать букву диска. Проблема в том, что компьютеры разные, соответственно флэш-диск будет иметь разные буквы в системе.
Как можно поэлегантнее реализовать?
qeraser
для BAT подстановка %~d0 возвращает букву диска, откуда запущен скрипт
для AU3 выражение StringLeft (@ScriptDir, 2) работает аналогично
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
У меня вопрос вот по этому коду. Можешь просто описать в общих чертах, как он работает?
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? Один раз для папок, а другой для рабочего стола?
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.