Войти

Показать полную графическую версию : [Архив - Часть 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
15-01-2007, 18:55
Никак не могу разобраться со всем что связанно с кодировками...

При проверке на существование файла, если проверяемы путь в кодировке UTF-8, и содержит кериллицу (русские буквы), то файл не найден, перекодировать то можно, но что делать если заранее не известно какая будет кодировка (путь к примеру берётся из файла конфигурации)?

Можно ли написать функцию, которая будет определять кодировку строки?

А таже проблема с отображением кодировки в гуи, если язык в системе не русский и не английски, то ни одна функция не помагает нормально отобразить кириллицу. Есть функция _Utf8ToAnsi() (от amel27), но она тут не помагает (помагает если системный язык русский), есть также функция StringToUTF(), и она тоже не помагает... как сделать уникальное отображение кириллицы в гуи, чтобы на любом языке (установленном в системе), нормально всё отображалось?

i_mihal
15-01-2007, 20:41
написал скрипт на AutoIt для установки Office 2000.
серийник там в SETUP.INI никак не задается,
поэтому серийный номер ввожу вот так:

Send('FXWX9QCJ4FGHCRYH9Y8FXQP6G')

но срабатывает это далеко не всегда. есть две проблемы:

1) если в винде язык по умолчанию - русский, то вместо латинских букв
скрипт вводит в поле ввода русские: АЧЦЧ9 ЙСО4А итд, то есть
те русские буквы, которые написаны на соответствующих клавишах.
2) иногда что-то протормаживает и вообще вводится мешанина из букв,
как будто из этой строки Send('FXWX9QCJ4FGHCRYH9Y8FXQP6G')
выбрали 7-9 букв, через каждые 2-3 буквы и разбавили их буквой "Ж",
которой вообще по-идее там быть не может, ведь она соответствует
на клавиатуре знаку ";"

сейчас попробую сделать ввод серийника с помощью ControlSetText,
но мне непонятно, почему так странно работает 'Send' если язык в винде
по умолчанию задан русский? может подскажет кто-нибудь?

спасибо.

p.s. с помощью 'ControlSetText' вроде получилось, хотя учитывая непонятность
работы 'Send' нет уверенности, что все и всегда будет работать корректно :(
пока работает...

Diamond
15-01-2007, 21:34
i_mihal
Да, есть такая проблема... Я её решаю с помощью вставки из буфера обмена:
ClipPut("FXWX9QCJ4FGHCRYH9Y8FXQP6G")
Send("^м")
почему так странно работает 'Send'Вопрос, скорее всего, относиться к разработчикам AutoIt. :not-me:

Всем:
Оказывается, с помощью WinApi можно проделывать интересные манипуляции с окнами...
Анимация окон GUI, с помощью WinApi
Использование:
DllCall("User32.dll","long","AnimateWindow","hwnd",Идентификатор окна,"long",Продолжительность в миллисекундах,"long",Эффект)
Эффекты:
Эффекты имеет смысл задавать в качестве констант: Const $AW_ACTIVATE = 0x20000
AW_ACTIVATE = 0x20000 (Активирует окно, конфликтует с AW_HIDE)
AW_BLEND = 0x80000 (Постепенное исчезновение-появление)
AW_CENTER = 0x10 (Разворачивает окно из центра)
AW_HOR_POSITIVE = 0x1 (Слева направо)
AW_HOR_NEGATIVE = 0x2 (Справа налево)
AW_SLIDE = 0x40000 (Прокрутка)
AW_VER_POSITIVE = 0x4 (Сверху в низ)
AW_VER_NEGATIVE = 0x8 (Снизу в верх)
AW_HIDE = 0x10000 (Скрывает окно)
Эффекты по умолчанию ориентированны на появление окна, для скрытия окна используйте их совместно с AW_HIDE.
Можно получить интересные результаты комбинируя эффекты между собой. Например: 0x4 + 0x1 (анимация по диагонали)

Рабочий пример:

#include <Guiconstants.au3>
Opt("GUIOnEventMode",1)
$test=GUICreate("WinApi_test",400,300)
GUISetOnEvent($GUI_EVENT_CLOSE,"ExitGui")
DllCall("User32.dll","long","AnimateWindow","hwnd",$test,"long",700,"long",0x8+0x40000)
GUISetState()

While 1
Sleep(100)
WEnd

Func ExitGui()
DllCall("User32.dll","long","AnimateWindow","hwnd",$test,"long",500,"long",0x10+0x10000)
Exit
EndFunc

Creat0R
15-01-2007, 23:04
i_mihal
ControlCommand вроде будет всегда срабатывать:

ControlCommand("Title", "", "Edit1", "EditPaste", "FXWX9QCJ4FGHCRYH9Y8FXQP6G")

На счёт Send(), решение для смены раскладки клавиатуры вроде есть в Faq (http://oszone.net/display.php?id=3663)'е (см. “Как с помощью AutoIt сменить раскладку клавиатуры”)

Diamond

Красиво! :UP: но рамка всего гуи как бы нарисованна, т.е углы не округлённые как должны быть в XP, даже немного затемнённые, это можно поправить?

P.S
Я её решаю с помощью вставки из буфера обмена
Это тоже не всегда надёжно, буфер обмена может неправильно отдавать текст (при вставке в него текста Аутоитом).

Creat0R
15-01-2007, 23:42
:yahoo:
Оказывается, возможно привязать функцию _MsgBox() (от amel27), и любое окно гуи к другому окну (не обязательно к гуи)....

На мысль меня навёл пример из Faq'а о переключении раскладки клавиатуры (а именно, пременная $hWnd):



Opt("WinTitleMatchMode", 4)
Run("notepad.exe")
$NotPadTitle = "classname=Notepad"

WinWait($NotPadTitle, "", 5)
$hWnd = WinGetHandle($NotPadTitle)

WinSetState($NotPadTitle, "", @SW_DISABLE)
GuiCreate("Attach To Window Gui", 300, 400, -1, -1, -1, -1, $hWnd)
GuiSetState()

$Msg = 0
While $Msg <> -3
$Msg = GuiGetMsg()
Sleep(10)
Wend

WinSetState($NotPadTitle, "", @SW_ENABLE)

Diamond
16-01-2007, 01:25
Creat0R
углы не округлённые как должны быть в XPЯ тоже заметил этот дефект. Честно говоря, не знаю... :sorry: Других вариантов или комбинаций для "AnimateWindow" пока найти не удалось. Разве что попытаться использовать другие стили окна... Во ещё что: Если окно имеет тень, анимация может происходить "рывками".
буфер обмена может неправильно отдавать текст (при вставке в него текста Аутоитом)Наверное имелось ввиду: "буфер обмена может неправильно принимать текст"? Насколько неправильно? При копировании-вставке обычного текста, у меня ошибок пока не случалось...
Спасибо, приму к сведению. :)

Creat0R
16-01-2007, 03:24
Diamond
Разве что попытаться использовать другие стили окна
Перепробовал почти все, один только справляется почти нормально с задачей - $WS_EX_TOOLWINDOW - но как известно, это не совсем обычное окно ;) - но всё же неплохая вещь которую ты привёл в студию :) спасибо!

Наверное имелось ввиду: "буфер обмена может неправильно принимать текст"?
Скорее так.

Насколько неправильно?
Ну возьмём к примеру кириллицу из ком. строки...

Вставляем так:

ClipPut($CmdLine[1])

Если Ком. строка содержит кириллицу, то когда пытаемся куда то вставить текст из буфера обмена, то уже вставляется в неверном формате... кстати я даже не знаю как перекодировать его, кто знает плиз подскажите, давно хотел узнать :blush2:

Т.е вот к примеру если такой скрипт закомпилировать:

ClipPut($CmdLine[1])
MsgBox(0, "", ClipGet())

А потом запустить его к примеру из батника так:

Start ClipTest.exe тест

То в сообщении мы увидим ЄхёЄ (крякозябры) :)

Creat0R
16-01-2007, 03:55
Ещё один способ получить список существующих дисков на компьютере:


$Drives = ""
For $iDrv = 65 to 90
If DriveGetType(Chr($iDrv) & ":\") <> "" Then $Drives = $Drives & @CR & Chr($iDrv) & ":\"
Next
MsgBox(262144+64, "Existing Drives List", $Drives)

VelDmi
16-01-2007, 18:22
Creat0R
Оказывается, возможно привязать функцию _MsgBox() (от amel27)
Где эту функцию взять?

Diamond
16-01-2007, 21:37
Creat0R
всё же неплохая вещь которую ты привёл в студиюСпасибо. Мне тоже очень понравилось. :)
Если Ком. строка содержит кириллицуЧерез командную строку проблема решается так:
graftabl 1251 | echo %username%>MyName.txt
Хотя конкретно для твоего случая это не сработает. При создании пакетного Файла возьми за привычку конвертировать текст в Dos(oem), например c помощью текстового редактора: BRED - хороший заменитель блокнота, или любой другой доступный редактор который умеет работать с кодировками, в самом крайнем случае открываешь пакетный файл в WordPad ( > Сохранить как > Текстовой документ MS-DOS), а затем меняешь расширение на *.bat

Diamond
16-01-2007, 23:09
Creat0R
Ещё один способ получить список существующих дисков на компьютере:
Интересный вариант! Как-то мне пришлось использовать перебор A-Z, но только в пакетном файле, поскольку другой альтернативы в батниках просто нет.
Вот ещё один способ, сделано через VBScript
#CS
тип ресурса:
0 - неизвестное устройство
1 - устройство со сменным носителем.
2 - жёсткий диск.
3 - сетевой диск.
4 - CD-ROM.
5 - RAM-диск.
#CE

Dim $fso, $d, $dc, $s
$fso = ObjCreate("Scripting.FileSystemObject")
$dc = $fso.Drives
For $d In $dc
If $d.DriveType = "2" Then
$s = $s & $d.DriveLetter & ": "
EndIf
Next
MsgBox(0,"",$s)

Creat0R
17-01-2007, 04:05
VelDmi
Где эту функцию взять?

Вот:


Func _MsgBox ($mainGUI, $MsgBoxTitle, $MsgBoxText, $MsgBoxType)
$ret = DllCall ("user32.dll", "int", "MessageBox", _
"hwnd", $mainGUI, _
"str", $MsgBoxText , _
"str", $MsgBoxTitle, _
"int", $MsgBoxType)
Return $ret [0]
EndFunc



В первом параметре задаётся идентификатор гуи (как выяснилось можно и от WinGetHandle), во втором заголовок, в следующем текст, и в последнем тип (иконка, кол-во кнопок и т.д.)...

Вот рабочий пример с этой функцией:


Opt("WinTitleMatchMode", 4)
Run("notepad.exe")
$NotPadTitle = "classname=Notepad"

WinWait($NotPadTitle, "", 5)
$hWnd = WinGetHandle($NotPadTitle)

_MsgBox($hWnd, "Attached MsgBox to Notepad", "I am attached to notepad, you must close me before continue work in notepad ;-)", 64)

Func _MsgBox($mainGUI, $MsgBoxTitle, $MsgBoxText, $MsgBoxType)
$ret = DllCall ("user32.dll", "int", "MessageBox", _
"hwnd", $mainGUI, _
"str", $MsgBoxText , _
"str", $MsgBoxTitle, _
"int", $MsgBoxType)
Return $ret [0]
EndFunc



P.S.
Я когда то писал:

надеюсь что когда нибудь и с этим делом вяснится что мы ошибаемся
Так и выяснилось! :)


Diamond
При создании пакетного Файла
Я только для примера привёл запуск с пакетника :) - это происходит не только с батника, например, в браузере Opera, если выделить текст, и запустить программу (из меню) с параметром %T (идентификатор выделенного текста в браузере), то содержащий кириллицу текст будет также криво помещён в буфер обмена. Очень хотелось бы это решить, но я уже многое перепробовал, и решения так и не нашл :(

VelDmi
17-01-2007, 08:33
Creat0Rто содержащий кириллицу текст будет также криво помещён в буфер обмена.
Если не ошибаюсь, предварительно нужно переключить раскладку клавиатуры на русский, тогда будет помещен нормально.

mpn
17-01-2007, 09:49
Народ!
Я повторяюсь, но очень интересует ответ на простой вопрос: у кого нибудь выполняется корректно строка $f=Run("telnet","",@SW_MAXIMIZE,3) ? У меня, если ее выполнить без последнего параметра, открывается окно telnet, в противном случае процесс закрывается через 0,5 сек после запуска. AutoIt v.3.2.0.1.

Dicken
17-01-2007, 10:40
процесс закрывается через 0,5 сек после запуска. AutoIt v.3.2.0.1.
нет неработает!

Diamond
17-01-2007, 12:51
Creat0R
Пробовал через WinApi - kernel32.dll там вроде бы должна быть нужная функция... В общем совсем запутался - ничего не получается. :(
Если у тебя проблемы только с Dos-кодировкой, то можно побить кракозябру её же собственным оружием.
$ret="ЄхёЄ"
MsgBox(0,"",OEM_Decode($ret))

Func OEM_Decode($string)
$foo = Run(@ComSpec & " /c @echo " & $ret,"", @SW_HIDE, 2)
$line = StdoutRead($foo)
Return $line
EndFunc

Creat0R
17-01-2007, 14:22
Diamond
можно побить кракозябру её же собственным оружием
Оригинально! :victory: Спасибо.

По поводу режима чтения из консоли (StdoutRead), если я ставлю 2 как последний параметр у команды Run, влияет ли это на то как будут выполняться команды ком. строки? т.е на что вообще это повлияет (кроме как на возможность чтения изх консоли)?

Diamond
17-01-2007, 20:48
Creat0R
Эта Функция в её текущем виде не предназначена для чтения из консоли, она задумана мной только для преобразования искажённого текста.
Т.е я заставляю консоль испортить кирилический текст, как она это делает обычно, но только в нужную нам сторону. Но если ты хочешь использовать StdoutRead() непосредственно по назначению, т.е для чтения стандартного потока из консоли...

Пример кода был взят из справки AutoIt v 3.2.2.0
$STDOUT_CHILD = 2 Необходима для получения StdoutRead() в первом цикле
$STDERR_CHILD = 4 Необходима для получения StderrRead() во втором цикле
Имена констант очевидно говорят об их предназначении (см. справка: StdoutRead и StderrRead)
Константы влияют только на возможность чтения потока из консоли. При этом возможность сохраняется до тех пор, пока ты делаешь запросы StdoutRead(), вплоть до закрытия самой консоли.

; Demonstrates StdoutRead()
#include <Constants.au3>

$foo = Run(@ComSpec & " /c dir foo.bar", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)

While 1
$line = StdoutRead($foo)
If @error Then ExitLoop
MsgBox(0, "STDOUT read:", $line)
Wend

While 1
$line = StderrRead($foo)
If @error Then ExitLoop
;MsgBox(0, "STDERR read:", $line)
Wend

MsgBox(0, "Debug", "Exiting...")

Понятно, что разработчики при написании справки не подумали о нас русских и, как следствие, о существовании кирилицы.
Исправляем этот недостаток заменой первой строки в коде:

$foo = Run(@ComSpec & " /c graftabl 1251 | dir foo.bar", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)

Creat0R
17-01-2007, 21:12
Как можно изменить функцию _ChooseColor(), чтобы можно было прикрепить окно выбора цвета к гуи?
Я пробовал в DllCall добавить параметр ..."hwnd", $Gui...., но функция ругается на сбой в скрипте и не хочет запускаться :( - возможно ли это как то решить?

Diamond
Эта Функция в её текущем виде не предназначена для чтения из консоли
Я вкурсе :) , пример из справки я уже иследовал, поэтому и появился вопрос, влияет ли запуск ком. строки в режиме чтения, на выполнение команд ком. строки (без всякой связи с кириллицей, это был не касающийся этого вопрос).

Diamond
18-01-2007, 01:14
Три способа определить - является ли файл папкой:
P.S.
Возможно, для многих это не новость, и всё-таки...
;~ Путём получения атрибутов
;~ Возвращает положительное число если папка существует, иначе 0
Func FolderExist($name)
$Folder=StringInStr(FileGetAttrib($name),"D")
Return $Folder
EndFunc

;~ С помощью файла "nul" присутствующего в каждой папке
;~ Возвращает 1 если папка существует, иначе 0
Func _FolderExist($name)
$Folder=FileExists($name & "\nul")
Return $Folder
EndFunc

;~ С помощью функции VBScript
;~ Возвращает 1 если папка существует, иначе 0
Func VbFolderExist($name)
$fso=ObjCreate("scripting.filesystemobject")
$Folder=Abs($fso.FolderExists($name))
Return $Folder
EndFunc
Creat0R
без всякой связи с кириллицей, это был не касающийся этого вопросВ любом случае, исправленный код может оказаться полезным и для других участников форума. :)
А всё-таки кракозябры были не связаны с буфером обмена или AutoIt. :no: А то, я уж чуть было не усомнился в эфективности способа который я предложил i_mihal :tomato:




© OSzone.net 2001-2012