Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [архив - Часть 2] AutoIt скрипты

Закрытая тема
Настройки темы
[архив - Часть 2] AutoIt скрипты

(*.*)


Сообщения: 36568
Благодарности: 6698


Конфигурация

Профиль | Сайт | Отправить PM | Цитировать


Изменения
Автор: Vadikan
Дата: 27-01-2008
Внимание!
Тема переведена в архивное состояние







(настоятельно рекомендуется к прочтению/поиску)


Руководство к действию по работе c AutoIt.


Сайт программы
Русская справка
Коллекция AutoIt скриптов от Sanja Alone
Коллекция AutoIt скриптов от MSFN (могут быть устаревшие).
Справочник по командам rundll32 (команды запуска диалоговых окон и не только...)

AutoIt скрипты - введение и FAQ (статья содержит вводную информацию по AutoIt, а также ответы на ЧаВо).



Данная тема предназначена для общих вопросов по AutoIt. Вопросы по установке приложений при помощи AutoIt следует задавать в соответствии с правилами форума "Автоматическая установка приложений". Таким образом, если вы хотите узнать как установить Winamp 5.x при помощи AutoIt, то создайте тему [autoit] Winamp 5.х (если таковой еще нет на форуме). Проверить наличие тем можно при помощи поиска или фильтров.
Цитата Vadikan:
В теме уже свыше 500 сообщений и поиск нужной информации в ней усложняется. Есть предложение собрать все решения (скрипты) и разместить их на Wiki по принципу "один скрипт - одна статья wiki", добавляя статьи в категорию Autoit. Речь, в принципе, идет об общих решениях, а не о скриптах для установки конкретной программы. Название статьи, очевидно, должно отражать назначение скрипта. Затем можно в шапке просто разместить ссылки на статьи Wiki.

-------
Канал Windows 11, etc | Чат @winsiders

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:02, 05-02-2006

 

Пользователь


Сообщения: 135
Благодарности: 32

Профиль | Отправить PM | Цитировать


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 решил отказаться потому что не знаю как правильно разобрать строку.
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:21, 03-12-2007 | #811



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


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 использовать - спасибо.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 04:11, 04-12-2007 | #812


Пользователь


Сообщения: 143
Благодарности: 24

Профиль | Отправить PM | Цитировать


Всем еще раз привет.

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

$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&' . Ну и соответственно в записаном файле тоже самое было.

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

Спасибо.

Отправлено: 12:45, 04-12-2007 | #813


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


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 ?

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:30, 04-12-2007 | #814


Пользователь


Сообщения: 143
Благодарности: 24

Профиль | Отправить PM | Цитировать


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


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

Последний раз редактировалось HORRIBLE, 04-12-2007 в 16:56.


Отправлено: 16:30, 04-12-2007 | #815


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата HORRIBLE:
а где я должен задать, что $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
В справке много полезного - просто нужно немного терпения при её чтении.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 16:57, 04-12-2007 | #816


Пользователь


Сообщения: 143
Благодарности: 24

Профиль | Отправить PM | Цитировать


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

Отправлено: 17:04, 04-12-2007 | #817


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


По мативам примера из справки (при использовании фикса очередного бага в примерах справки), я написал функцию для открытия системного диалога выбора иконки:

Код: Выделить весь код
$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

Добавленно:

Вы не поверите, как только я запостил эту функцию, я на оф. форуме совершенно случайно наткнулся на подобную функцию, а точнее всего одну строчку вызовом 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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Последний раз редактировалось Creat0R, 05-12-2007 в 05:33.

Это сообщение посчитали полезным следующие участники:

Отправлено: 05:13, 05-12-2007 | #818


Аватара для Maza Faka

Ветеран


Сообщения: 604
Благодарности: 133

Профиль | Отправить PM | Цитировать


Creat0R
А как можно создать toolbar
, если можно, с примерами пожалуйста.

Отправлено: 08:01, 05-12-2007 | #819


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Maza Faka,
Цитата:
А как можно создать toolbar
На оф. форуме полагаю тебе уже ответили

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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 23:11, 05-12-2007 | #820



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [архив - Часть 2] AutoIt скрипты

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Открывая 7z архив пишет не удаётся открыть как архив. Можно ли его восстановить? DreDo Хочу все знать 4 01-12-2009 18:54
[Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:. Vadikan AutoIt 1543 18-01-2009 10:46
[Архив - Часть 1.3] AutoIt скрипты biork AutoIt 503 09-06-2007 11:27
[Архив - Часть 1.2] AutoIt скрипты Dirk Diggler AutoIt 505 02-12-2006 11:00
[Архив - Часть 1.1] AutoIt скрипты EgOrus AutoIt 335 04-02-2006 16:58




 
Переход