Войти

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

amel27
02-12-2007, 09:48
HORRIBLE
надеюсь, вы предварительно ознакомились с материалами форума по установке Adobe Reader 8.0 (http://forum.oszone.net/showthread.php?t=75744)?


NikLok
не в курсе почему не открывается этот материал более? »видимо прикрыли доступ... кидай в PM свое мыло - вышлю в CHM
нет ли [...] желание создать аналог BSPI, который я очень уважаю, но автор его редко дорабатывает»к сожалению, я не пользуюсь POST-инсталлерами, так как универсальным дистрибам предпочитаю генерить установочные комплекты для каждого конкретного случая.... поэтому для выбора приложений вполне хватает клавиш "Insert" и "F5" FAR-менеджера ;)

amel27
02-12-2007, 14:01
Creat0R
немного отсебятины по поводу юникода:

- в ANSI-режиме AutoIT юникодовые (UTF-16) строки можно хранить только в переменных типа Binary, так как двухбайтовые символы включают нулевые байты недопустимые в обычных строках…. точнее такие байты воспринимаются как конец ANSI-строки и строковые функции перестают корректно работать. Зато обычные строки (тип String) могут хранить и обрабатывать юникодовый текст в формате UTF-8… но так как Windows API понимает юникод только в UTF-16 перед передачей в API (к примеру в GUI) требуется дополнительное преобразование кодировки.

- чтобы переключить AutoIT в юникодовый режим сам текст скрипта должен быть набран в юникоде… SciTE способен редактировать юникодовые скрипты, но не позволяет пересохранить скрипт в другом формате - для этого можно воспользоваться «блокнотом»

- в юникодовом режиме AutoIT все строки представлены двухбайтовыми символами UTF-16, и все строковые функции «заточены» на работу именно с такими строками, в частности результат StringLen() будет отличаться от количества байтов в строке (в два раза)… для работы с многобайтовыми строками UTF-8 требуется их предварительное преобразование в UTF-16

- при передаче строк в GUI-элементы через SendMessage() важно учитывать в каком режиме находится AutoIT, так как для передачи ANSI и Юникодовых строк используются разные номера сообщений… между тем мне не попадалось пока UDF, пытающихся самостоятельно определить текущий режим работы AutoIT

Creat0R
02-12-2007, 16:22
amel27, может тогда не заморачиваться?
Но где гарантия что, к примеру при чтановленном Flash Player версии 7, браузер не потребует установки последней версии?

на самом деле приведенная UDF контролирует POWER-клавиши только для On-Line состояния
On-line это в смысле когда пользователь активен?

между тем мне не попадалось пока UDF, пытающихся самостоятельно определить текущий режим работы AutoIT
Если я правильно понял, то макрос @Unicode определяет в каком режиме скомпилирован/запущен AutoIt.

Diamond
02-12-2007, 19:11
На элементе ListView созданный с помощью UDF функции(_GUICtrlListView_Create) почему-то не срабатывает GUICtrlSetResizing().
Конечно можно было бы изменять его размер при получении сообщения WM_SIZING от окна, но к сожалению GUICtrlSetPos() на нём тоже не срабатывает...
Мне кажется, что это происходит из-за отсутствия ID у ListView...
Как быть? Может кто-то уже сталкивался с этим?

P.S.
У UDF'ного ListView нашёл баг: Если попытаться поменять местами пункты в ListView - отображается "+" и окно зависает до тех пор пока не кликнешь по другому окну, например по "Рабочему столу".
Если пункты(item) в ListView имеют изображения, то воспроизводится такой же баг если потянуть за само изображение.

Creat0R
02-12-2007, 23:31
Diamond,
На элементе ListView созданный с помощью UDF функции(_GUICtrlListView_Create) почему-то не срабатывает GUICtrlSetResizing()
Я бы не стал использовать UDF, чем плоха встроенная функция GuiCtrlCreateListView()?

о к сожалению GUICtrlSetPos() на нём тоже не срабатывает...
А ControlMove() ?

amel27
03-12-2007, 04:18
Creat0R
где гарантия что, к примеру при чтановленном Flash Player версии 7, браузер не потребует установки последней версии? »ну да, "проверка наличия" и "проверка актуальности" это немного разные задачи... думаю запрос на обновление должен запрашивать не сам IE, а код загружаемой страницы в зависимости от требований ролика

On-line это в смысле когда пользователь активен? »нет, это когда комп питается от сети, соответственно "On-Battery" - когда переключается на батарею/UPS... кстати, в панели управления эти режимы также настраиваются раздельно

Если я правильно понял, то макрос @Unicode определяет в каком режиме скомпилирован/запущен AutoIt »угу :) ... но между тем этот макрос не задействован ни в одной UDF, хотя имхо он должен использоваться как минимум при определении универсальных констант для сообщений :search:

Diamond
03-12-2007, 04:35
Creat0R,
Я бы не стал использовать UDF, чем плоха встроенная функция
А в чём преимущество встроенной функции перед _GUICtrlListView_Create(), имхо преимуществ нет.
Что касается недостатков... то есть хоть и один но очень существенный: Если ListView был создан с помощью штатной GuiCtrlCreateListView() то управлять им с помощью UDF'х функций не получится(Хотя некоторые всё же срабатывают).

А ControlMove() ?
Ой, а ведь я совсем забыл про неё...
В общем реализовал так:

Func WM_SIZE($HWnd, $MsgID, $wParam, $lParam)
Switch $HWnd
Case $hGui
Local $Client = WinGetClientSize($HWnd)
ControlMove($HWnd, "", $hListView, 5, 5, $Client[0]-10, $Client[1]-10)
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc

Оказалось что WM_SIZE срабатывает даже при команде развернуть-восстановить окно, а в плане точности этот способ даже лучше чем GUICtrlSetResizing().
Думаю проблема решена, спасибо.

Diamond
03-12-2007, 05:38
Передача строки другому приложению


#include <GuiConstants.au3>
;~ Global Const $WM_COPYDATA = 0x004A
$Gui = GUICreate("Отправитель",300,100)
$input = GUICtrlCreateInput("Привет!",10,10,280,20)
$button = GUICtrlCreateButton("Отправить",10,40,70,20)
GUISetState()

While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
Exit
Case $button
$HWnd = WinGetHandle("Получатель")
If $HWnd <> "" And Not @error Then
SendMsg(GUICtrlRead($input), $HWnd, $Gui)
Else
MsgBox(16,"Отправитель","Получатель не обнаружен!")
EndIf
EndSwitch
WEnd

;~ $String - Строка сообщения
;~ $HWnd_Grantee - Приложение получатель (hwnd)
;~ $HWnd_Sender - Приложение отправитель (hwnd)
Func SendMsg($String, $HWnd_Grantee, $HWnd_Sender = 0)
Local Const $tagCopyData = "dword dwData;dword cbData;ptr lpData"
Local $struct = "char [" & StringLen($String)+1 & "]"
Local $p = DllStructCreate($tagCopyData)
Local $StringMSG = DllStructCreate($struct)
DllStructSetData($p, "dwData", "?") ; ?????
DllStructSetData($p, "cbData", DllStructGetSize($StringMSG)) ; размер структуры $StringMSG
DllStructSetData($p, "lpData", DllStructGetPtr($StringMSG)) ; указатель на структуру $StringMSG
DllStructSetData($StringMSG, 1, $String) ; строка сообщения

DllCall("user32.dll","long","SendMessage","hwnd",$HWnd_Grantee,"int",$WM_COPYDATA,"hwnd",$HWnd_Sender,"ptr",DllStructGetPtr($p))
EndFunc



#include <GuiConstants.au3>
;~ Global Const $WM_COPYDATA = 0x004A
Global $ArrMessage[2]
$Gui = GUICreate("Получатель",300,100)
$Dummy = GUICtrlCreateDummy()
$Label = GUICtrlCreateLabel("",10,10,280,20)
GUIRegisterMsg($WM_COPYDATA,"WM_COPYDATA")
GUISetState(@SW_SHOW)

While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
Exit
Case $Dummy
GUICtrlSetData($Label, $ArrMessage[0])
;MsgBox(0, "Получатель", "Получено сообщение от " & $ArrMessage[1] & @LF & _
;"Текст сообщения: " & $ArrMessage[0])
EndSwitch
WEnd

Func WM_COPYDATA($HWnd,$MsgID,$wParam,$lParam)
Local Const $tagCopyData = "dword dwData;dword cbData;ptr lpData"
Local $p = DllStructCreate($tagCopyData, $lParam)
Local $struct = "char [" & DllStructGetData($p, "cbData") & "]"
Local $StringMSG = DllStructCreate($struct, DllStructGetData($p, "lpData"))

$ArrMessage[0] = DllStructGetData($StringMSG,1) ; Строка сообщения
$ArrMessage[1] = $wParam ; Хэндл окна приложения отправителя
GUICtrlSendToDummy($Dummy)
EndFunc


И собственно вопрос, что должен содержать первый элемент(dwData) у структуры tCopyData?

P.S.
Как передать-принять командную строку если скрипт которому её нужно передать уже работает? Я в начале предположил что это можно реализовать через WM_COPYDATA используя два процесса. Может есть какой нибудь специальный способ?

Creat0R
03-12-2007, 06:38
amel27, обновление должен запрашивать не сам IE, а код загружаемой страницы в зависимости от требований ролика
Ого, это мне не постичь, я понятия не имею где код брать, и как его приминить тем более :dont-know .


этот макрос не задействован ни в одной UDF
Он приминяется в DllCallBack ;) (аж два раза :biggrin: ).

Насколько я знаю, это новый макрос, я его лично приминил пару раз (к примеру в проэкте KeyBoard and Mouse Cleaner (http://creator-lab.ucoz.ru/load/5-1-0-15) - для которго кстати мне и нужны функции блокирования клавиш ;)) - В ранних версиях аутоита использовался $DTM_SETFORMAT = 0x1005, в последних версиях нужно проверять юникодность, если скрипт в юникоде, тогда значение должно быть $DTM_SETFORMAT = 0x1032 (решение от самого Jon'а ;) ), иначе некорректно отображается формат времени (для GUICtrlCreateDate()) - почему аутоит сам не проверяет, я так и не понял :(.

Diamond, А в чём преимущество встроенной функции перед _GUICtrlListView_Create()
Сказать не могу, т.к не использовал никогда второй :) - но знаю что встроенная функция вполне идеальна для построения практический любого списка (как в плане стильности, так и в плане функциональности).

Оказалось что WM_SIZE срабатывает даже при команде развернуть-восстановить окно
Потому что меняется размер GUI ;)
Я бы использовал тут WM_SIZING, оно срабатывает в момент смены размеров.
Кстати если интересно, могу подкинуть функцию для автоматической смены размера колонок в ListView (сам писал), в момент смены размера GUI будут смещаться колонки в идентичный размер для каждой (опционально - либо по ширине списка, либо до последнего разделителя).

Передача строки другому приложению
На оф. форуме этот вопрос решили подобным путём (http://www.autoitscript.com/forum/index.php?showtopic=52198&st=0&p=394721&#entry394721), я же для себя использую такой метод (переделанные функции с того топика):

#include <GuiConstants.au3>

RegisterScriptMsg("SendMessage Test", $CmdLineRaw)

$Gui = GuiCreate("SendMessage Test")
GUISetState()

While 1
$Msg = GUIGetMsg()
Switch $Msg
Case -3
Exit
EndSwitch
WEnd

Func Main_Msg_Function($vsMsg)
MsgBox(0, "", "Recieved message:" & @LF & @LF & $vsMsg)
Exit
EndFunc

;=====================================
Func RegisterScriptMsg($sTitle, $vMsg)
Local $OccurName = StringReplace(@ScriptFullPath, "\", "")
Local $ERROR_ALREADY_EXISTS = 183

Local $ihWnd = WinGetHandle($sTitle)

Local $hDll = DllCall("kernel32.dll", "int", "CreateMutex", "int", 0, "long", 1, "str", $OccurName)
Local $iLastError = DllCall("kernel32.dll", "int", "GetLastError")
If $iLastError[0] = $ERROR_ALREADY_EXISTS Then
_AU3COM_SendData($vMsg, $ihWnd)
Exit
Else
Local Const $WM_COPYDATA = 0x4A
GUIRegisterMsg($WM_COPYDATA, "_GUIRegisterMsgProc")
EndIf
EndFunc

Func _GUIRegisterMsgProc($hWnd, $MsgID, $WParam, $LParam)
Local Const $WM_COPYDATA = 0x4A
If $MsgID = $WM_COPYDATA Then
Local $vsMsg = _AU3COM_RecvData($LParam)
Local $MSGRECVD = DllStructGetData($vsMsg, 1)
;Here is go whatever we need to do with the recieved string ($MSGRECVD)
Call("Main_Msg_Function", $MSGRECVD)
EndIf
EndFunc

Func _AU3COM_SendData($InfoToSend, $RecvWinHandle)
Local Const $WM_COPYDATA = 0x4A
Local $StructDef_COPYDATA = "dword var1;dword var2;ptr var3"
Local $CDString = DllStructCreate("char var1[256];char var2[256]") ;the array to hold the string we are sending

DllStructSetData($CDString, 1, $InfoToSend)
Local $pCDString = DllStructGetPtr($CDString) ;the pointer to the string
Local $vs_cds = DllStructCreate($StructDef_COPYDATA);create the message struct
DllStructSetData($vs_cds, "var1", 0) ;0 here indicates to the receiving program that we are sending a string
DllStructSetData($vs_cds, "var2", String(StringLen($InfoToSend) + 1));tell the receiver the length of the string
DllStructSetData($vs_cds, "var3", $pCDString) ;the pointer to the string
Local $pStruct = DllStructGetPtr($vs_cds)
DllCall("user32.dll", "long", "SendMessage", "hwnd", $RecvWinHandle, "int", $WM_COPYDATA, "int", 0, "int", $pStruct)

$vs_cds = 0 ;free the struct
$CDString = 0 ;free the struct

Return 1
EndFunc

Func _AU3COM_RecvData($COM_LParam)
; $COM_LParam = Poiter to a COPYDATA Struct
Local $STRUCTDEF_AU3MESSAGE = "char var1[256];int"
Local $StructDef_COPYDATA = "dword var1;dword var2;ptr var3"
Local $vs_cds = DllStructCreate($StructDef_COPYDATA, $COM_LParam)
; Member No. 3 of COPYDATA Struct (PVOID lpData;) = Pointer to Costum Struct
Local $vs_msg = DllStructCreate($STRUCTDEF_AU3MESSAGE, DllStructGetData($vs_cds, 3))
Return $vs_msg
EndFunc

Этот скрипт нужно запустить (не из SciTE), и потом запустить его ещё раз :) - получим ком. строку с которой запущен скрипт... очень полезно если нужно не запускать повторно копию скрипта, и при этом передать данные (такие как путь к "сбросанному" файлу в файл программы ;) ).

amel27
03-12-2007, 09:58
Diamond
собственно вопрос, что должен содержать первый элемент(dwData) у структуры tCopyData? »любое число - передается без изменений... можно использовать как "ветвитель" типа Select/Endselect для классификации получаемых структур данных... что-то типа собственной системы сообщений на базе WM_COPYDATA
Может есть какой нибудь специальный способ? »
тут они все перечислены: http://fort.stup.ac.ru/wmaster/books/magazine/pcmag/9708/089727.htm

Diamond
03-12-2007, 21:21
Creat0R,
встроенная функция вполне идеальна для построения практический любого списка (как в плане стильности, так и в плане функциональноти)
Согласен. :) Я имел ввиду что нет никаких преимуществ если из-за неё приходится отказываться от использования UDF.
Потому что меняется размер GUI ;)
Я бы использовал тут WM_SIZING, оно срабатывает в момент смены размеров.
Я сначала так и хотел сделать... но как оказалось она не срабатывает при команде развернуть-восстановить окно. :(
Кстати если интересно, могу подкинуть функцию для автоматической смены размера колонок в ListView
Конечно интересно.

Спасибо за пример. Кстати твой код мне показался проще и понятнее чем на офф. форуме.


#include <GuiConstantsEx.au3>
#include <Array.au3>
Global $UserCmdLine, $EventCmdLine
Global $Title = "CmdLine_Test"
RegisterScriptMsg($Title)

$Gui = GUICreate($Title, 400, 300)
$EventCmdLine = GUICtrlCreateDummy()
If $CmdLine[0] Then _ArrayDisplay($CmdLine,"CmdLine") ; OpenFile ($CmdLine)
GUISetState()

While 1
$Msg = GUIGetMsg()
Switch $Msg
Case $GUI_EVENT_CLOSE
Exit
Case $EventCmdLine
_ArrayDisplay($UserCmdLine,"UserCmdLine") ; OpenFile ($UserCmdLine)
EndSwitch
WEnd

Func RegisterScriptMsg($Title)
Local Const $WM_COPYDATA = 0x004A
Local Const $ERROR_ALREADY_EXISTS = 0x00B7
Local $String
Local $OccurName = StringReplace(@ScriptFullPath, "\", "")
DllCall("kernel32.dll", "int", "CreateMutex", "int", 0, "long", 1, "str", $OccurName)
Local $iLastError = DllCall("kernel32.dll", "int", "GetLastError")
If $iLastError[0] = $ERROR_ALREADY_EXISTS Then
If $CmdLine[0] Then
$String = $CmdLine[1]
For $i = 2 To $CmdLine[0]
$String &= "|" & $CmdLine[$i]
Next
Local $HWnd = WinGetHandle($Title)
Local Const $tagCopyData = "dword dwData;dword cbData;ptr lpData"
Local $struct = "char [" & StringLen($String)+1 & "]"
Local $p = DllStructCreate($tagCopyData)
Local $StringMSG = DllStructCreate($struct)
DllStructSetData($p, "dwData", 0)
DllStructSetData($p, "cbData", DllStructGetSize($StringMSG)) ; размер структуры $StringMSG
DllStructSetData($p, "lpData", DllStructGetPtr($StringMSG)) ; указатель на структуру $StringMSG
DllStructSetData($StringMSG, 1, $String) ; строка сообщения
DllCall("user32.dll","long","SendMessage","hwnd",$HWnd,"int",$WM_COPYDATA,"hwnd",0,"ptr",DllStructGetPtr($p))
EndIf
Exit
Else
GUIRegisterMsg($WM_COPYDATA, "WM_COPYDATA")
EndIf
EndFunc

Func WM_COPYDATA($HWnd, $MsgID, $wParam, $lParam)
Local Const $tagCopyData = "dword dwData;dword cbData;ptr lpData"
Local $p = DllStructCreate($tagCopyData, $lParam)
Local $struct = "char [" & DllStructGetData($p, "cbData") & "]"
Local $StringMSG = DllStructCreate($struct, DllStructGetData($p, "lpData"))
$UserCmdLine = StringSplit(DllStructGetData($StringMSG,1),"|")
GUICtrlSendToDummy($EventCmdLine)
EndFunc

GUICtrlSendToDummy() я использую для того чтобы как можно быстрее выйти из функции и отпустить "передающий процесс".
От $CmdLineRaw решил отказаться потому что не знаю как правильно разобрать строку.

Creat0R
04-12-2007, 04:11
Diamond,
нет никаких преимуществ если из-за неё приходится отказываться от использования UDF
Я лично имею такое мнение: если UDF ни чем не лучше встроенной функции, то лучше использовать оригинал (встроенную функцию) - всегда надёжнее, но это конечно моё имхо :).

Конечно интересно.

#include <GuiConstants.au3>

$Main_GUI = GUICreate("ListView Set Equel Column Width", 340, 260, -1, -1, $WS_OVERLAPPEDWINDOW)

$ListView = GUICtrlCreateListView("col1|col2|col3", 20, 30, 300, 150, _
$LVS_SHOWSELALWAYS+$LVS_NOSORTHEADER, $LVS_EX_FULLROWSELECT+$LVS_EX_GRIDLINES)

GUICtrlCreateListViewItem("line1|data1|more1", $ListView)
GUICtrlCreateListViewItem("line2|data2|more2", $ListView)
GUICtrlCreateListViewItem("line3|data3|more3", $ListView)
GUICtrlCreateListViewItem("line4|data4|more4", $ListView)
GUICtrlCreateListViewItem("line5|data5|more5", $ListView)

$Set_Equel_Button = GUICtrlCreateButton("Set Equel Width", 20, 190, 100, 20)
$Set_Full_Button = GUICtrlCreateButton("Set Full Width", 20, 220, 100, 20)

GUISetState()

GUIRegisterMsg($WM_SIZE, "WM_SIZE")

While 1
$iMsg = GUIGetMsg()
Switch $iMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Set_Full_Button, $GUI_EVENT_MAXIMIZE, $GUI_EVENT_RESTORE
_GUICtrlListViewSetEquelColWidth($Main_GUI, $ListView, 1)
Case $Set_Equel_Button
_GUICtrlListViewSetEquelColWidth($Main_GUI, $ListView, 0)
EndSwitch
WEnd

Func WM_SIZE($hWndGUI, $MsgID, $WParam, $LParam)
;По каким то причинам функция не срабатывает корректно при разворачивании/восстановлении,
;поэтому пусть стандартный обработчик справляется с этими событиями ($GUI_EVENT_MAXIMIZE, $GUI_EVENT_RESTORE)..
_GUICtrlListViewSetEquelColWidth($hWndGUI, $ListView, 1)
EndFunc

Func _GUICtrlListViewSetEquelColWidth($hWnd, $hLV, $iFullMode=1)
If Not IsHWnd($hLV) Then $hLV = ControlGetHandle($hWnd, "", $hLV)
If @error Then Return SetError(1, 0, -1)

Local $LV_Header = DllCall("user32.dll", "long", "SendMessage", "hwnd", $hLV, "int", $LVM_GETHEADER, "int", 0, "int", 0)
If @error Then Return SetError(2, 0, -1)

;Local Const $HDM_GETITEMCOUNT = 0x1200
Local $sItmsCnt = DllCall("user32.dll", "long", "SendMessage", "hwnd", $LV_Header[0], "int", 0x1200, "int", 0, "int", 0)
If @error Then Return SetError(3, 0, -1)

Local $Columns_Count = $sItmsCnt[0]
Local $iLV_Width = 0

Switch $iFullMode
Case 0
Local $Columns_Width = 0
Local $GetColumns_Width

For $i = 0 To $Columns_Count
$GetColumns_Width = DllCall("user32.dll", "long", "SendMessage", _
"hwnd", $hLV, "int", $LVM_GETCOLUMNWIDTH, "int", $i, "int", 0)
$Columns_Width += $GetColumns_Width[0]
Next

$iLV_Width = $Columns_Width / $Columns_Count
Case 1
Local $sLV_Width = ControlGetPos($hWnd, "", $hLV)
If @error Then Return SetError(4, 0, 0)

$iLV_Width = ($sLV_Width[2]-10) / $Columns_Count
Case Else
Return SetError(5, 0, -1)
EndSwitch

For $i = 0 To $Columns_Count
DllCall("user32.dll", "long", "SendMessage", "hwnd", $hLV, "int", $LVM_SETCOLUMNWIDTH, "int", $i, "int", $iLV_Width)
Next
EndFunc

Правда почему то функция не срабатывает корректно при разворачивании/восстановлении, поэтому пусть стандартный обработчик справляется с этими событиями ($GUI_EVENT_MAXIMIZE, $GUI_EVENT_RESTORE).

Но зато она работает и на внешних приложениях ;)

твой код мне показался проще и понятнее чем на офф. форуме
Мне тоже :)

GUICtrlSendToDummy() я использую для того чтобы как можно быстрее выйти из функции и отпустить "передающий процесс".
Кстати, у меня есть старый пример с использованием фиктивной Label (для получения данных), я как то не подумал о том что можно Dummy использовать - спасибо.

HORRIBLE
04-12-2007, 12:45
Всем еще раз привет.

есть такой код:

$file3= FileOpen("DONE.txt", 1)
$file4= FileOpen("NOT DONE.txt", 1)


$File1=false


If $File1 = false then
MsgBox(0, "Info", "Disable '&$File1&'.", 3)
FileWrite($file4, " '&$File1&' Disable User")
Else
MsgBox(0, "Info", "DElaem '&$File1&'.", 3)
RunWait("ACDSee.exe")
FileWrite($file3,&@CRLF " '&$File1&' Ystanovleno" &@CRLF)
EndIF

Вопрос, как присвоить переменной $File имя ACDSee чтобы в окошке MsgBox когда оно выскакивало был текст Disable ACDSee, а не Disable '&$File1&' . Ну и соответственно в записаном файле тоже самое было.

И можно ли как нить создать переменную, с именем пользователя в винде? (Короче говоря какое имя у пользователя в винде, такое же имя и у переменной.) Чтоб она сама себе присваивало, это имя?

Спасибо.

Creat0R
04-12-2007, 15:30
HORRIBLE, как присвоить переменной $File имя ACDSee чтобы в окошке MsgBox когда оно выскакивало был текст Disable ACDSee, а не Disable '&$File1&'
Та нужно использовать двойные кавычки...

$file3 = FileOpen("DONE.txt", 1)
$file4 = FileOpen("NOT DONE.txt", 1)

$File1 = false

If $File1 = false then
MsgBox(0, "Info", "Disable " & $File1 & ".", 3)
FileWrite($file4, " " & $File1 & " Disable User")
Else
MsgBox(0, "Info", "DElaem " & $File1 & ".", 3)
RunWait("ACDSee.exe")
FileWrite($file3, @CRLF & " " & $File1 & " Ystanovleno" & @CRLF)
EndIF

можно ли как нить создать переменную, с именем пользователя в винде?
Макрос @UserName ?

HORRIBLE
04-12-2007, 16:30
Creat0R,
Дык, а где я должен задать, что $file1 это есть Acdsee, ведь значение false говорит только, что я типо дела отменил установку.
Если делать как ты говоришь, то получается Disable false, а мне немного другое надо.


Макрос @UserName ? »
А этот макрос так просто в строку вставлять чтобы вывести имя пользователя, к примеру в файл или как??

Creat0R
04-12-2007, 16:57
а где я должен задать, что $file1 это есть Acdsee, ведь значение false говорит только, что я типо дела отменил установку »
Ну немного воображения приминить никогда не повредит ;) - можно создать другую переменную...

Global $ACDSeeVar = "ACDSee"

$file3 = FileOpen("DONE.txt", 1)
$file4 = FileOpen("NOT DONE.txt", 1)

$File1 = false

If $File1 = false then
MsgBox(0, "Info", "Disable " & $ACDSeeVar & ".", 3)
FileWrite($file4, " " & $ACDSeeVar & " Disable User")
Else
MsgBox(0, "Info", "DElaem " & $ACDSeeVar & ".", 3)
RunWait("ACDSee.exe")
FileWrite($file3, @CRLF & " " & $ACDSeeVar & " Ystanovleno" & @CRLF)
EndIF


P.S
В справке много полезного ;) - просто нужно немного терпения при её чтении.

HORRIBLE
04-12-2007, 17:04
Creat0R, )
Спасибо. Чет я сглупил, а все так просто оказалось)). Я хотел обойтись ток 1 переменной. Наивный.

Creat0R
05-12-2007, 05:13
По мативам примера из справки (http://www.autoitscript.com/autoit3/docs/functions/DllCall.htm) (при использовании фикса очередного бага (http://www.autoitscript.com/forum/index.php?showtopic=58684) в примерах справки), я написал функцию для открытия системного диалога выбора иконки:


$sFileName = @SystemDir & "\User32.dll"
$WinHandle = WinGetHandle("")

$stRet = _PickIconDlg($sFileName, 1, $WinHandle)

If Not @error Then
$sFileName = $stRet[0]
$nIconIndex = $stRet[1]
Msgbox(64, "Info", "Selected file: " & $sFileName & @LF & "Icon-Index: " & $nIconIndex)
EndIf

;=====================================================================================
;
; Function Name: _PickIconDlg()
; Description: Show the Windows PickIconDlg.
;
; Parameter(s): $sFileName - Path to icon file to be used as initial pick file.
; $nIconIndex - [Optional] Default Icon zero-based Index to pick (default is 0).
; $hWnd - [Optional] Handle of owner window (Default is 0).
;
; Requirement(s): None.
; Return Value(s): On Success - Returns 2 elements array:
; $stRetArr[0] = Selected Icons File Path.
; $stRetArr[1] = Picked Index from the icon file.
; On Failure - If "Cancel" button was pressed, return 2 elements array with initial data.
; On DllCall() fail return -1.
; In both cases @error is set to 1.
; Author(s): G.Sandler (CreatoR), the main concept is taken from AutoIt Help file.
;
;======================================================================================
Func _PickIconDlg($sFileName, $nIconIndex=0, $hWnd=0)
Local $stIcon, $stString, $nStructSize, $nRetErr, $stRetArr[2]

; Create a structure to store the icon index
$stIcon = DllStructCreate("int")
DllStructSetData($stIcon, 1, $nIconIndex)

If @OSType = "WIN32_NT" Then
; Win NT
$stString = DLLStructCreate("wchar[260]")
DllStructSetData($stString, 1, $sFileName)
$nStructSize = DllStructGetSize($stString) / 2
Else
; Win'9x
$stString = DLLStructCreate("char[260]")
DllStructSetData($stString, 1, $sFileName)
$nStructSize = DllStructGetSize($stString)
EndIf

; Run the PickIconDlg - '62' is the ordinal value for this function
$nRetErr = DllCall("shell32.dll", "int", 62, _
"hwnd", $hWnd, _
"ptr", DllStructGetPtr($stString), _
"int", $nStructSize, _
"ptr", DllStructGetPtr($stIcon))
If @error Then $nRetErr = 1

$stRetArr[0] = DllStructGetData($stString, 1)
$stRetArr[1] = DllStructGetData($stIcon, 1)

$stString = 0
$stIcon = 0

If $nRetErr = 1 Then Return SetError(1, 0, -1)
If Not $nRetErr[0] Then $nRetErr = 1

Return SetError($nRetErr, 0, $stRetArr)
EndFunc


Добавленно:

Вы не поверите, как только я запостил эту функцию, я на оф. форуме совершенно случайно наткнулся на подобную функцию (http://www.autoitscript.com/forum/index.php?s=&showtopic=7072&view=findpost&p=179904), а точнее всего одну строчку вызовом Dll !!!

Вот функция на основе этой строчки :) ...


Func _PickIconDlg($sFileName, $nIconIndex=0, $hWnd=0)
Local $nRet, $stRetArr[2]
$nRet = DllCall("shell32.dll", "int", "PickIconDlg", _
"hwnd", $hWnd, _
"wstr", $sFileName, "int", 1000, "int_ptr", $nIconIndex)
If Not $nRet[0] Then Return SetError(1, 0, -1)

$stRetArr[0] = $nRet[2]
$stRetArr[1] = $nRet[4]

Return $stRetArr
EndFunc

Maza Faka
05-12-2007, 08:01
Creat0R
А как можно создать toolbar http://new-page.info/archives/toolbar.jpg
, если можно, с примерами пожалуйста.

Creat0R
05-12-2007, 23:11
Maza Faka,
А как можно создать toolbar
На оф. форуме полагаю тебе уже ответили (http://www.autoitscript.com/forum/index.php?s=&showtopic=58781&view=findpost&p=443475) ;)

Я скоро выложу «AutoIt Bar», там не совсем оригинальный тулбар, но что-то похожее, предназначен в помощь скриптеру AutoIt'а ;)




© OSzone.net 2001-2012