Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.
Maza Faka
03-11-2008, 15:07
Busel
Так?
FileCreateShortcut(@ScriptDir & "\program.exe", @ScriptDir & "\MyProgram.lnk", @ScriptDir, "Setup.exe -uninstall")
Ты бы код запостил, что бы нам не гадать, какой параметр куда лепить :)
Babullika, получается что все файлы копируются с одинаковыми префиксами »
И правильно получается, ты ведь функцию Random() один раз вызываешь :)
Попробуй так:
$source = "C:\Temp2"
$dest = "C:\Temp3"
$hSearch = FileFindFirstFile($source & "\*.txt")
If $hSearch = -1 Then Exit
While 1
$file = FileFindNextFile($hSearch)
If @error Then ExitLoop
Do
$UnicFile = Random(-10, 10, 1) & ".txt"
Until FileExists($dest & "\" & $UnicFile) = 0
FileCopy($source & "\" & $file, $dest & "\" & $UnicFile, 9)
WEnd
FileClose($hSearch)
Если количество файлов будет превышать количество вариантов чисел возвращаемых Random(), то цикл Do... Until зациклится
Creat0R
видимо не ту версию скачал (нужно ту что для 3.2.10.0) - Ведь если вызывать функции постоянно это уже и будет динамический »
вроде ту, хотя их там многовато... у тебя вроде одна CallBack-функция и регистрируется/удаляется она единожды, вот если бы функция обработки каждого нового контрола регистрировалась как отдельная CallBack-функция, пожалуй тогда бы это было динамическое создание/удаление хэндлов :)
проблема есть, и заключается она в том, что Аутоит "вылетает" когда от него это не ожидается »
ну это все-таки баг и не более... кроме того, как я понял - если обеспечить парность создания/закрытия хэндлов, то ошибки не будет?.. создание парных UDF создания/освобождения косвенно решает эту задачу
А как быть с LAST_HOVERED_ELEMENT? »
извиняюсь, глубоко не вдавался... действительно, WM_TIMER не способен передавать пользовательские данные (в отличие от других WM-сообщений), поэтому хистори придется хранить в глобальных данных, хотя это принципиально ничего не меняет кроме количества параметров в UDF
этого не будет достаточно если нужно чтобы обработка OnHover была и при не активном GUIможет быть... мне все же привязка к GUI кажется искусственной, хотя обобщить при желании не проблема :)
amel27, у тебя вроде одна CallBack-функция и регистрируется/удаляется она единожды »
В том то и дело что нет, она регистрируется/удаляется каждый раз как нужно задать/убрать «OnHover» для элемента (если это первый или последний элемент в списке/в массиве). Я это продемонстрировал в примере ранее (http://forum.oszone.net/post-941571.html#post941571).
если обеспечить парность создания/закрытия хэндлов, то ошибки не будет? »
Тут видимо проблема в том, что если регистрировать и освобождать CallBack в цикле (быстро), то процесс высвобождения не успевает завершиться (видимо он происходит на "уровне системы"), а в то время происходит попытка высвобождения хендла, который уже считается высвобождённым :clever-ma . Вот такая вот сомнительная теория :).
привязка к GUI кажется искусственной, хотя обобщить при желании не проблема »
Согласен. Ну, если народу сильно нужно будет, попробую усовершенствовать, добавив поддержку внешних элементов, а пока сей функционал никому (и мне в том числе) вроде не нужен.
morgan1991
04-11-2008, 15:04
Скажите пожалуйста можно ли вот это C++ реализовать в Autoit3:
#include <windows.h>
#include <stdio.h>
#include <iostream>
using namespace std;
//hier werden alle Bytes definiert die wir brauchen
//(sie werden spдter an die entsprechenden Speicherstellen geschrieben).
BYTE nametags1[6] = { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90};
BYTE nametags2[2] = { 0x90, 0x90};
BYTE laser1[2] = { 0x75, 0x18};
BYTE laser2[2] = { 0x75, 0x0F};
BYTE UAV[4]= { 0xB0, 0x01, 0x90, 0xC3};
BYTE recoil[6] = { 0x0F, 0x85, 0xAA, 0x02, 0x00, 0x00};
int main()
{
cout << "Call of Duty 4 MemoryHack\ncoded by root.\n";
bool beenden=1;
while(beenden=1) //Diese Schleife lдuft so lange bis das Programm sich beendet, um Spaghetticode (goto x) zu verhidern.
{
cout << "Was willst du tun?\n0=‚л室 1=Џ®¤бўҐвЄ* *ЁЄ®ў 2=Laser 3=Radar 4=Verbugtes NoRecoil\n";
int eingabe=0;
cin>>eingabe;
if(eingabe==0)
{
return 0;
}
cout << "Searching for Cod4... \n";
HWND window = NULL;
while(window == NULL)
{
Sleep(100);
window = FindWindow(NULL, "Call of Duty 4"); //Finde das Call of Duty 4 Fenster (Danke an KN4CK3R fьr diesen Teil)
}
DWORD prozess;
GetWindowThreadProcessId(window, &prozess);
HANDLE handle;
handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, prozess);
DWORD puffer = NULL;
cout << "Writing to Memory... \n"; //Jetzt ьberprьfen wir, was der Benutzer denn eigentlich will
switch(eingabe)
{
case 1:
WriteProcessMemory(handle,(void*)(0x42E1AC),&nametags1,6,&puffer);
WriteProcessMemory(handle,(void*)(0x42E1CE),&nametags2,2,&puffer);
break;
case 2:
WriteProcessMemory(handle,(void*)(0x456E5B),&laser1,2,&puffer);
WriteProcessMemory(handle,(void*)(0x456E52),&laser2,2,&puffer);
break;
case 3:
WriteProcessMemory(handle,(void*)(0x56B662),&UAV,4,&puffer);
break;
case 4:
WriteProcessMemory(handle,(void*)(0x457C79),&recoil,6,&puffer);
break;
}
CloseHandle(handle); //Und brav wieder schlieЯen
}
return 0;
}
можно ли вот это C++ реализовать в Autoit3 »
Думаю можно, см. в сторону этих функции:
#include <WinAPI.au3>
_WinAPI_WriteProcessMemory()
_WinAPI_GetWindowThreadProcessId()
_WinAPI_OpenProcess()
_WinAPI_CloseHandle()
morgan1991
04-11-2008, 15:29
спс, только у меня autoit-v3.2.8.1, а внем такое есть?
morgan1991, у меня autoit-v3.2.8.1, а внем такое есть? »
Нет, но раньше использовалась библиотека A3LLibrary для подобных целей, там это вроде есть. Остатки библиотеки можно поискать по оф. форуму, если не найдётся, то постараюсь найти у себя.
Но если есть возможность, лучше перейти на последнюю версию аутоита.
morgan1991
04-11-2008, 23:23
Не нету возможности, а на счёт библиотеки можно поподробнее?
можно поподробнее? »
WinAPI.zip (http://creator-lab.ucoz.ru/AutoIt/WinAPI.zip) (108 Kb) - Поместить содержимое в Папку\установки\AutoIt3\Include.
Правда при проверке синтаксиса ругается на параметры функции, это видимо только лишь ошибка синтакс чекера, сами функии вроде работают.
Creat0R
Я это продемонстрировал в примере ранее.
в упор не вижу в либе _GUICtrlUnSetOnHover :o ...а чем не устраивает, к примеру, такой вариант:
#include <GuiConstants.au3>
#include <GUICtrlSetOnHover_UDF_For 3.2.10.0.au3>
$GUI = GUICreate("Test Script", 300, 200)
$Button = GUICtrlCreateButton("Button", 20, 40, 60, 20)
For $i = 1 To 10
If Mod($i, 2) = 0 Then
_GUICtrlOnHoverSet($Button, "Hover_Func", "Leave_Hover_Func")
Else
_GUICtrlOnHoverUnSet($Button)
EndIf
Next
GUISetState(@SW_SHOW, $GUI)
_GUICtrlOnHoverStart()
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
EndSwitch
WEnd
_GUICtrlOnHoverStop()
morgan1991у меня autoit-v3.2.8.1у тебя консольный исходник и данные принимаются из StdIn, компиляция скрипта "в консоль" поддерживается только v3.2.12.0. Поэтому, либо обновляй версию, либо меняй источник данных - например, из файла
morgan1991
05-11-2008, 13:56
Creat0R, спс, а случайно не раскажешь как пользоваться командами?
#include <WinAPI.au3>
_WinAPI_WriteProcessMemory()
_WinAPI_GetWindowThreadProcessId()
_WinAPI_OpenProcess()
_WinAPI_CloseHandle()
»
amel27, в упор не вижу в либе _GUICtrlUnSetOnHover »
Извиняюсь, я видимо ещё не запостил последнюю версию, где эта функция добавлена :sorry: , прикрепил новый UDF к посту. Кстати, есть ещё и версия без DllCalbackRegister, на основе WM_TIMER, но там есть свои ограничения (привязка к фиктивному GUI).
чем не устраивает, к примеру, такой вариант »
Устраивает, также как и текущий. Хотя лишний раз вызывать функции мне кажется лишним. Тут это только пример показывающий баг у DllCallBackFree, не более.
компиляция скрипта "в консоль" поддерживается только v3.2.12.0 »
Но есть для ранних версиях патч (http://www.autoitscript.com/forum/index.php?s=&showtopic=59862&view=findpost&p=468043) ;).
morgan1991,
случайно не раскажешь как пользоваться командами? »
В справке есть описания параметров, я лично с этими функциям не работал ещё.
morgan1991
05-11-2008, 14:12
В справке есть описания параметров »
Качал последнюю справку с офф. сайта v3.2.5.4, позднее нету. Дак вот в ней описания и нету.
Может можно гдето скачать хотябы английский мануал?
Качал последнюю справку с офф. сайта »
Это не последняя версия справки (разве что если на русском).
Я говорил про справку в составе с AutoIt'ом (в последней версии).
morgan1991
05-11-2008, 18:57
Может можно гдето скачать хотябы английский мануал? »
Просто у меня нетвозможности ставить последнюю версию Autoit?
нетвозможности ставить последнюю версию Autoit »
Её не обязательно ставить, можно распаковать установщик тем же винраром и вытащить отдельно файл справки ;) (в крайнем случае 7zip'ом).
$InstallPath=@ProgramFilesDir & "\MediaStudio"
; Проверка установленной программы, собсно это и хочется закоментировать и пойти другим путём.
If FileExists(@ProgramFilesDir & "\Ulead Systems\Ulead MediaStudio Pro 8.0\veditor.exe") Then Exit
; Тута не скажу что ставиться, секрет ;-
ShellExecute("****.exe", "/verysilent", "$ScriptDir")
Blockinput(1)
Run("Ulead MediaStudio Pro 8.0.exe")
WinWaitActive("", "Welcome")
ControlClick("", "", "[Class:Button; Instance:1]", "left", 1)
WinWaitActive("", "License Agreement")
ControlClick("", "", "[Class:Button; Instance:2]", "left", 1)
WinWaitActive("", "Choose Destination Location")
ControlClick("", "", "[Class:Button; Instance:3]", "left", 1)
Send($InstallPath)
Sleep(800)
ControlClick("", "", "[Class:Button; Instance:1]", "left", 1)
Sleep(800)
ControlClick("", "", "[Class:Button; Instance:1]", "left", 1)
Sleep(800)
Send("{BS 32}")
Send($InstallPath & "\Preview")
Sleep(800)
ControlClick("", "", "[Class:Button; Instance:3]", "left", 1)
Sleep(800)
ControlClick("", "", "[Class:Button; Instance:6]", "left", 1)
Sleep(200)
ControlClick("", "", "[Class:Button; Instance:9]", "left", 1)
Sleep(800)
ControlClick("", "", "[Class:Button; Instance:2]", "left", 1)
Sleep(800)
ControlClick("", "", "[Class:Button; Instance:1]", "left", 1)
WinWaitActive("", "InstallShield Wizard Complete")
ControlClick("", "", "[Class:Button; Instance:4]", "left", 1)
Blockinput(0)
Вопросы:
1. Если установленна уже была программа, то при повторной установке откроется MsgBox с заголовком
"Uninstall blah-blah?" и двумя(ми) кнопкоми Yes, No. Довольно частая ситуация, хотелось бы какой нибудь
код предпринять, чтоб напр. Uninstall нажать. Но я не знаю что в If Then... EndIf вписать, подскажите?
Я пробовал так
Run("Ulead MediaStudio Pro 8.0.exe")
If
WinWaitActive("Uninstall", "") = 0 Then
....
else
ControlClick("", "", "[Class:Button; Instance:4]", "left", 1)
EndIf
не получается...
Как кстати указать чтоб все ошибки репортировались? Потому что в данном случае ошибки были, но молча было :)
2. Что меня удивило тут, то что Sleep действительно нужен! Иначе в многих местах не срабатывает и появляются пропуски... Но почему? Приложение большое - 128 мег, может от этого? Или тут какие-то спецэффекты в окнах. Я помню Sleep не использовал раньше вообще, или лучше всегда и везде так подстраховывать? Хотя я думаю лучше "быстрее" установить чем во время Sleep какоенить посторонее окно может выскочить? :)
3. Как правильно очищать поле ввода [C:\Program Fils\MyApp] ? Его бы выделить сначала, для уверенности,
но как-то всё коряво получается, того и гляди слетит.... Всё что у меня ума хватило это вбивать Send("{BS 32}")
Но зафокусировать поле ввода вообще не знаю как. ? Пожалуста отвечайте кодом, ато я в хелпе потеряюсь совсем...
morgan1991
05-11-2008, 22:08
semiono, я тоже както маялся над этим вопросом, вот решение, только не факт что оно комуто покажется хорошим, я в Autoit ещё не мастер:
Global $InstallPath=@ProgramFilesDir & "\MediaStudio"
Blockinput(1)
; Тута не скажу что ставиться, секрет ;-
ShellExecute("****.exe", "/verysilent", "$ScriptDir")
Run("Ulead MediaStudio Pro 8.0.exe")
While 1 = 1
$i = $i - 1
$install = WinWaitActive("", "Welcome", 1)
$deinstall = WinWaitActive("deinstall", "text", 1)
If $install = 1 Then install()
If $deinstall = 1 Then deinstall()
If $i = 1 Then MsgBox(16, "", "error")
WEnd
Func deinstall()
;Удаление проги
EndFunc
Func install()
ControlClick("", "", "[Class:Button; Instance:1]", "left", 1)
WinWaitActive("", "License Agreement")
ControlClick("", "", "[Class:Button; Instance:2]", "left", 1)
WinWaitActive("", "Choose Destination Location")
ControlClick("", "", "[Class:Button; Instance:3]", "left", 1)
Send($InstallPath)
Sleep(800)
ControlClick("", "", "[Class:Button; Instance:1]", "left", 1)
Sleep(800)
ControlClick("", "", "[Class:Button; Instance:1]", "left", 1)
Sleep(800)
Send("{BS 32}")
Send($InstallPath & "\Preview")
Sleep(800)
ControlClick("", "", "[Class:Button; Instance:3]", "left", 1)
Sleep(800)
ControlClick("", "", "[Class:Button; Instance:6]", "left", 1)
Sleep(200)
ControlClick("", "", "[Class:Button; Instance:9]", "left", 1)
Sleep(800)
ControlClick("", "", "[Class:Button; Instance:2]", "left", 1)
Sleep(800)
ControlClick("", "", "[Class:Button; Instance:1]", "left", 1)
WinWaitActive("", "InstallShield Wizard Complete")
ControlClick("", "", "[Class:Button; Instance:4]", "left", 1)
EndFunc
Blockinput(0)
Не забудь тыкнуть спасибо
можно распаковать установщик тем же винраром и вытащить отдельно файл справки (в крайнем случае 7zip'ом) »
Не хочет ни тот ни другой распаковывать говорит это не архив(((
А что надо распаковать? AutoIt? unattended.org.ua/unattended_soft/winrar/скачать_uniextract-1600 у меня распаковывает.
AutoIt3.chm v3.2.12.1: slil.ru/26305991
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.