Войти

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

Maza Faka
08-08-2007, 16:41
spooll
У тебя ошибка в синтаксисе функции "$ret=WinWaitActive("Создание нового каталога", 20)"

Если нужно указать опциональный параметр, то все его предшественники должны быть тоже указаны!

WinWaitActive("Создание нового каталога", "", 20)

Не проще ли проверять так:

If WinWaitActive("Создание нового каталога", "", 20) Then
Send("{ENTER}")
Else
BlockInput(0)
Return
EndIf

spooll
08-08-2007, 17:30
Maza Faka,
лично у меня не пашет вот эта строка
$ret=WinWaitActive("Выбор программной группы", "&Папки с Программами:", 10)
If $ret Then
Send("{ENTER}")
Else
BlockInput(0)
Return ; Выход из функции
EndIf


If WinWaitActive("Создание нового каталога", "", 20) Then Send("{ENTER}") Else
всеравно не работает, окно просто "зависает". :(

Diamond
08-08-2007, 23:06
spooll
всеравно не работает, окно просто "зависает".
Возможно, Send("{ENTER}") попадает не по "адресу"...
Лично я бы использовал только WinWait() и ControlClick(). Во-первых, при этом отпадает необходимость в BlockInput(), во-вторых, ControlClick() обращается непосредственно к элементу(кнопке), поэтому вероятность ошибки здесь минимальна.

Creat0R
08-08-2007, 23:10
amel27
достаточно вернуть версию "comctl32.dll"
Т.е вот так?:

Round(FileGetVersion(@SystemDir & "\system32\comctl32.dll"), 1)

- есть возможность фильтрации отображаемых элементов
Т.е можно будет к примеру задавать отображение содержимого одного конкретного каталога (с определёнными именами папок/файлов) ? это было бы вообще супер!

т.к. нужно создавать свой COM-объект
ptrex (тоже один из "великих умов" оф форума :biggrin: ) вроде на эту тему что то делал тут (http://www.autoitscript.com/forum/index.php?showtopic=38671&hl=COM++Object), утверждает что можно всё же собственные обьекты создавать на Аутоите.

интересно, зачем?
Нужно для изменения формата в диалоге сохранения страницы браузера (Opera), т.е окно естественно не аутоитовское :).
логично предположить, что в comdlg32.dll
А как с него вытянуть это? :dont-know

Я пока остановился на таком решении:

Opt("WinTitleMatchMode", 4)
$Title = WinGetTitle("classname=#32770", "FolderView")

Можешь плиз потвердить, возвращает ли оно у тебя правильный заголовок с окна сохранения (любой программы)?

spooll,
Во-первых для ручного отключения BlockInput() не нужно жать ресет, нужно вызвать сочетания клавиш Ctrl Alt Del ;)

Во-вторых, зачем тебе постоянно ждать активность окна? можно просто ждать появление окна (WinWait()).

Везде поставил время WinWaitActive 20, но всеравно виснет
Потому что окно не активируется....

Вот пример как ты можешь это сделать:



;Предотвращаем вылет скрипта в случае не удачного запуска программ
Opt("RunErrorsFatal", 0)

If FileExists("C:\Program Files\1Cv77\BIN\1CV7s.exe") Then Exit

BlockInput(1)

Run("\\192.168.11.198\Distrib\1s_install\B770023\Disk1\setup.exe")
If @error Then Quit()

WinWait("Добро пожаловать", "Добро пожаловать в программу установки", 20)
ControlClick("Добро пожаловать", "Добро пожаловать в программу установки", "Button")

WinWait("Выбор варианта установки", "Выберите вариант установки программы", 20)
ControlClick("Выбор варианта установки", "Выберите вариант установки программы", "Button")

WinWait("Информация о пользователе", "Введите Ваше имя и название", 20)
ControlClick("Информация о пользователе", "Введите Ваше имя и название", "Button")

WinWait("Информация о пользователе", "Вы сообщили следующую информацию", 20)
ControlClick("Информация о пользователе", "Вы сообщили следующую информацию", "Button")

WinWait("Выбор каталога для установки", "Программа установки поместит 1С", 20)
ControlClick("Выбор каталога для установки", "Программа установки поместит 1С", "Button")

WinWait("Создание нового каталога", "", 20)
ControlClick("Создание нового каталога", "", "Button")

WinWait("Выбор программной группы", "Выберите из существующих или", 20)
ControlClick("Выбор программной группы", "", "Button")

WinWait("Установка 1С:Предприятия", "Программа установки скопировала файлы", 20)
ControlClick("Установка 1С:Предприятия", "Программа установки скопировала файлы", "Button")

WinWait("Установка 1С:Предприятия", "Установка программы 1С", 20)
ControlClick("Установка 1С:Предприятия", "Установка программы 1С", "Button")

Run("\\192.168.11.198\Distrib\1s_install\B770025\Disk1\setup.exe")
If @error Then Quit()

WinWait("Добро пожаловать", "Добро пожаловать в программу установки", 20)
ControlClick("Добро пожаловать", "Добро пожаловать в программу установки", "Button")

WinWait("Список установленных программ", "Из списка найденных на данном компьютере", 20)
ControlClick("Список установленных программ", "Из списка найденных на данном компьютере", "Button")

WinWait("Обновление 1С:Предприятия", "При работе с сетевыми версиями", 20)
ControlClick("Обновление 1С:Предприятия", "При работе с сетевыми версиями", "Button")

WinWait("Обновление 1С:Предприятия", "Обновление программы 1С", 20)
ControlClick("Обновление 1С:Предприятия", "Обновление программы 1С", "Button")

Run("\\192.168.11.198\Distrib\1s_install\B770025\1C_patch_7725\1Cv77SQL_025_Patch.exe")
If @error Then Quit()

WinWait("Патч 1С:Предприятие 7.7.025", "Вы запустили программу", 20)
ControlClick("Патч 1С:Предприятие 7.7.025", "Вы запустили программу", "Button1")

WinWait("PatchWise Updater", "", 20)
ControlClick("PatchWise Updater", "", "Button")

ControlClick("Патч 1С:Предприятие 7.7.025", "Вы запустили программу", "Button2")

Quit()

Func Quit()
BlockInput(0)
Exit
EndFunc




Везде где в функции ControlClick встречается "Button", замени на настоящее имя контроля (используя утилиту Au3Info.exe).

Creat0R
08-08-2007, 23:27
Maza Faka,
если прописаны пути к mp3-файлам которые находятся в другом каталоге, то не проигрываются, как я понял, игнорируются пути, почему?
Пути не игнорируются...

Дело в том, что многие плейлисты содержат пути относительно корню диска, т.е типа такого:

\My Music\Vechnoya Moladast.mp3

Если скрипт лежит к примеру в папке C:\test, и файл находится по этому пути: C:\My Music\Vechnoya Moladast.mp3, то считав тот относительный путь файл будет проирываться.

Я у себя в плеере для этого сделал поддержку глобальных путей, при каждой попытке проиграть файл, проверяются все пути (записанные в массив при открытии плейлиста и проигрывании файла), в первую очередь естественно проверяется корень диска, затем по очереди все остальные пути, в которых кстати включён рабочий каталог (потому как он задаётся авоматом функцией FileOpenDialog) и каталог в котором находится сам скрипт.

Creat0R
08-08-2007, 23:59
VelDmi,
при любом шевелении мышкой или клавиатурой монитор включается!
Можно попробовать это обойти проверокой на ввод пользователя:


#NoTrayIcon

Opt("WinTitleMatchMode", 4)

Global $MonitorIsOff = False

HotKeySet("{F11}", "Monitor_Off")
HotKeySet("{F10}", "Monitor_On")
HotKeySet("{Esc}", "Quit")

While 1
Sleep(10)
WEnd

Func Quit()
Monitor_On()
Exit
EndFunc

Func Monitor_On()
Local $hwnd = WinGetHandle('classname=Progman')
DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', $hwnd, 'int', 274, 'int', 61808, 'int', -1)
$MonitorIsOff = False
EndFunc

Func Monitor_Off()
$MonitorIsOff = True
Local $hwnd = WinGetHandle('classname=Progman')

While $MonitorIsOff = True
DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', $hwnd, 'int', 274, 'int', 61808, 'int', 2)
Sleep(10)
_IdleWaitCommit(0)
WEnd
EndFunc

Func _IdleWaitCommit($idlesec)
Local $iSave, $LastInputInfo = DllStructCreate ("uint;dword")
DllStructSetData ($LastInputInfo, 1, DllStructGetSize ($LastInputInfo))
DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
Do
$iSave = DllStructGetData ($LastInputInfo, 2)
Sleep(100)
DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
Until (DllStructGetData ($LastInputInfo, 2)-$iSave) > $idlesec Or $MonitorIsOff = False
Return DllStructGetData ($LastInputInfo, 2)-$iSave
EndFunc


Просто по запуску скрипта нажми F11, монитор выключится, при каждом вводе (м клавиатуры или мышки) монитор будет отключаться по новой, для включения монитора нужно нажать F10, для полного выхода со скрипта ESC.
При этом любые сочетания клавиш действуют как обычно.

Это конечно не то что требуется, наверняка(?) можно полностью выключить монитор, но это тоже решение ;)

Creat0R
09-08-2007, 04:57
Накалякал тут функцию для конвертирования даты и времени в настойщий фрмат, но может это возможно сделать более укророченным путём?, а главное, чтобвы срабатывало быстрее:


$FullDateTime = _DateTimeConvertFormat("DD/MM/YYYY, HH:MM:SS")
MsgBox(64, "Date/Time Convert Results", $FullDateTime)

Func _DateTimeConvertFormat($sFormat)
Local $RetDateTime
Local $Year_Raw = @YEAR
Local $Year_Part = StringRight($Year_Raw, 2)

Local $Mounth_Raw = @MON
Local $Mounth_Part = StringRight($Mounth_Raw, 1)
If $Mounth_Raw > 9 Then $Mounth_Part = $Mounth_Raw

Local $Day_Raw = @MDAY
Local $Day_Part = StringRight($Day_Raw, 1)
If $Day_Raw > 9 Then $Day_Part = $Day_Raw

Local $Hours_Raw = @HOUR
Local $Hours_Part = StringRight($Hours_Raw, 1)
If $Hours_Raw > 9 Then $Hours_Part = $Hours_Raw

Local $Minutes_Raw = @MIN
Local $Minutes_Part = StringRight($Minutes_Raw, 1)
If $Minutes_Raw > 9 Then $Minutes_Part = $Minutes_Raw

Local $Seconds_Raw = @SEC
Local $Seconds_Part = StringRight($Seconds_Raw, 1)
If $Seconds_Raw > 9 Then $Seconds_Part = $Seconds_Raw

$RetDateTime = StringReplace($sFormat, "yyyy", $Year_Raw)
$RetDateTime = StringRegExpReplace($RetDateTime, "(?i)y+", $Year_Part)

$RetDateTime = StringReplace($RetDateTime, "mm", $Mounth_Raw)
$RetDateTime = StringReplace($RetDateTime, "m", $Mounth_Part)

$RetDateTime = StringReplace($RetDateTime, "dd", $Day_Raw)
$RetDateTime = StringReplace($RetDateTime, "d", $Day_Part)

$RetDateTime = StringReplace($RetDateTime, "hh", $Hours_Raw)
$RetDateTime = StringReplace($RetDateTime, "h", $Hours_Part)

$RetDateTime = StringReplace($RetDateTime, "mm", $Minutes_Raw)
$RetDateTime = StringReplace($RetDateTime, "m", $Minutes_Part)

$RetDateTime = StringReplace($RetDateTime, "ss", $Seconds_Raw)
$RetDateTime = StringReplace($RetDateTime, "s", $Seconds_Part)

Return $RetDateTime
EndFunc


Или может уже есть подобная функция? :unsure:

amel27
09-08-2007, 08:23
VelDmi
Хочется управлять винампом горячими клавишами клавиатуры не включая монитор
немного погуглив сделал вывод, что для блокировки включения монитора без вызовов недокументированных функций ядра не обойтись.... Впрочем, если в монитор встроена защита от дурака (щас вроде все такие) аналогичного эффекта можно добиться переводом его в нестандартный режим (по частоте или по разрешению) - это можно сделать AutoIT-ом.


Creat0R
Т.е вот так?угу, только "system32" лишний ;)
ptrex (тоже один из "великих умов" оф форума ) вроде на эту тему что то делал тут, утверждает что можно всё же собственные обьекты создавать на Аутоитедык енто как раз WSH-метод, как минимум потребуется дополнительный WSF-файл, описывающий объект, а кстати - как ты предполагаешь настраивать фильтр - через RegExp-выражение?... ведь прежде чем ваять компоненту нужно утвердить интерфейс ;)
Можешь плиз потвердить, возвращает ли оно у тебя правильный заголовок с окна сохранения (любой программы)?твой вариант работает лучше чем импорт системного заголовка, так как приложение может его подменять - к примеру SciTE имеет "Save As" даже на русской Windows... хотя насчет "любой программы" ты загнул - MS Office на этот случай имеет свои окна. :)
Накалякал тут функцию для конвертирования даты и времени в настойщий фрмату тебя в скрипте ошибка - минуты и месяцы имеют одинаковое обозначение, соответственно вместо минут пробивается месяц, имхо выхода два: либо делать отдельные функции для даты и времени, либо вводить свою кодировку.

VlhOwn
09-08-2007, 08:52
Написан скрипт автоматической установки ПО. При обычном запуске все работает отлично. При включении этого скрипта во входной скрипт подключения к домену он начинает работать, скачивает необходимые файлы, распаковывает, запускает, но затем появляется окно мастера установки, и инструкции ControlClick не отрабатываются, хотя на обычное нажатие кнопок реагирует адекватно.
Предполагаю, что это может быть связано с тем, что входной скрипт отрабатывается в фоновом режиме, но решения придумать не могу.

Creat0R
09-08-2007, 09:05
amel27, только "system32" лишний
Упс... забыл что @SystemDir это и есть C:\Windows\System32 :shuffle:

как ты предполагаешь настраивать фильтр - через RegExp-выражение?
Без понятия если честно, я просто от восторга данной возможности вообразил приимущества :clever-ma

к примеру SciTE имеет "Save As"
он имеет “Save file” ;)

хотя насчет "любой программы" ты загнул - MS Office на этот случай имеет свои окна
И вправду, но для этого случая можно использовать такой метод:

Opt("WinTitleMatchMode", 4)
$Title = WinGetTitle("classname=#32770", "FolderView")
If $Title = 0 Then $Title = WinGetTitle("classname=bosa_sdm_Microsoft Office Word 11.0", "FolderView")

ConsoleWrite($Title)

Вот жалко что нельзя(?) совмещать classname с regexp, типа такого:

Opt("WinTitleMatchMode", 4)
$Title = WinGetTitle("classname+regexp=bosa_sdm(.*)", "FolderView")


Просто не во всех приложениях офиса одинаковые класы, в Word к примеру bosa_sdm_Microsoft Office Word 11.0, но почти во всех есть это: bosa_sdm - тогда можно было бы просто по RegExp подобрать класс.... нужно бы запостить в Feature Request на оф. форум :).

у тебя в скрипте ошибка - минуты и месяцы имеют одинаковое обозначение
Точно, увлёкся... Спасибо.

имхо выхода два: либо делать отдельные функции для даты и времени, либо вводить свою кодировку.
Свою кодировку? это как? :unsure:

А по поводу двух функции, не обязательно:

$RetDateTime = StringReplace($RetDateTime, "mm", $Mounth_Raw, 1)
;$RetDateTime = StringReplace($RetDateTime, "m", $Mounth_Part)

Правда в этом случае формат месяца может быть передан только как MM.

VelDmi
09-08-2007, 09:50
Creat0R, Это конечно не то что требуется, >>>
Ну почему же, идея отличная, ведь мы будем знать нажатую клавишу! Кстати, в какой переменной она хранится?
Жаль только у меня код не работает. Монитор выключается и тут же включается. Я сделал следующим образом и это работает:

Opt("WinTitleMatchMode", 4)

HotKeySet("{F11}", "Monitor_Off")
HotKeySet("{F10}", "Monitor_On")

$Monitor = 'On'

While 1
Sleep(100)
If $Monitor = 'On' Then
Local $hwnd = WinGetHandle('classname=Progman')
DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', $hwnd, 'int', 274, 'int', 61808, 'int', -1)
EndIf
If $Monitor = 'Off' Then
Local $hwnd = WinGetHandle('classname=Progman')
Sleep(100)
DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', $hwnd, 'int', 274, 'int', 61808, 'int', 2)
EndIf
WEnd

Func Quit()
Monitor_On()
Exit
EndFunc

Func Monitor_On()
$Monitor = 'On'
EndFunc

Func Monitor_Off()
$Monitor = 'Off'
EndFunc

но мне не нравится, что он постоянно в цикле мотает и выключает моник.

Maza Faka
09-08-2007, 11:58
Creat0R
Плз глянь скрипт, что не так?
Скрипт запускается из корня диска "C:\". Если открываю mp3-файл на диске "C:\", то файл проигрывается нормально, если открываю mp3-файл на диске "D:\", скажем "D:\Music\Taxi\TAXY-4.mp3", то тоже всё нормально, но если в пути или имени файла есть пробелы, то файл не проигрывается, причём такой глюк, только если файл на "D:\" диске, с "C:\" диском, всё нормально.


#include <GUIConstants.au3>
#include <Sound.au3>
#include <Array.au3>
#Include <File.au3>

Dim $m3u_array, $sound, $sleep, $i = 1

$file = ""
GUICreate("Player", 300, 200, -1, -1, -1)
GUISetIcon(@ProgramFilesDir & "\Winamp\winamp.exe", 0)
GUISetBkColor(0xA6CAF0)
GUICtrlCreateLabel("Simple player", 100, 5, 100, 15, -1)

;Menu
$menu = GUICtrlCreateMenu("File", -1)
$playlist = GUICtrlCreateMenuItem("Open playlist", $menu)
GUICtrlCreateMenuItem("", $menu)
$quit = GUICtrlCreateMenuItem("Quit", $menu)

;Button
$play = GUICtrlCreateButton("Play", 10, 115, 60)
$open = GUICtrlCreateButton("Open", 10, 10, 60)
$stop = GUICtrlCreateButton("Stop", 210, 115, 60)
$pause = GUICtrlCreateButton("Pause", 210, 10, 60)

;Slider
$slider = GUICtrlCreateSlider(83, 115, 100, 30, -1)
GUICtrlSetLimit($slider, 100, 0)
GuiCtrlSetData($slider, 100)

GUISetState()

AdlibEnable("Check", 1000)

While 1
$msg = GUIGetMsg()

Select
Case $msg = $open
_SoundClose($sound)
$file = FileOpenDialog("Open music file", @MyDocumentsDir & "\Моя музыка", "Music files(*.mp3;*.wav)", 3)

Case $msg = $play
If (Not $file = "") And (Not _SoundStatus($sound) = "played") Then
$sound = _SoundOpen($file)
_SoundPlay($sound)
EndIf

Case $msg = $slider
$Read_slider = GUICtrlRead($slider)
SoundSetWaveVolume($Read_slider)

Case $msg = $Gui_Event_Close Or $msg = $quit
Exit

Case $msg = $playlist
$m3u = FileOpenDialog("Add playlist", "", "Playlist (*.m3u)", 1)
If @error Then ContinueLoop
_FileReadToArray($m3u, $m3u_array)
$sound = _SoundOpen($m3u_array[$i])
_SoundPlay($sound)

Case $msg = $stop
_SoundStop($sound)
_SoundClose($sound)
ContinueLoop

Case $msg = $pause
If Not $sound = "" Then
If $sleep = 1 Then
_SoundResume($sound)
$sleep = 0
Else
$sleep = _SoundPause($sound)
EndIf
EndIf
EndSelect
WEnd

Func Check()
$stat = _SoundStatus($sound)
If $stat = "stopped" Then
If IsArray($m3u_array) Then
_SoundClose($sound)
$i += 1
$sound = _SoundOpen($m3u_array[$i])
If @error Then Return
_SoundPlay($sound)
EndIf
EndIf
EndFunc

Creat0R
09-08-2007, 13:17
VelDmi,
ведь мы будем знать нажатую клавишу
Хм, не уверен что понял для чего? все клавиши (кроме заданных) работают как обычно.

в какой переменной она хранится?
Что хранится? нажатая клавиша? нигде вроде :) - кстати для этого тоже есть функция, возвращает значение вызванной клавиши/нажатой кнопки мышки, если нужно могу выложить (с оф. форума стащил ;) ).

мне не нравится, что он постоянно в цикле мотает и выключает моник.
И при этом нагружает систему... именно поэтому я и подумал использовать проверку ввода, не могу понять почему у тебя не работает, я запускаю скрипт, жму F11, монитор выключается, пока не нажать F10 или Esc он выключается при любом другом вводе...

Ради проверки, попробуй поставь Beep() после функции _IdleWaitCommit(0) (в цикле где она вызывается), по идее звук должен прозвучать только после первого выключения, и каждый раз при вводе с клавиатуры или мышки.


Maza Faka,
Плз глянь скрипт, что не так?
Ок, чуть позже гляну...

Maza Faka,
Для начала я бы проверил тот же путь который "не работает" напрямую - т.е возьми укажи сразу этот путь (в отдельном скрипте), и просто сделай так:

$OpSound = _SoundOpen("D:\полный путь к файлу")
_SoundPlay($OpSound)

если он играет, значит путь неверно передаётся в момент обработки в теле цикла, если не играет, значит возможно попадаются нестандартные символы в имени файла.. покажи проблематичный путь.

Maza Faka
09-08-2007, 15:39
Creat0R
Не понимаю, вот с таким путём проигрывается:


#include <Sound.au3>
$OpSound = _SoundOpen("D:\Music\Taxi\TAXY-4.mp3")
_SoundPlay($OpSound)
While 1
Sleep(1000)
WEnd


А с таким нет:

#include <Sound.au3>
$OpSound = _SoundOpen("D:\Music\Steve Vai\01 - Bad Horse.mp3")
_SoundPlay($OpSound)
While 1
Sleep(1000)
WEnd


Глючная какая-то библиотека :(

Creat0R
09-08-2007, 16:25
Maza Faka,
А с таким нет:
Во-первых проверь что возвращает функция _SoundOpen() (проверь переменную $OpSound).
Во-вторых, чтобы окончательно "отсеять вину" самого пути/файла, попробуй проиграть этот же файл используя встроенную функцию SoundPlay().

Я создал у себя точно такой путь, поместил туда файл с точно таким именем, всё нормально играет..

Проблема видимо в самом файле.
Если хочешь залей файл, я проверю у себя.

Maza Faka
09-08-2007, 17:22
Creat0R
Мистика какая-то. Запускаю скрипт:

#include <Sound.au3>
$open = _SoundOpen("D:\Music\Steve Vai\01 - Bad Horse.mp3")
$play = _SoundPlay($open)
MsgBox(0, "", $play)

While 1
Sleep(1000)
WEnd


Музыка не играет, хотя _SoundPlay возвращает 1, что означает успех. Создал каталог "D:\Super Dance Lolli pop\", скопировал туда этот же "проблемный" файл ("01 - Bad Horse.mp3"), файл проигрывается. Ничего не понимаю :dont-know

Похоже глюк Винды, из каталога "D:\Music\Steve Vai" скопировал все файлы в другой каталог, удалил каталог "D:\Music\Steve Vai", создал его же заново, скопировал туда все mp3-файлы, которые там раньше находились, и о чудо! музыка заиграла! Что за хрень такая?

Creat0R
09-08-2007, 23:20
Maza Faka,
Музыка не играет, хотя _SoundPlay возвращает 1
а что возвращает _SoundOpen()?
Вообще можно проверять ошибки используя пример из справки:

#include <Sound.au3>
;open sound file
$sound = _SoundOpen("D:\Music\Steve Vai\01 - Bad Horse.mp3")
If @error = 2 Then
MsgBox(0, "Error", "The file does not exist")
Exit
ElseIf @error = 3 Then
MsgBox(0, "Error", "The alias was invalid")
Exit
ElseIf @extended <> 0 Then
$extended = @extended ;assign because @extended will be set after DllCall
$errorstring = DllCall("winmm.dll","int","mciGetErrorStringA","str",$extended,"str","","int",65534) ;,"hwnd",0) - Это лишнее, у меня с этим скрипт вылетает
MsgBox(0, "Error", "The open failed." & @CRLF & "Error Number: " & $extended & @CRLF & "Error Description: " & $errorstring[2] & @CRLF & "Please Note: The sound may still play correctly.")
Else
MsgBox(0, "Success", "The file opened successfully")
EndIf
_SoundPlay($sound, 1)

_SoundClose($sound)

удалил каталог "D:\Music\Steve Vai", создал его же заново
Возможно в пути попались русские буквы, а когда пересоздал путь, писал строго латинскими.
Как получал путь к файлу? ручной ввод? или копирование с адресной строки? (или ещё другими методами).

Maza Faka
10-08-2007, 10:15
Creat0R

а что возвращает _SoundOpen()?
Набор символов, типа "pvprlccwfo", причём каждый раз разный, хотя открывается один и тот же файл.

Возможно в пути попались русские буквы, а когда пересоздал путь, писал строго латинскими.
Нет, в пути не могло быть кириллицы, в этом я уверен, так, как лично создавал каталоги.

Как получал путь к файлу? ручной ввод? или копирование с адресной строки? (или ещё другими методами)
Да без разницы, и вручную вводил и из буфера обмена.

Ладно, прекратим этот оффтоп, думаю это частный случай, связанный с моим компом.

Diamond
10-08-2007, 15:16
Creat0R кстати для этого тоже есть функция, возвращает значение вызванной клавиши/нажатой кнопки мышки, если нужно могу выложить >>>
Заинтригован. :) Выложи пожалуйста. :shuffle:

Creat0R
10-08-2007, 16:08
Maza Faka,
Набор символов, типа "pvprlccwfo", причём каждый раз разный, хотя открывается один и тот же файл.
Он разный потому что гинерируется используя Random ;) - это типа самопального идентификатора :) - Загляни в саму библиотеку, поймёшь как оно вообще сделано ;)

Diamond,
Выложи пожалуйста
Нет проблем...
Немного(?) переделал под свои нужды:


While 1
$KeyIsPressed = _KeyIsPressed()
If $KeyIsPressed Then MsgBox(64, "Pressed/Clicked:", $KeyIsPressed)
Sleep(10)
WEnd

Func _KeyIsPressed()
Local $KeyBoardLayoutArr = StringSplit("{LMouse}|{RMouse}|{}|(MMouse}|{}|{}|{}|{BACKSPACE}|{TAB}|{}|{}|{}|{ENTER}|{}|{}|{SHIFT}|{CTRL}|{ALT} |{PAUSE}|{CAPSLOCK}|{}|{}|{}|{}|{}|{}|{ESC}|{}|{}|{}|{]|{SPACE}|{PGUP}|{PGDN}|{END}|{HOME}|{LEFT}|{UP}|{RIGHT}|{DOWN}|{SELECT}|{PRINTSCREEN}|{}|{PRINTSCREE N}|{INSERT}|{DEL}|{}|0|1|2|3|4|5|6|7|8|9|{}|{}|{}|{}|{}|{}|{}|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s| t|u|v|w|x|y|z|{LWIN}|{RWIN}|{APPSKEY}|{}|{SLEEP}|{numpad0}|{numpad1}|{numpad2}|{numpad3}|{numpad4}|{ numpad5}|{numpad6}|{numpad7}|{numpad8}|{numpad9}|{NUMPADMULT}|{NUMPADADD}|{}|{NUMPADSUB}|{NUMPADDOT} |{NUMPADDIV}|{F1}|{F2}|{F3}|{F4}|{F5}|{F6}|{F7}|{F8}|{F9}|{F10}|{F11}|{F12}|{F13}|{F14}|{F15}|{F16}| {F17}|{F18}|{F19}|{F20}|{F21}|{F22}|{F23}|{F24}|{}|{}|{}|{}|{}|{}|{}|{}|{NUMLOCK}|{}|{}|{}|{}|{}|{}| {}|{}|{}|{}|{}|{}|{}|{}|{}|{SHIFT}|{SHIFT}|{CTRL}|{CTRL}|{ALT}|{ALT}|{BROWSER_BACK}|{BROWSER_FORWARD }|{BROWSER_REFRESH}|{BROWSER_STOP}|{BROWSER_SEARCH}|{BROWSER_FAVORITES}|{BROWSER_HOME}|{VOLUME_MUTE} |{VOLUME_DOWN}|{VOLUME_UP}|{MEDIA_NEXT}|{MEDIA_PREV}|{MEDIA_STOP}|{MEDIA_PLAY_PAUSE}|{LAUNCH_MAIL}|{ LAUNCH_MEDIA}|{LAUNCH_APP1}|{LAUNCH_APP2}|{}|{}|;|{+}|,|{-}|.|/|`|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|[|\|]|'", "|")
Local $a_R
For $i = 0 To 165
$a_R = DllCall("user32.dll", "int", "GetAsyncKeyState", "int", '0x' & Hex($i,2))
If Not @error And BitAND($a_R[0], 0x8000) = 0x8000 Then Return $KeyBoardLayoutArr[$i]
Next
Sleep(40)
Return 0
EndFunc




© OSzone.net 2001-2012