Ru-Board.club
← Вернуться в раздел «Программы»

» AutoIT

Автор: ViSiToR
Дата сообщения: 15.02.2008 13:19
baic

Цитата:
Этот код открывает папку из которой запускается скрипт

Это ярлык для запуска интернета (IExplore)? У него свойства другие, можно использовать самопальную функцию (от amel27) для подобных ярлыков:


Код:
_ShellExecuteEx(@DesktopDir & "\Inet1.lnk")

Func _ShellExecuteEx($sCmd, $sArgs = "", $sFolder = "", $sVerb = "", $iState = @SW_SHOWNORMAL, $hWnd = 0)
Local $stINFO = DllStructCreate("long;long;long;ptr;ptr;ptr;ptr;long;long;long;ptr;long;long;long;long")
Local $stVerb = DllStructCreate("char[15];char")
Local $stPath = DllStructCreate("char[255];char")
Local $stArgs = DllStructCreate("char[255];char")
Local $stWDir = DllStructCreate("char[255];char")

DllStructSetData($stVerb, 1, $sVerb)

DllStructSetData($stPath, 1, $sCmd)
DllStructSetData($stWDir, 1, $sFolder)
DllStructSetData($stArgs, 1, $sArgs)

DllStructSetData($stINFO, 1, DllStructGetSize($stINFO))
DllStructSetData($stINFO, 2, BitOR(0xC, 0x40, 0x400))
DllStructSetData($stINFO, 3, $hWnd)
DllStructSetData($stINFO, 4, DllStructGetPtr($stVerb))
DllStructSetData($stINFO, 5, DllStructGetPtr($stPath))
DllStructSetData($stINFO, 6, DllStructGetPtr($stArgs))
DllStructSetData($stINFO, 7, DllStructGetPtr($stWDir))
DllStructSetData($stINFO, 8, $iState)

Local $aRet = DllCall("shell32.dll", "int", "ShellExecuteEx", "ptr", DllStructGetPtr($stINFO))
If Not IsArray($aRet) Or Not $aRet[0] Then Return SetError(2, 0, 0)

Return 1
EndFunc
Автор: baic
Дата сообщения: 15.02.2008 17:49
ViSiToR
если добавляю в текст...MsgBox(0, "Example", @DesktopCommonDir & "\Inet1.lnk")...то
появляется MsgBox и запускается ярлык Inet1.lnk, но если убираю...MsgBox(0, "Example", @DesktopCommonDir & "\Inet1.lnk")...то ярлык Inet1.lnk не запускается

...заранее благодарен, если поможете...




Код:
_ShellExecuteEx(@DesktopCommonDir & "\Inet1.lnk")
MsgBox(0, "Example", @DesktopCommonDir & "\Inet1.lnk")

Func _ShellExecuteEx($sCmd, $sArgs = "", $sFolder = "", $sVerb = "", $iState = @SW_SHOWNORMAL, $hWnd = 0)
Local $stINFO = DllStructCreate("long;long;long;ptr;ptr;ptr;ptr;long;long;long;ptr;long;long;long;long")
Local $stVerb = DllStructCreate("char[15];char")
Local $stPath = DllStructCreate("char[255];char")
Local $stArgs = DllStructCreate("char[255];char")
Local $stWDir = DllStructCreate("char[255];char")

DllStructSetData($stVerb, 1, $sVerb)

DllStructSetData($stPath, 1, $sCmd)
DllStructSetData($stWDir, 1, $sFolder)
DllStructSetData($stArgs, 1, $sArgs)

DllStructSetData($stINFO, 1, DllStructGetSize($stINFO))
DllStructSetData($stINFO, 2, BitOR(0xC, 0x40, 0x400))
DllStructSetData($stINFO, 3, $hWnd)
DllStructSetData($stINFO, 4, DllStructGetPtr($stVerb))
DllStructSetData($stINFO, 5, DllStructGetPtr($stPath))
DllStructSetData($stINFO, 6, DllStructGetPtr($stArgs))
DllStructSetData($stINFO, 7, DllStructGetPtr($stWDir))
DllStructSetData($stINFO, 8, $iState)

Local $aRet = DllCall("shell32.dll", "int", "ShellExecuteEx", "ptr", DllStructGetPtr($stINFO))
If Not IsArray($aRet) Or Not $aRet[0] Then Return SetError(2, 0, 0)

Return 1
EndFunc


Автор: ViSiToR
Дата сообщения: 15.02.2008 18:43
baic

Цитата:
если убираю...MsgBox(0, "Example", @DesktopCommonDir & "\Inet1.lnk")...то ярлык Inet1.lnk не запускается

Очень странно... можно вместо MsgBox поставить паузу - Sleep(100) .

Какого типа этот ярлык? обычный ярлык, или с системными свойствами (как ярлык для MS Word к примеру).
Автор: elchupakabra
Дата сообщения: 15.02.2008 18:49
Еще такой вопрос... поставил билд 3.2.10.0, теперь откомпилированные им скрипты не декомпилируются (пишет, что скрипт не был скомпилирован AutoIt), с 3.2.4.9 такой проблемы не было. Это решаемо?
Автор: ViSiToR
Дата сообщения: 15.02.2008 19:23

Цитата:
откомпилированные им скрипты не декомпилируются

Декомпилляция не поддерживается с версии позже 3.2.5.1. Об этом напоминается в самом декомпилляторе


Цитата:
Это решаемо?

Теоретический да, но мне лично не попадались подобные декомпиляторы
Автор: baic
Дата сообщения: 16.02.2008 07:50
ViSiToR

...ярлык Inet1.lnk для подключения к интернету...ADSL
...счас по-пробую слип...


Добавлено:
...слип не помог
Автор: ViSiToR
Дата сообщения: 16.02.2008 08:10
baic

Цитата:
ярлык Inet1.lnk для подключения к интернету...ADSL


Что показывает этот скрипт:


Код: #include <Array.au3>

$aData = FileGetShortcut(@DesktopDir & "\Inet1.lnk")

_ArrayDisplay($aData)
Автор: baic
Дата сообщения: 16.02.2008 08:25
ViSiToR

Цитата:

@DesktopCommonDir это именно то что нужно? это путь к папке C:\Documents and Settings\All Users.WINDOWS\Рабочий стол


...да именно так


Цитата:

#include <Array.au3>

$aData = FileGetShortcut(@DesktopDir & "\Inet1.lnk")

_ArrayDisplay($aData)

...не помогло


Цитата:

Run(@ComSpec & ' /c start "" "' & @DesktopCommonDir & '\Inet1.lnk"', '', @SW_HIDE)



Цитата:

Что показывает этот скрипт:

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







Добавлено:
Run....тоже не помогло...забыл дописать...
Автор: ViSiToR
Дата сообщения: 16.02.2008 08:41
baic

Цитата:
...не помогло

Это была не помощь, а пример, что на экране отобразилось? ничего? значит ярлык не четабельный.

Ну а это хоть что-то показывает:


Код: MsgBox(0, "", FileExists(@DesktopCommonDir & '\Inet1.lnk'))
Автор: baic
Дата сообщения: 16.02.2008 08:58
ViSiToR
[quote]
Ну а это хоть что-то показывает:
Код:
MsgBox(0, "", FileExists(@DesktopCommonDir & '\Inet1.lnk'))
[quote]
показывает 1

Добавлено:
сори за...
Автор: Maza Faka
Дата сообщения: 16.02.2008 14:22
XpycTMD

Цитата:
Вопрос а как сделать чтобы при выборе даты их календаря она записывалась в файл соответсвующий определенному сотруднику???

Привет. Наконец-то нашёл время посмотреть твой код. В общем такой пример:
в папке D:\Database имеются *.ini файлы с именами сотрудников, например ivanov.ini, petrov.ini и т.д., формат *.ini-файла такой, как ты приводил, при нажатии на кнопку "Set" происходит запись дат в *.ini-файл с именем сотрудника, если, что не понятно, спрашивай.

Код: #NoTrayIcon
#include
<GUIConstants.au3>
#include <File.au3>
#include <Array.au3>

Opt("GuiOnEventMode", 1)

$Filter = "*.ini"
$Flag = "1"

$dbPatch = "D:\Database"

$Version = "0.7"
$ProgramTitle = "Crew Manager " & $Version

$GUIWidth
= 800
$GUIHeight = 600
$GUILeft = (@DesktopWidth - $GUIWidth) / 2
$GUITop = (@DesktopHeight - $GUIHeight) / 2
$CrewListTop = 120

$CrewManager = GUICreate($ProgramTitle, $GUIWidth, $GUIHeight, $GUILeft, $GUITop, $WS_VISIBLE + $WS_CLIPSIBLINGS + $WS_OVERLAPPEDWINDOW)
GUISetFont(10, 400, 0, "Tahoma")
GUICtrlCreateLabel("Crew Manager", 210, 0, 555, 65, $SS_CENTER + $SS_CENTERIMAGE)
GUICtrlSetFont(-1, 38, 800, 0, "Tahoma")
GUICtrlSetColor(-1, 0x0000FF)
GUISetOnEvent($GUI_EVENT_CLOSE, "Quit")

GUICtrlCreateLabel("PPC", 125, 70, 255, 20, $SS_CENTER + $SS_CENTERIMAGE)
GUICtrlSetFont(-1, 10, 800, 0, "Tahoma")

GUICtrlCreateLabel("PPC Passed Date", 125, 95, 125, 20, $SS_CENTER + $SS_CENTERIMAGE)
GUICtrlSetFont(-1, 10, 800, 0, "Tahoma")

GUICtrlCreateLabel("PPC Next Date", 260, 95, 125, 20, $SS_CENTER + $SS_CENTERIMAGE)
GUICtrlSetFont(-1, 10, 800, 0, "Tahoma")

$Crew = _FileListToArray($dbPatch, $Filter, $Flag)
If @error Then
MsgBox(16, "??????", "??? *.ini ?????? ? ???????? " & $dbPatch)
Exit
EndIf


$PPCPassedDate = $Crew
$PPCPassedDateChecker
= $Crew
$PPCNextDate
= $Crew
$PPCNextDateChecker
= $Crew
$SetButton
= $Crew
$hPPC_Passed_Date
= $Crew
$hPPC_Next_Date
= $Crew

For $i = 1 To $Crew[0]
GUICtrlCreateLabel(StringReplace($Crew[$i], ".ini", ""), 10, $CrewListTop, 110, 25, $SS_CENTERIMAGE)
GUICtrlSetFont(-1, 10, 800, 0, "Tahoma")

$PPCPassedDate[$i] = IniRead($dbPatch &"\"& $Crew[$i], "PPC", "PPCPassedDate", "0000/00/00")
$ReadDate = _ParsStringDate($PPCPassedDate[$i])

$hPPC_Passed_Date[$i] = GUICtrlCreateDate($ReadDate, 125, $CrewListTop, 105, 25, $DTS_SHORTDATEFORMAT)

$PPCPassedDateChecker[$i] = GUICtrlCreateLabel("", 230, $CrewListTop, 25, 25, $WS_BORDER)

$PPCNextDate[$i] = IniRead($dbPatch &"\"& $Crew[$i], "PPC", "PPCNextDate", "0000/00/00")
$ReadDate = _ParsStringDate($PPCNextDate[$i])

$hPPC_Next_Date[$i] = GUICtrlCreateDate($ReadDate, 260, $CrewListTop, 105, 25, $DTS_SHORTDATEFORMAT)

$PPCNextDateChecker[$i] = GUICtrlCreateLabel("", 365, $CrewListTop, 25, 25, $WS_BORDER)

$SetButton[$i] = GUICtrlCreateButton("Set", 400, $CrewListTop, 50, 25)
GUICtrlSetOnEvent(-1, "_WriteDate")

$CrewListTop = $CrewListTop + 30
Next

GUISetState(@SW_SHOW)

While 1
Sleep(100)
WEnd

Func
Quit()
Exit
EndFunc

Func
_ParsStringDate($sString)
Local $DateSplit, $sDate
$DateSplit
= StringSplit($sString, ".")

For $i = $DateSplit[0] To 1 Step -1
$sDate &= $DateSplit[$i] & "/"
Next

Return
$sDate
EndFunc

Func
_WriteDate()
Local $iSearchIdnex, $iPassedDate, $iNextDate

$iSearchIndex
= _ArraySearch($SetButton, @GUI_CtrlId, 1)
If @error Then Return

$iPassedDate = GUICtrlRead($hPPC_Passed_Date[$iSearchIndex])
$iNextDate = GUICtrlRead($hPPC_Next_Date[$iSearchIndex])

IniWrite($dbPatch &"\"& $Crew[$iSearchIndex], "PPC", "PPCPassedDate", $iPassedDate)
IniWrite($dbPatch &"\"& $Crew[$iSearchIndex], "PPC", "PPCNextDate", $iNextDate)
EndFunc
Автор: XpycTMD
Дата сообщения: 17.02.2008 09:49
NIKZZZZ
Спасибо большое то что надо

Maza Faka
Спасибо большое. А вариант записи возможен только по средством кнопки, просто хотелось чтобы дата при выборе в календаре сразу записывалась в фаил. А то практира показывает что надо который будет работать с программой не внимательный и может забыть нажать на кнопку.
И еще вопрос для чего вот это функция

Код: Func _ParsStringDate($sString)
Local $DateSplit, $sDate
$DateSplit
= StringSplit($sString, ".")

For $i = $DateSplit[0] To 1 Step -1
$sDate &= $DateSplit[$i] & "/"
Next

Return
$sDate
EndFunc
Автор: NIKZZZZ
Дата сообщения: 17.02.2008 16:48
Есть такой вопрос по DllCallback.

DllCallback функция принимает следующие параметры:


Код: //
//Callback function:
//
Callback(
IN DWORD msgId, // message ID
IN WPARAM param1, // usually file name
INOUT LPARAM param2, // usually error code
IN void *unused
)

//first parameter: full file path for if MSG_PROCESS, message string for others
TCHAR *message = (TCHAR *) param1;
TCHAR *filePath = (TCHAR *) param1;
DWORD percent = (DWORD) param1;

//second parameter: message back to caller if MSG_PROCESS, error code for others
DWORD errorCode = param2;
DWORD *msg_back = (DWORD *) param2;
Автор: NIKZZZZ
Дата сообщения: 18.02.2008 09:13
Еще одна проблема - при длительной работе DllCall GUI окно перестает обновляться, хотя Callback функция постоянно его изменяет. Можно ли обновить окно принудительно ?
Автор: ViSiToR
Дата сообщения: 18.02.2008 10:05
NIKZZZZ

Цитата:
Это баг ?

Трудно сказать, не видно всей картины


Цитата:
при длительной работе DllCall GUI окно перестает обновляться, хотя Callback функция постоянно его изменяет

Известное ограничение в AutoIt - при вызове Dll, копировании файлов, выводе MsgBox и несколько других функции, осноавная работа скрипта останавливается. CallBack поможет только на уровне функционала, с графикой в этом случае будут всегда проблемы. Как вариант, вешать вызов Dll на внешний скрипт, при необходимости можно возвращать данные в родительский скрипт .


Цитата:
Можно ли обновить окно принудительно ?

Можно попробовать _WinAPI_RedrawWindow(). Хотя это зависит от того, в каких целях нужно обновлять окно.
Автор: Loopback
Дата сообщения: 18.02.2008 21:56
NIKZZZZ

Цитата:
все нормально. Это баг ?

А что это за "wstr" такой интересный в DllStructCreate('wstr[1024]',$param1)? Может быть "wchar" имелось в виду? Думаю, если вставить проверку @error после этого вызова, то будет видно, что структура не создается.
Автор: NIKZZZZ
Дата сообщения: 19.02.2008 02:48
Loopback

Цитата:
А что это за "wstr"


Просто не подумав написал по аналогии с
$pCallBack = DllCallbackRegister('CallBack', 'int', 'dword;WSTR;LPARAM;dword')



Добавлено:
Еще странный глюк.

Код: Func Function1()
Local $dll
$dll = DllOpen($apifunc)
Do
$pCallBack = DllCallbackRegister('CallBack', 'int', .........)
DllCall($dll, "ptr", 'RegisterMessageCallback', 'ptr', 0, 'ptr', DllCallbackGetPtr($pCallBack), 'ptr', 0)
DllCall($dll, "ptr", "Function1", ........)
Until True
DllClose($dll)
DllCallbackFree($pCallBack)
EndFunc

Func CallBack()
......
EndFunc
Автор: ViSiToR
Дата сообщения: 19.02.2008 03:48
NIKZZZZ

Цитата:
DllClose($dll) выдает ошибку $dll - "Variable used without being declared."

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

Можешь привести полный (простой) пример воспроизведения бага? Если это баг, то обязательно нужно репортить, это довольно серъёзная ошибка.

Добавлено:

Цитата:
А может быть , что CallBack вызывается одновременно несколько раз

Может, смотря как вызывать первую инстанцию, возможно (ненарошно) рекурсивно вызываются CallBack'и.


Цитата:
Что при этом будет с графикой ?

Возможно незаконченная прорисовка части (или всех) элементов. Я с этим сталкивался пару раз (с GUICtrlRegisterMsg() + DllCallBackResister()).

Во-первых не забываем, что CallBack в AutoIt появился недавно (он конечно присутствовал в другой форме и раньше, но не так доступен был "пользователю"), поэтому проблемы могут быть разные.

Во-вторых, в AutoIt есть значительное (если юзать CallBack и т.п) ограничение на буфиризацию, поэтому при обработке функции могут быть сбои/задержки, нагружать многочисленными вызовами (под)функции не желательно, часть к примеру, можно повесить на главный цикл

Добавлено:
Тест показывающий, что переменная, объявленная локально в функции, не удаляется при её объявлении (с тем же именем) в другой (под)функции глобально/локально:


Код:
TestFunc()

Func TestFunc()
Local $Var = 1

Local $hCallBack = DllCallbackRegister("CallBackFunc", "none", "hwnd;int;int;dword")
Local $aDll = DllCall("user32.dll", "int", "SetTimer", "hwnd", 0, "int", 0, "int", 100, "ptr", DllCallbackGetPtr($hCallBack))

Sleep(2000)

DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "int", $aDll[0])
DllCallbackFree($hCallBack)

ConsoleWrite($Var)
EndFunc

Func
CallBackFunc($hWnd, $nMsg, $wParam, $lParam)
Global $Var = 0
;Dim $Var = 0
;Local $Var = 0

EndFunc
Автор: NIKZZZZ
Дата сообщения: 19.02.2008 04:58
ViSiToR

Цитата:
$dll - "Variable used without being declared."

Провел тест - данная ошибка возникает только в случае, если CallBack вызван одновременно несколько раз.




Добавлено:
ViSiToR

Цитата:
Как вариант, вешать вызов Dll на внешний скрипт, при необходимости можно возвращать данные в родительский скрипт

А как реально это сделать?
Автор: ViSiToR
Дата сообщения: 19.02.2008 07:13
NIKZZZZ

Цитата:
как реально это сделать?

Пример проверки соединения с интернетом:


Код: #include <GuiConstants.au3>

Global $AppTitle = "My App"

$Main_GUI = GUICreate($AppTitle, 300, 200)

$Reciever_Edit = GUICtrlCreateEdit("", -500, -500)
GUICtrlSetState(-1, $GUI_HIDE)

$CheckConnection_Button = GUICtrlCreateButton("Check Connection", 20, 160, 120, 20)

GUISetState()

While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case
$CheckConnection_Button
$InetIsConnected
= _InetIsConnected() = 1
MsgBox(64, "Results", "Inet is Connected: " & $InetIsConnected)
EndSwitch
WEnd

Func
_InetIsConnected()
Local $sScript_Content = '#NoTrayIcon' & @CRLF
$sScript_Content &= '$hWinInetDll = DllOpen("wininet.dll")' & @CRLF
$sScript_Content &= 'If $hWinInetDll = -1 Then SendDataToParent(SetError(1, 0, -1))' & @CRLF
$sScript_Content &= '$IsConnected = DllCall($hWinInetDll, "int", "InternetGetConnectedState", "int", 0, "int", 0)' & @CRLF
$sScript_Content &= 'DllClose($hWinInetDll)' & @CRLF
$sScript_Content &= 'If IsArray($IsConnected) Then' & @CRLF
$sScript_Content &= ' SendDataToParent($IsConnected[0])' & @CRLF
$sScript_Content &= 'Else' & @CRLF
$sScript_Content &= ' SendDataToParent(False)' & @CRLF
$sScript_Content &= 'EndIf' & @CRLF & @CRLF
$sScript_Content &= 'Func SendDataToParent($sData)' & @CRLF
$sScript_Content &= ' $iParent_WinHandle = WinGetHandle("[CLASS:AutoIt v3 GUI; TITLE:' & $AppTitle & ']")' & @CRLF
$sScript_Content &= ' ControlSetText($iParent_WinHandle, "", "Edit1", $sData, 1)' & @CRLF
$sScript_Content &= 'EndFunc' & @CRLF

Local $sTmp_Script = @TempDir & "\AutoIt_Tmp_Script.call"

Local $hOpen_Tmp_Script = FileOpen($sTmp_Script, 2)
FileWrite($hOpen_Tmp_Script, $sScript_Content)
FileClose($hOpen_Tmp_Script)

RunWait(@AutoItExe & ' /ErrorStdOut /AutoIt3ExecuteScript "' & $sTmp_Script & '"', @ScriptDir, @SW_HIDE)

Local $sRet_Data = GUICtrlRead($Reciever_Edit)

GUICtrlSetData($Reciever_Edit, "")
FileDelete($sTmp_Script)

Return $sRet_Data
EndFunc
Автор: Lutvun
Дата сообщения: 20.02.2008 20:58
Народ, помогите пожалуста! Нужен скрипт который бы запустил программу полностю скрытой, подождал 7 сек и передал в неё сочитание клавиш Ctrl+s ввёл имя файла и нажал ентер. И ищё возможно ли сделать чтоб окно программы появилось на заданых координатах рабочего стола?
Автор: Maza Faka
Дата сообщения: 21.02.2008 07:29
Lutvun
Пример на блокноте:

Код: Run("notepad.exe", @WindowsDir, @SW_HIDE)
Sleep(100)
ControlSend("[Class:Notepad]", "", "Edit1", "Hello world")
ControlSend("[Class:Notepad]", "", "Edit1", "{Enter}")
WinMove("[Class:Notepad]", "", 0, 0)
WinSetState("[Class:Notepad]", "", @SW_SHOW)
Автор: ViSiToR
Дата сообщения: 21.02.2008 10:53

CaptureIt v1.0 - Эта утилита предназначена для захвата изображений с вашего экрана.


=================
Главные возможности:
=================



Захват всего экрана.
Захват отдельных окон или выбранных элементов окна.
Захват выбранной части экрана.
Сохранение захваченного изображения в тихом режиме.
Открытие захваченного изображения в графическом редакторе.
Вывод на печать захваченного изображения.
Помещение захваченного изображения в буфер обмена.
Закачка захваченного изображения (на imageshack.us).

Поддерживаемые форматы изображений:

PNG
GIF
JPG - Качество настраивается.
BMP - Формат настраивается.
Автор: ynbIpb
Дата сообщения: 26.02.2008 14:47
Возникла такая задача:
В файле (*.exe) нужно заменять в двух местах гуппы байтов FF FF FF
Набросал черновую форму в Koda. Но вот как дальше быть не знаю.
Как отрыть файл и по определённому адресу изменить байты, которые вписаны в форму.
Эти байты ничто иное как код цвета (в HTML такой применяется). В идеале бы ещё рядом кнопочку, которая вызывает палитру цвета, ткнуть и нужный код сразу заносился бы в инпут бокс и как пример рядом квадратик окрашеный этим цветом.
Может кто подскажет куда копать?

Код: #include <GUIConstants.au3>
$Form1 = GUICreate("Form1", 327, 161, 305, 185)
$OK = GUICtrlCreateButton("OK", 240, 112, 75, 25, 0)
$Label1 = GUICtrlCreateLabel("Font Color", 80, 8, 121, 17)
$Input1 = GUICtrlCreateInput("", 72, 40, 121, 21, $ES_UPPERCASE)
$Input2 = GUICtrlCreateInput("", 72, 96, 121, 21, $ES_UPPERCASE)
$Label2 = GUICtrlCreateLabel("BackGround Color", 80, 72, 121, 17)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit

EndSwitch
WEnd
Автор: Loopback
Дата сообщения: 26.02.2008 16:55
Работать с файлами нужно в бинарном режиме, ну что-нибудь вроде этого (предполагает ввод кода в виде "AEF0EC"):


Код: $sbNewColor1 = Binary("0x" & GUICtrlRead($Input1))
$sbNewColor2 = Binary("0x" & GUICtrlRead($Input2))
; тут смещения
$nOffset1 = 1234
$nOffset2 = 5678
; откроем файлы
$hInFile = FileOpen($sInFileName, 16)
$hOutFile = FileOpen($sOutFileName, 2 + 16)
; смещение первого цвета - 1
$sbData = FileRead($hInFile, $nOffset1 - 1)
FileWrite($hOutFile, $sbData)
FileWrite($hOutFile, $sbNewColor1)
; пропустим 3 байта
FileRead($hInFile, 3)
; смещение второго цвета - 1
$sbData = FileRead($hInFile, $nOffset2 - $nOffset1 - 4)
FileWrite($hOutFile, $sbData)
FileWrite($hOutFile, $sbNewColor2)
; пропустим 3 байта
FileRead($hInFile, 3)
; прочитаем и запишем остаток
$sbData = FileRead($hInFile, FileGetSize($sInFileName))
FileWrite($hOutFile, $sbData)
; закроем файлы
FileClose($hInFile)
FileClose($hOutFile)
Автор: ynbIpb
Дата сообщения: 26.02.2008 18:32
благодарю.
щас буду сильно думать и втыкать в код))
------
з.ы.
небольшой затык:
я открываю файл через $FileOpen = FileOpenDialog
по хелпу я понял, что в $FileOpen будет сохранён полный путь до файла.
как мне отделить от этой строки только имя файла?
и ёщё:
использую GUICtrlCreateInput него есть параметр [style] так вот там есть разлчные стили типа разрешать только цифры или верхний регистр, а вот как сделать параметр чтоб разрешал только ввод HEX values? (типа: 0123456789ABCDEF)
Автор: Loopback
Дата сообщения: 26.02.2008 21:57

Цитата:
как мне отделить от этой строки только имя файла?


Можно воспользоваться функцией _PathSplit из стандартной UDF "File.au3". Хотя если нужно только имя файла я, чтобы не добавлять лишние зависимости, часто пользуюсь вот такой конструкцией:


Код: $sFileName = StringMid($sPath, StringInStr($sPath, "\", 0, -1) + 1)
Автор: ynbIpb
Дата сообщения: 26.02.2008 22:33
да я тоже думал переделать стандартную константу каторая в инклудах лежать должна но ничего кроме имя- какието цифры не нашёл.
а буржуйская крутая штука даже с попапом. попробую в ней разобраться.
спасибо
зы
так это не буржуйская, а Креатора UDF?
а правится легко:
в строках типа: If StringRegExp($Read_Input, '[^0-9]')
сделал так: If StringRegExp($Read_Input, '[^0-9ABCDEF]')
-----
количество символов отрегулировал с помощью: GUICtrlSetLimit ( $Input1, 6)
Автор: Maza Faka
Дата сообщения: 27.02.2008 09:22
ynbIpb

Цитата:
как мне отделить от этой строки только имя файла?

Можно так:

Код: $string = "c:\Program Files\AutoIt3\AutoIt3.exe"

$result = StringRegExpReplace($string, "^.*\\", "")

MsgBox(0, "", $result)
Автор: NIKZZZZ
Дата сообщения: 27.02.2008 15:43
ynbIpb

Цитата:
как сделать параметр чтоб разрешал только ввод HEX values?


Код: #include <GuiConstants.au3>
$result = ''
$hGui = GUICreate("Test GUI", 300, 200)
$hInput = GUICtrlCreateInput($result, 50, 50, 200, 20, $ES_UPPERCASE)
GUISetState()

While GUIGetMsg() <> $hInput
$Tmp = GUICtrlRead($hInput)
If Not StringIsXDigit($Tmp) And $Tmp<>'' Then
GUICtrlSetData($hInput, $result)
Beep(500, 200)
Else
$result = $Tmp
EndIf
Sleep(200)
WEnd

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192

Предыдущая тема: Quintura Search


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.