Войти

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

Maza Faka
14-01-2009, 10:19
А также есть ещё такой диалог для завершения работы (обычно выводится разными программами для перезапуска системы): »
Неплохой пример, но непонятно, почему проверяется версия ОС и в соответствии с этим задаётся тип данных (char или wchar), но в функции DllCall всё равно используется тип wstr? Вроде бы так будет корректно:
_RestartDialog('Установка программы успешно завершена!')

Func _RestartDialog($sPrompt = '', $iFlag = 2, $hWnd = 0)
Local $sStringType = "str"
If @OSTYPE = "WIN32_NT" Then $sStringType = "wstr"

Local $aRet = DllCall("Shell32.dll", "int", "RestartDialog", _
"hwnd", $hWnd, _
$sStringType, $sPrompt, _
"int", $iFlag)
Return $aRet[0]
EndFunc ;==>_RestartDialog

Creat0R
14-01-2009, 12:32
непонятно, почему проверяется версия ОС и в соответствии с этим задаётся тип данных (char или wchar), но в функции DllCall всё равно используется тип wstr? »
Проверяется это для структуры :) - Хотя как я понял она вообще не нужна, да и в последней версии аутоита вообще и сама проверка не нужна, ведь Win 9x уже не поддерживается, т.ч можно сразу использовать "wstr".

Вроде бы так будет корректно »
Не совсем, у тебя перепутаны параметры местами, в первом параметре передаёшь тест вместо hWnd :tongue:

Maza Faka
14-01-2009, 13:22
Проверяется это для структуры »
Я знаю, для чего это применяется, я говорю о том, что, если пользователь будет использовать этот код в среде Win 9x, то функция не сработает, так, как в функции у тебя используется wstr-тип данных. Да и вообще, вызов функции неправильный, для чего создаётся структура, если в MSDN-e сказано:

A null-terminated Unicode string that contains the text that displays in the dialog box which prompts the user.

а, если даже и создаётся структура, то нужно указывать на неё используя DllStructGetPtr

у тебя перепутаны параметры местами, в первом параметре передаёшь тест вместо hWnd »
А при чём здесь порядок передачи параметров? В самой функции параметры используются по порядку. Я передаю, так, как мне удобно. Или это аксиома?

Creat0R
14-01-2009, 13:37
в функции у тебя используется wstr-тип данных »
Это не у меня, функцию я взял отсюда (http://www.autoitscript.com/forum/index.php?showtopic=67521&hl=customdialog) :tongue:

А при чём здесь порядок передачи параметров? В самой функции параметры используются по порядку. Я передаю, так, как мне удобно. Или это аксиома? »
:o :tomato2: - Пересмотри пожалуйста свой пример с объективной точки зрезния (как будто это не твоей "рукой" написано), и скажи мне, что в нём не так...

Maza Faka
14-01-2009, 13:45
Пересмотри пожалуйста свой пример »
Вот млин, на вызов функции внимания не обратил :fingal: Сорри :)

litus
14-01-2009, 14:40
Здравствуйте чтото не могу понять как зделать чтобы закрытие вызваного окна по
#include"My okno.au3"
не вызывалозакрытие всего скрипта.
Не поиму предназначение функции: exitloop
Пример из справки работает хотя непредставляю ищо как его дописать к своему окну хотя в нем есть большой недостаток при повторном вызове окна основной скрипт слетает с ошибкой. Пробовал убить его спомощью
WinClose("My okno", "")
WinKill("My okno", "")
без результатно
Пример из справки


#include <GUIConstants.au3>

GUICreate("My GUI") ; will create a dialog box that when displayed is centered

GUISetState () ; will display an empty dialog box

; Run the GUI until the dialog is closed
While 1
$msg = GUIGetMsg()

If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Wend

GUIDelete(); ; will return 1

Maza Faka
14-01-2009, 15:30
litus
А если прятать окно? GuiSetState(@SW_HIDE, $hGUI)

voler
14-01-2009, 18:25
Подскажите хочу сделать autoit скрипт для автоматической установки sql 2000

[CODE]Run(".\SETUPSQL.EXE")

WinWait("Setup")
WinActivate ("Setup")
WinWaitActive("Setup")
Send("!s")
Send ( '{ENTER}' )
Вот оно
http://voler.ru/win.jpg

Но почему то не нажимает на окно предупреждения, когда ставишь на XP.

semiono
14-01-2009, 21:51
Creat0R, 1. свой диалог shutdown нельзя! у меня проблемы с перезагрузкой, работают только графический Пуск... и Диспетчер Задач тоже самое - кнопки и клики. Если выполнить shutdown.exe или
шатдаун() в автоит то зависнет! я пробовал уже. Только GUI кнопками работает! Трабла такая у мну :)
2. И вообще это интересно и любопытно, как taskmgr можно нажимать, чисто интересно, пожалуйста попытайтесь написать код?
ЗЫ Раз есть проблем у мну, то он может быть не только у мну, а значит уже не надёжно всётаки, но дел не в этом,
просто хочется альтернативу иметь тоже.

Creat0R
15-01-2009, 01:28
как taskmgr можно нажимать, чисто интересно »
Примерно так:

#include <WindowsConstants.au3>
#include <SendMessage.au3>
#include <GuiMenu.au3>

Run("taskmgr.exe")

WinWait("[CLASS:#32770;REGEXPTITLE:.*Windows.*]", "", 5)
$hTskMgr = WinGetHandle("[CLASS:#32770;REGEXPTITLE:.*Windows.*]")

If Not WinExists($hTskMgr) Then Exit

$hMenu = _GUICtrlMenu_GetMenu($hTskMgr)
$hSubMenu = _GUICtrlMenu_GetItemSubMenu($hMenu, 4) ;change to 3th submenu (zero-based), now it will only show the "About" window.
$iItemID = _GUICtrlMenu_GetItemID($hSubMenu, 3) ;2 = Shutdown, 3 = Restart (2 and 3 it's zero-based item from the top of menu)

_SendMessage($hTskMgr, $WM_COMMAND, $iItemID, 0)

Кстати, можно и скрыто это сделать (кроме икокни в трее), нужно заменить Run("taskmgr.exe") на Run("taskmgr.exe", "", @SW_HIDE).

FlatX007
15-01-2009, 01:50
Вообщем в некой части скрипта есть во такой код (который устанавливает прогресс бар)

Вопрос .... ! можно это ещё как либо доработать ??? Creat0R ;) (скрипт рабочий) и ещё у меня ошибка в начале где : If $ySize_Total == 451490049 Then и я немогу понять почему.

;*********

$ScriptDir = @ScriptDir
$sDrive_Selected = "D:\"
;Проверяем размер копируеммых файлов
$ySize_Menu = DirGetSize($ScriptDir & "\" & "Menu"); Папка на источника
$ySize_Soft = DirGetSize($ScriptDir & "\" & "Soft"); Папка на источника
$ySize_Total = $ySize_Soft + $ySize_Menu ; Размер фалов на источнике всего - 451 490 049 байт

;~ If $ySize_Total == 451490049 Then
;~ ContinueLoop
;~ Else
;~ MsgBox(0, "Внимание", "Произошла ошибка при проверке размера копируемых файлов")
;~ Exit
;~ EndIf

IniWrite (@TempDir & '\CopyToUsb.ini', "settings", "KeyDrive", $sDrive_Selected); Записывам в INI выбранный диск например J:\
IniWrite (@TempDir & '\CopyToUsb.ini', "settings", "KeyPATH", $ScriptDir) ; Записываем в INI путь папки из которой запущен скрипт

GUISetState(@SW_DISABLE, $hGUI) ;Блокируем GUI на время копирования
ProgressOn("", "Идёт копирование", "" ,100 ,100 ,1)
FileInstall (@ScriptDir & '\CopyToUsb.exe', @TempDir & '\CopyToUsb.exe', 1)
Run(@TempDir & '\CopyToUsb.exe')

$w = 0
While $w < 1
$zSize_Menu = DirGetSize($sDrive_Selected & "Menu");папка на приёмнике
$zSize_Soft = DirGetSize($sDrive_Selected & "Soft");папка на приёмнике

$zSize_Total = $zSize_Soft + $zSize_Menu ; Размер фалов на приёмнике Итог после окончания копирования должен быть 451 490 049 байт
$zSize_1 = $zSize_Total / 1000000; Итог 451.ххх
$zSize_PrBar = Round(($zSize_1) + 49) / 5; = 100

$Ver_Copy = IniRead(@TempDir & '\CopyToUsb.ini', "settings", "Copy", "default") ; Cчитываем из INI значение о правильности копирования

ProgressSet($zSize_PrBar, $zSize_PrBar & " % выполнения")
sleep(300)

If $zSize_Total < 451490049 Then
$w = 0
Else
If $Ver_Copy = 1 Then
ProgressSet(100 , "Готово", "Выполнено")
sleep(3000)
ProgressOff()
$w = 2
MsgBox(64, "Внимание", "Копирование прошло удачно")
EndIf

If $Ver_Copy = 0 Then
ProgressSet(100 , "Ошибка", "Не выполнено")
sleep(3000)
ProgressOff()
MsgBox(16, "Внимание", "Произошла ошибка при копировании")
Exit
EndIf
EndIf
WEnd

GUISetState(@SW_ENABLE, $hGUI)
Case $GUI_EVENT_CLOSE, $Cancel_Button
ExitLoop
EndSwitch
WEnd



Впоследствии это станет "CopyToUsb.exe" который находится внутри закомпилированного скрипта (он выше) и сопсн говоря это приложение и будет выполнять копирование
#NoTrayIcon

$sDrive = IniRead(@TempDir & '\CopyToUsb.ini', "settings", "KeyDrive", "default1"); Считываем из INI выбранный диск например J:\
$sScriptDir = IniRead(@TempDir & '\CopyToUsb.ini', "settings", "KeyPATH", "default2"); Считываем из INI путь папки из которой запущен скрипт

While 1

$xVer_1 = DirCopy($sScriptDir & "\" & "Menu", $sDrive & "Menu")
$xVer_2 = DirCopy($sScriptDir & "\" & "Soft", $sDrive & "Soft")
$xVer = $xVer_2 + $xVer_1

If $xVer == 2 Then
IniWrite (@TempDir & '\CopyToUsb.ini', "settings", "Copy", "1"); Записывам в INI о том что копирование удачно
ExitLoop
Else
IniWrite(@TempDir & '\CopyToUsb.ini', "settings", "Copy", "0") ; Записываем в INI о том что копирование неудачно
ExitLoop
EndIf

WEnd

;~ FileDelete(@TempDir & '\CopyToUsb.ini')

Exit

semiono
15-01-2009, 02:01
Примерно так: »

а вчём примерно ошибки могут быть? класс чтоль не тот? taskmgr открывается, но ничего не происходит.

титул: Windows Task Manager
меню: Shut Down
/список: Stand By | Hibernate | Turn Off | Restart | Log Off Semiono | Lock Computer WinKey + L

надо Restart нажать! :)

Creat0R
15-01-2009, 02:06
меню: Shut Down / Stand By | Hibernate | Turn Off | Restart | Log Off Semiono | Lock Computer WinKey + L »
А какое по счёту меню «Shut Down» слева?

P.S
4 нужно заменить на 3 в скрипте.

Maza Faka
15-01-2009, 07:27
voler, не нажимает на окно предупреждения »
А если так:

ControlClick("Setup", "component is not supported", "OK")


можно это ещё как либо доработать ? »
Хотя вопрос задан не мне...
Во первых - пример не рабочий, во вторых - неправильное использование функции FileInstall (читаем справку).

P.S.
Если хочешь получить грамотную помощь - задавай грамотные вопросы, с рабочими примерами ;)

litus
15-01-2009, 10:03
Maza Faka А если прятать окно?
GuiSetState(@SW_HIDE, $hGUI)
А откуда взялась переменая $hGUI если нетрудно перепешите . Раньше это было два разных скрипта и если я вызывал с основного скрипта по функции run диалоговое окно то оно отрабатывалось как отдельный скрипт и спокойно закрывалось поExit не затрагивая работу основного скрипта.
но хотелось бы зделать по компактнее.

araneon
15-01-2009, 10:45
Ребята, а подскажите как выгрузить из процесса одну dll. То есть, есть процесс (допустим explorer.exe) к нему подгружается одна dll вот как её выгрузить не убивая сам процесс ?

TERMINAL
15-01-2009, 12:53
Возможно ли при присутствии 4 разделов жёсткого диска определить какие системы находятся на других жёстких дисках?

Maza Faka
15-01-2009, 14:05
Раньше это было два разных скрипта »
Выложи их здесь и обьясни поподробней, что нужно сделать :)

TERMINAL
Либо парсить boot.ini, либо искать папки с именами: Windows, WinNT и т.д.

TERMINAL
15-01-2009, 14:25
Либо парсить boot.ini » - это неподойдет и по имени папок неподойдёт, может по наличию каких-либо файлов ?

FlatX007
15-01-2009, 17:21
Хотя вопрос задан не мне...
Во первых - пример не рабочий, во вторых - неправильное использование функции FileInstall (читаем справку....
»

очень странно но у меня всё работает ... что, неправильно в FileInstall ? файлик CopyToUsb.exe попадает во временную папку и от туда запускается

А да извиняюсь ошибка есть ... компилятор выдал только при компиляции скрипта в ЕХЕ
Вот так работает : FileInstall ("CopyToUsb.exe", @TempDir & '\CopyToUsb.exe', 1)




© OSzone.net 2001-2012