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

Компьютерный форум 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,
Цитата:
Написал тут утилитку для сохранения и восстановления позиции иконок рабочего стола...
Очень нужная вещь, спасибо.

Отправлено: 09:32, 17-09-2007 | #451



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

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


Новый участник


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

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


Надо создать 3D array который открывает 5 окон internet explorer и делает на каждом окне timestamp после того как иссекает контрольное время, например 1 мин, надо закрыть конкретное окно и заменить его новым окном. Размер каждого окна должен быть 800х560.

я не совсем понимаю как это сделать...
вот что у меня есть пока:
Код: Выделить весь код
HotKeySet("{ESC}", "Terminate")
; Set Coordinate mode to relative to window
AutoItSetOption ( "PixelCoordMode", 0 )
Run("C:\Program Files\Internet Explorer\IEXPLORE.EXE")
Sleep(2000)
;MsgBox(0, "Active window stats (x,y,width,height):", $WindowPosition[0] & " " & $WindowPosition[1] & " " & $WindowPosition[2] & " " & $WindowPosition[3], 1)
WinMove($WindowName, "", $array[1],[1])
Call("TimeStamp")

$array[1][1] = _ArrayCreate(0, 0)
$array[2][1] = _ArrayCreate(0, 0) 
$array[2][2] = _ArrayCreate(0, 800) 
$array[2][3] = _ArrayCreate(560, 0) 
$array[2][3] = _ArrayCreate(560, 800) 


Func TimeStamp()
    $TimeStampFileName = $TimeStampFilePath & TimerInit() &".tsp"
;MsgBox(0, $TimeStampFileName, $TimeStampFileName, 2)
    FileDelete($TimeStampFilePath & "*.tsp")
    _FileCreate ($TimeStampFileName)
EndFunc  ;==>TimeStamp

Func Terminate()
;MsgBox(0, "Entering Terminate Function...","",3)
    Exit 0
EndFunc  ;==>Terminate

Отправлено: 12:15, 17-09-2007 | #452


Аватара для Creat0R

Must AutoIt


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

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


Diamond,
Цитата:
Очень нужная вещь
Я тоже так подумал перед началом написания скрипта (а ведь иидея не моя )...

Обновил программку...
Список изменении в добавленном Readme.txt, или в топике на оф. форуме

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

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

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


Отправлено: 08:02, 21-09-2007 | #453


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

Ветеран


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

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


Привет всем, написал скриптик для закачки файла с отображением прогресса закачки, но мне не нравится, как реализована функция ProgressSet, может есть более красивое решение подсчёта и отображения процента закачки файла.
Код: Выделить весь код
$url = "http://game.chirkom.uz/download/hard/cpu-z-123.zip"
$NameArr = StringSplit($url, "/")
$name = $NameArr[$NameArr[0]]
$size = InetGetSize($url)

If $size Then
    $answer = MsgBox(1, "Warning", "The file size = " & $size & " bytes download now?")
    If $answer = 2 Then
        MsgBox(64, "Cancel", "Donloading canceled")
        Exit 1
    ElseIf $answer = 1 Then
        $sGet = FileDownload($url)
        If $sGet = -1 Then
            MsgBox(16, "Error", "DownLoading error")
            Exit 1
        EndIf
        MsgBox(64, "Done", $sGet)
    Else
        Exit
    EndIf
Else
    MsgBox(16, "Error", "File not exist")
EndIf

Func FileDownload($url)
    Local $fileGet = InetGet($url, @TempDir & "\" & $name, 1, 1)
    If Not $fileGet Then Return SetError(1, 0, -1)
        ProgressOn("Please wait...", "Downloading file")
        $dec = $size / 100
        $dSize = $dec
        $percent = 0
        While @InetGetActive
            If @InetGetBytesRead >= $dSize Then
                $dSize += $dec
                $percent += 1
                ProgressSet($percent, $percent & " percent downloading")
            EndIf

                    TrayTip("DownLoading", "Bytes = " & @InetGetBytesRead, 10, 1)
        Sleep(10)
    WEnd
    ProgressSet(100, "Done")
    Sleep(1000)
    ProgressOff()
    Return "Downloading successfull"
EndFunc

Отправлено: 09:33, 21-09-2007 | #454


Аватара для Creat0R

Must AutoIt


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

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


Maza Faka,
Цитата:
может есть более красивое решение подсчёта и отображения процента закачки файла
Посмотри страниц где то 10-20 назад (легче в версии для печати), мы с amel27 вроде это обсуждали тут.

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

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

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


Отправлено: 09:44, 21-09-2007 | #455


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

Ветеран


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

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


Creat0R
Как сделать, что бы левой кнопкой мыши можно было перетаскивать (drag) элемент Label в пределах GUI-окна?
Никак не могу достучаться тебе в аську, мой ник DeVil

Отправлено: 10:22, 21-09-2007 | #456


Аватара для Creat0R

Must AutoIt


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

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


Maza Faka,
Цитата:
Как сделать, что бы левой кнопкой мыши можно было перетаскивать (drag) элемент Label в пределах GUI-окна?
Нужно отлавливать нажатие мышки, а потом MouseGetPos() + GuiCtrlSetPos()

Код: Выделить весь код
#include <GuiConstants.au3>
Opt("MouseCoordMode", 2)

$Gui = GuiCreate("Test")
$Label = GUICtrlCreateLabel("My Label, Move me ;)", 20, 20)

GUISetState()

While 1
    $Msg = GUIGetMsg()

        Switch $Msg
        Case -3
            Exit
        Case Else
            $CurInfo = GUIGetCursorInfo($Gui)
            While $CurInfo[2] = 1 And $CurInfo[4] = $Label
                $CurInfo = GUIGetCursorInfo($Gui)
                $LabelPos = ControlGetPos($Gui, "", $Label)
                If $LabelPos[0] <> MouseGetPos(0) Or $LabelPos[1] <> MouseGetPos(1) Then
                    GUICtrlSetPos($Label, MouseGetPos(0), MouseGetPos(1))
                Else
                    Sleep(5)
                EndIf
            WEnd
    EndSwitch
WEnd

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

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

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

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

Отправлено: 10:54, 21-09-2007 | #457


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


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

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


Утилита для подбора цвета:
Код: Выделить весь код
#NoTrayIcon
#include <GUIConstants.au3> 
#include <Misc.au3>
Global Const $WM_HSCROLL = 0x0114
Global $red=255, $green=0, $blue=0, $x=0, $st=5, $N
$Colorizer=GUICreate("Сolorizer (RGB)","320","200",-1,-1,-1,$WS_EX_TOPMOST)
	GUISetBkColor (0x000000)
Dim $CTRL_edit[3]
$CTRL_edit[0] = GUICtrlCreateEdit ("0", 5, 5, 34, 18,$ES_NUMBER)
	GUICtrlSetTip (-1,"Red")
	GUICtrlSetLimit (-1, 3)
$CTRL_edit[1] = GUICtrlCreateEdit ("0", 5, 30, 34, 18,$ES_NUMBER)
	GUICtrlSetTip (-1,"Green")
	GUICtrlSetLimit (-1, 3)
$CTRL_edit[2] = GUICtrlCreateEdit ("0", 5, 55, 34, 18,$ES_NUMBER)
	GUICtrlSetTip (-1,"Blue")
	GUICtrlSetLimit (-1, 3)
Dim $CTRL_slider[3] = [GUICtrlCreateSlider(54,5,255,20), GUICtrlCreateSlider(54,30,255,20), GUICtrlCreateSlider(54,55,255,20)]
For $i=0 To 2
	GUICtrlSetLimit($CTRL_slider[$i],255,0)
	GUICtrlSetBkColor($CTRL_slider[$i],0x000000)
Next
$CTRL_edit_hex = GUICtrlCreateEdit ("0x000000", 5, 145, 80, 18,$ES_READONLY)
	GUICtrlSetTip (-1,"Шестнадцатиричное представление")
$Button_ChooseColor = GUICtrlCreateButton("Цвет",240,95,60,20)
$ButtonDr           = GUICtrlCreateButton("Пипетка",240,120,60,20)
$ButtonRnd         = GUICtrlCreateButton("Случайно",240,145,60,20)
For $i = $Button_ChooseColor To $ButtonRnd
	_ButtonClassicStyle($i)
	GUICtrlSetCursor ($i,0)
Next
$Gr=GUICtrlCreateGraphic(4,174,0,0)
$GrCover=GUICtrlCreatePic("",2,174,316,20,-1,$WS_EX_CLIENTEDGE)
Draw_ToneScale()
GUIRegisterMsg($WM_HSCROLL, "WM_SCROLL")
GUISetState(@SW_SHOWNORMAL)
;--------------------------------------
While 1
	$msg=GUIGetMsg()
	Switch $msg
		Case $GUI_EVENT_PRIMARYUP
			GUIRegisterMsg($WM_HSCROLL, "WM_SCROLL")
			ToolTip("")
		Case $GUI_EVENT_PRIMARYDOWN
			GUIRegisterMsg($WM_HSCROLL, "WM_SCROLL_2")
		Case $GUI_EVENT_CLOSE
			Exit
		Case $ButtonRnd
			randomize()
		Case $ButtonDr
			dropper()
		Case $Button_ChooseColor
			ChooseColor()
		Case $CTRL_edit[0] To $CTRL_edit[2]
			$N = $msg - $CTRL_edit[0]
			Input()
		Case $CTRL_slider[0] To $CTRL_slider[2]
			$N = $msg - $CTRL_slider[0]
			slEvent()
		Case $GrCover
			DropperScale()
	EndSwitch
WEnd

;~ Тоновая шкала:
Func Draw_ToneScale()
For $i=0 To 255 Step $st
	$green=$i
	SetColor()
Next
For $i=0 To 255  Step $st
	$red=255-$i
	SetColor()
Next
For $i=0 To 255 Step $st
	$blue=$i
	SetColor()
Next
For $i=0 To 255 Step $st
	$green=255-$i
	SetColor()
Next
For $i=0 To 255 Step $st
	$red=$i
	SetColor()
Next
For $i=0 To 255 Step $st
	$blue=255-$i
	SetColor()
Next
EndFunc

Func SetColor()
	Local $color='0x' & Hex($red,2) & Hex($green,2) & Hex($blue,2)
	GUICtrlSetGraphic($Gr,$GUI_GR_COLOR, $color)
	GUICtrlSetGraphic($Gr,$GUI_GR_RECT,$x,0,1,20)
	$x+=1
EndFunc

Func Input()
Local $color[3] = [GUICtrlRead($CTRL_edit[0]),GUICtrlRead($CTRL_edit[1]),GUICtrlRead($CTRL_edit[2])]
Local $str, $i, $ret="0x"
For $i=0 To 2
	If $color[$i]="" Then
		$color[$i]="0"
	ElseIf $color[$i]>255 Then
		$color[$i]="255"
	EndIf
	$ret &= Hex($color[$i],2)
Next
GUICtrlSetData ($CTRL_edit_hex,$ret)
GUICtrlSetData($CTRL_edit[$N],$color[$N])
GUICtrlSetData($CTRL_slider[$N],$color[$N])
GUISetBkColor($ret,$Colorizer)
;~ Меняем фоновый цвет слайдеров:
For $j=0 To 2
	GUICtrlSetBkColor($CTRL_slider[$j],$ret)
Next
EndFunc

Func slEvent()
	Local $slColor=GUICtrlRead($CTRL_slider[$N])
	GUICtrlSetData ($CTRL_edit[$N],$slColor)
	GUICtrlSetState($CTRL_slider[$N],$GUI_FOCUS)
	Input()
	;~ Возвращаем утраченный фокус элементу:
	GUICtrlSetState($CTRL_slider[$N],$GUI_FOCUS)
EndFunc

Func randomize()
	Local $i, $HexColor ='0x'
	For $i=0 to 2
		$rnd = int(Random(0,255))
		$HexColor &= Hex($rnd,2)
		GUICtrlSetData($CTRL_edit[$i],$rnd)
		GUICtrlSetData($CTRL_slider[$i],$rnd)
	Next
	For $i=0 to 2
		GUICtrlSetBkColor($CTRL_slider[$i],$HexColor)
	Next
	GUICtrlSetData($CTRL_edit_hex,$HexColor)
	GUISetBkColor($HexColor,$Colorizer)
EndFunc

Func dropper()
Local $Time=TimerInit()
GUICtrlSetState($ButtonDr,$GUI_DISABLE)
ToolTip("Кликните мышью в любом месте экрана",Default,Default,"",0,3)
While 1
	Sleep (1) ; Символический таймаут для уменьшения CPU!!!
	$click=GUIGetCursorInfo ($Colorizer)
	If TimerDiff($Time)>2300 Then ToolTip("")
	If $click[2] Then 
		$Mouse=MouseGetPos()
		$x=$Mouse[0]
		$y=$Mouse[1]
		$DrColor=Hex(PixelGetColor ($x,$y ),6)
		$j=1
		For $i=0 to 2
			$Dr=Dec(StringMid($DrColor,$j,2))
			GUICtrlSetData($CTRL_edit[$i],$Dr)
			GUICtrlSetData($CTRL_slider[$i],$Dr)
			$j += 2
		Next
		For $i=0 to 2
			GUICtrlSetBkColor($CTRL_slider[$i],'0x' & $DrColor)
		Next
		GUICtrlSetData($CTRL_edit_hex,'0x' & $DrColor)
		GUISetBkColor('0x' & $DrColor,$Colorizer)
		GUICtrlSetState($ButtonDr,$GUI_ENABLE)
		ExitLoop
	EndIf
WEnd
EndFunc

Func DropperScale()
	GUICtrlSetCursor($GrCover,3)
	$coord = _GetControlPos ($Colorizer, $GrCover)
	While 1
		$i_msg = GUIGetMsg()
		If $i_msg = $GUI_EVENT_PRIMARYUP Then ExitLoop
		_MouseTrap($coord[0]+2,$coord[1]+2,$coord[2]-2,$coord[3]-2)
	WEnd
	Local $Mouse=MouseGetPos()
	Local $DrColor=Hex(PixelGetColor ($Mouse[0],$Mouse[1]),6)
	_MouseTrap()
	GUICtrlSetCursor($msg,2)
	Local $j=1
	For $i=0 to 2
		$Dr=Dec(StringMid($DrColor,$j,2))
		GUICtrlSetData($CTRL_edit[$i],$Dr)
		GUICtrlSetData($CTRL_slider[$i],$Dr)
		$j += 2
	Next
	For $i=0 to 2
		GUICtrlSetBkColor($CTRL_slider[$i],'0x' & $DrColor)
	Next
	GUICtrlSetData($CTRL_edit_hex,'0x' & $DrColor)
	GUISetBkColor('0x' & $DrColor,$Colorizer)
EndFunc

;~ Author: Diamond
Func _GetControlPos($HWND, $ControlId)
	Local $Win        = WinGetPos($HWND)
	Local $Client     = WinGetClientSize($HWND)
	Local $Control    = ControlGetPos($HWND,"",$ControlId)
	Local $BorderSize = ($Win[2]-$Client[0])  / 2
	Local $PanelSize  = $Win[3] - $Client[1]  - $BorderSize
	Local $array[4]
	$array[0] = $Win[0]   + $BorderSize + $Control[0] ; left
	$array[1] = $Win[1]   + $PanelSize  + $Control[1] ; $top 
	$array[2] = $array[0] + $Control[2]               ; right
	$array[3] = $array[1] + $Control[3]               ; bottom
	Return $array
EndFunc

Func ChooseColor()
	GUISetState(@SW_DISABLE)
	SetOnTop($Colorizer,1)
	Local $HexColor = '0x'
	Local $BGR=ColorPicker(SwitchColor(GUICtrlRead($CTRL_edit_hex)))
	GUISetState(@SW_ENABLE)
	SetOnTop($Colorizer,-1)
	If $BGR = -1 Then Return
	For $i=0 to 2
		$HexColor &= Hex($BGR[$i+1],2)
		GUICtrlSetData($CTRL_edit[$i],$BGR[$i+1])
		GUICtrlSetData($CTRL_slider[$i],$BGR[$i+1])
	Next
	For $i=0 to 2
		GUICtrlSetBkColor($CTRL_slider[$i],$HexColor)
	Next
	GUICtrlSetData($CTRL_edit_hex,$HexColor)
	GUISetBkColor($HexColor,$Colorizer)
EndFunc

Func ColorPicker($Default=0)
	Local $p = DllStructCreate("dword;int;int;int;ptr;dword;int;ptr;ptr")
		DllStructSetData($p, 1, DllStructGetSize($p))
		DllStructSetData($p, 2, 0)
		DllStructSetData($p, 4, $Default)
		DllStructSetData($p, 5, DllStructGetPtr(DllStructCreate("int[16]")))
		DllStructSetData($p, 6, BitOR(0x100, 0x2, 0x1))
	$ret = DllCall("comdlg32.dll", "long", "ChooseColor", "ptr",DllStructGetPtr($p))
	If $ret[0] = False Then Return -1
	Local $color_picked = DllStructGetData($p, 4)
	$color_picked = Hex(String($color_picked), 6)
	Local $array[4]
	$array[0]="0x" & StringRight($color_picked,2) & StringMid($color_picked,3,2) & StringLeft($color_picked,2)
	$array[1]=Number("0x" & StringRight($color_picked,2)) ; RED
	$array[2]=Number("0x" & StringMid($color_picked,3,2)) ; GREEN
	$array[3]=Number("0x" & StringLeft($color_picked,2))  ; BLUE
	Return $array
EndFunc

Func WM_SCROLL($hWndGUI, $MsgID, $WParam, $LParam)
	Switch $LParam
        Case GUICtrlGetHandle($CTRL_slider[0])
            $N = 0
		Case GUICtrlGetHandle($CTRL_slider[1])
			$N = 1
		Case GUICtrlGetHandle($CTRL_slider[2])
			$N = 2
	EndSwitch
		slEvent()
EndFunc

Func WM_SCROLL_2($hWndGUI, $MsgID, $WParam, $LParam)
	Local $title
	Switch $LParam
        Case GUICtrlGetHandle($CTRL_slider[0])
            $N = 0
		Case GUICtrlGetHandle($CTRL_slider[1])
			$N = 1
		Case GUICtrlGetHandle($CTRL_slider[2])
			$N = 2
	EndSwitch
		ToolTip(GUICtrlRead($CTRL_slider[$N]))
EndFunc

; Author - RazerM
Func SwitchColor ($iColor)
    Local $iMask
    $iMask = BitXOR(BitAND($iColor, 0xFF) , ($iColor / 0x10000))
	Return BitXOR($iColor, ($iMask * 0x10001))
EndFunc   ;==>SwitchColor

;~ Author: Diamond
Func _ButtonClassicStyle($controlID, $style=0)
	GUICtrlSetStyle($controlID, 0x0040) ; $BS_ICON
	GUICtrlSetImage($controlID, "shell32.dll",0,0)
	GUICtrlSetStyle($controlID, $style)
EndFunc

Func SetOnTop($HWND, $TOPMOST)
	DllCall("User32.dll","long","SetWindowPos","hwnd",$HWND, _ 
				"int",$TOPMOST, _ ; Always On Top = -1
				"int",0, _ ; Left
				"int",0, _ ; Top
				"int",0, _ ; Width
				"int",0, _ ; Height
				"int",3)   ; Flag: $SWP_NOSIZE=1 and $SWP_NOMOVE=2
EndFunc

Последний раз редактировалось Diamond, 21-09-2007 в 22:52. Причина: Поправка в коде

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

Отправлено: 18:20, 21-09-2007 | #458


Аватара для Creat0R

Must AutoIt


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

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


Diamond,
Класная утилитка (это скорее в помощь более большой утилитке, как дочерний диалог для управлением цветами )...

Немного(?) изменил - Теперь диалог для выбора цвета открывается как дочернее окно, также переделал немного методы обновления данных (чтобы всё обновлялось в реальном времени, правда "дёргание" элементов не удалось предотвратить), при выборе пипетки добавил функцию для установки курсора на момент выбора цвета (глобально, правда я пока не знаю как получить предварительно текущий курсор, поэтому будет сбиваться всегда на 3dwarro.cur - а курсор пипетки можно видимо подобрать и подходящий в системе, но я не нашёл), ну и поправил ввод полей - если ставить пустое значение, то сразу сбрасывается на 0 (у тебя сбрасывалось только после ввода в другое поле), если ставить выше 255, то также сразу ставиться на 255

Кстати, а почему используется API-шная функция SetOnTop? Я так понял для скрытия окна и затем показа в режиме Поверх всех окон? но ведь можно было просто прятать по WinSetState($Hwnd, "", @SW_HIDE), и потом показать, OnTop не сбивается при этом

Вобщем вот скрипт:

Код: Выделить весь код
#NoTrayIcon
#include <GUIConstants.au3> 
#include <Misc.au3>
Global Const $WM_HSCROLL = 0x0114
Global Const $WM_COMMAND = 0x0111
Global $red=255, $green=0, $blue=0, $x=0, $st=5, $N, $LastDrColor = 0, $LastRetColor = 0
$Colorizer=GUICreate("Сolorizer (RGB)","320","200",-1,-1,-1,$WS_EX_TOPMOST)
	GUISetBkColor (0x000000)
Dim $CTRL_edit[3]
$CTRL_edit[0] = GUICtrlCreateEdit ("0", 5, 5, 34, 18,$ES_NUMBER)
	GUICtrlSetTip (-1,"Red")
	GUICtrlSetLimit (-1, 3)
$CTRL_edit[1] = GUICtrlCreateEdit ("0", 5, 30, 34, 18,$ES_NUMBER)
	GUICtrlSetTip (-1,"Green")
	GUICtrlSetLimit (-1, 3)
$CTRL_edit[2] = GUICtrlCreateEdit ("0", 5, 55, 34, 18,$ES_NUMBER)
	GUICtrlSetTip (-1,"Blue")
	GUICtrlSetLimit (-1, 3)
Dim $CTRL_slider[3] = [GUICtrlCreateSlider(54,5,255,20), GUICtrlCreateSlider(54,30,255,20), GUICtrlCreateSlider(54,55,255,20)]
For $i=0 To 2
	GUICtrlSetLimit($CTRL_slider[$i],255,0)
	GUICtrlSetBkColor($CTRL_slider[$i],0x000000)
Next
$CTRL_edit_hex = GUICtrlCreateEdit ("0x000000", 5, 145, 80, 18,$ES_READONLY)
	GUICtrlSetTip (-1,"Шестнадцатиричное представление")
$Button_ChooseColor = GUICtrlCreateButton("Цвет",240,95,60,20)
$ButtonDr           = GUICtrlCreateButton("Пипетка",240,120,60,20)
$ButtonRnd         = GUICtrlCreateButton("Случайно",240,145,60,20)
For $i = $Button_ChooseColor To $ButtonRnd
	_ButtonClassicStyle($i)
	GUICtrlSetCursor ($i,0)
Next
$Gr=GUICtrlCreateGraphic(4,174,0,0)
$GrCover=GUICtrlCreatePic("",2,174,316,20,-1,$WS_EX_CLIENTEDGE)
Draw_ToneScale()

GUIRegisterMsg($WM_HSCROLL, "WM_SCROLL")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUISetState(@SW_SHOWNORMAL)
;--------------------------------------
While 1
	$msg=GUIGetMsg()
	
	Switch $msg
		Case $GUI_EVENT_PRIMARYUP
			ToolTip("")
		Case $GUI_EVENT_PRIMARYDOWN
			$CurInfo = GUIGetCursorInfo($Colorizer)
			If $CurInfo[4] = $GrCover Then
				GUICtrlSetCursor($GrCover, 3)
				$coord = _GetControlPos ($Colorizer, $GrCover)
				_MouseTrap($coord[0]+2,$coord[1]+2,$coord[2]-2,$coord[3]-2)
				While $CurInfo[4] = $GrCover And $CurInfo[2] = 1
					$CurInfo = GUIGetCursorInfo($Colorizer)
					If Not DropperScale() Then
						Sleep(100)
					Else
						Sleep(50)
					EndIf
				WEnd
				_MouseTrap()
				GUICtrlSetCursor($GrCover, 2)
			EndIf
		Case $GUI_EVENT_CLOSE
			Exit
		Case $CTRL_edit[0] To $CTRL_edit[2]
			$N = $msg - $CTRL_edit[0]
	EndSwitch
WEnd

;~ Тоновая шкала:
Func Draw_ToneScale()
For $i=0 To 255 Step $st
	$green=$i
	SetColor()
Next
For $i=0 To 255  Step $st
	$red=255-$i
	SetColor()
Next
For $i=0 To 255 Step $st
	$blue=$i
	SetColor()
Next
For $i=0 To 255 Step $st
	$green=255-$i
	SetColor()
Next
For $i=0 To 255 Step $st
	$red=$i
	SetColor()
Next
For $i=0 To 255 Step $st
	$blue=255-$i
	SetColor()
Next
EndFunc

Func SetColor()
	Local $color='0x' & Hex($red,2) & Hex($green,2) & Hex($blue,2)
	GUICtrlSetGraphic($Gr,$GUI_GR_COLOR, $color)
	GUICtrlSetGraphic($Gr,$GUI_GR_RECT,$x,0,1,20)
	$x+=1
EndFunc

Func Input()
Local $color[3] = [GUICtrlRead($CTRL_edit[0]),GUICtrlRead($CTRL_edit[1]),GUICtrlRead($CTRL_edit[2])]
Local $str, $i, $ret="0x"

For $i = 0 To 2
	If $color[$i] = "" Then
		$color[$i] = 0
	ElseIf $color[$i] > 255 Then
		$color[$i] = 255
	EndIf
	$ret &= Hex($color[$i],2)
Next

GUICtrlSetData($CTRL_edit_hex,$ret)
GUICtrlSetData($CTRL_edit[$N],$color[$N])
GUICtrlSetData($CTRL_slider[$N],$color[$N])

If $LastRetColor = $ret Then Return
$LastRetColor = $ret

GUISetBkColor($ret, $Colorizer)
;~ Меняем фоновый цвет слайдеров:
For $j=0 To 2
	GUICtrlSetBkColor($CTRL_slider[$j],$ret)
Next
EndFunc

Func slEvent()
	Local $slColor=GUICtrlRead($CTRL_slider[$N])
	GUICtrlSetData ($CTRL_edit[$N],$slColor)
	GUICtrlSetState($CTRL_slider[$N],$GUI_FOCUS)
	Input()
	;~ Возвращаем утраченный фокус элементу:
	GUICtrlSetState($CTRL_slider[$N],$GUI_FOCUS)
EndFunc

Func randomize()
	Local $i, $HexColor ='0x'
	For $i=0 to 2
		$rnd = int(Random(0,255))
		$HexColor &= Hex($rnd,2)
		GUICtrlSetData($CTRL_edit[$i],$rnd)
		GUICtrlSetData($CTRL_slider[$i],$rnd)
	Next
	For $i=0 to 2
		GUICtrlSetBkColor($CTRL_slider[$i],$HexColor)
	Next
	GUICtrlSetData($CTRL_edit_hex,$HexColor)
	GUISetBkColor($HexColor,$Colorizer)
EndFunc

Func dropper()
Local $Time=TimerInit()
GUICtrlSetState($ButtonDr,$GUI_DISABLE)
ToolTip("Кликните мышью в любом месте экрана",Default,Default,"",0,3)
_SetCursor(@WindowsDir & "\cursors\cross_m.cur", 32512)
While 1
	Sleep (1) ; Символический таймаут для уменьшения CPU!!!
	$click=GUIGetCursorInfo ($Colorizer)
	If TimerDiff($Time) > 2300 Then ToolTip("")
	If $click[2] = 1 And $click[4] <> $ButtonDr Then 
		$Mouse=MouseGetPos()
		$x=$Mouse[0]
		$y=$Mouse[1]
		$DrColor=Hex(PixelGetColor ($x,$y ),6)
		$j=1
		For $i=0 to 2
			$Dr=Dec(StringMid($DrColor,$j,2))
			GUICtrlSetData($CTRL_edit[$i],$Dr)
			GUICtrlSetData($CTRL_slider[$i],$Dr)
			$j += 2
		Next
		For $i=0 to 2
			GUICtrlSetBkColor($CTRL_slider[$i],'0x' & $DrColor)
		Next
		GUICtrlSetData($CTRL_edit_hex,'0x' & $DrColor)
		GUISetBkColor('0x' & $DrColor,$Colorizer)
		GUICtrlSetState($ButtonDr,$GUI_ENABLE)
		ToolTip("")
		ExitLoop
	EndIf
WEnd
_SetCursor(@WindowsDir & "\cursors\3dwarro.cur", 32512)
EndFunc

Func DropperScale()
	Local $Mouse=MouseGetPos()
	Local $DrColor=Hex(PixelGetColor($Mouse[0],$Mouse[1]),6)
	
	If $LastDrColor = $DrColor Then Return 0
	$LastDrColor = $DrColor
	
	Local $j=1
	For $i=0 to 2
		$Dr=Dec(StringMid($DrColor,$j,2))
		GUICtrlSetData($CTRL_edit[$i],$Dr)
		GUICtrlSetData($CTRL_slider[$i],$Dr)
		$j += 2
	Next
	For $i=0 to 2
		GUICtrlSetBkColor($CTRL_slider[$i],'0x' & $DrColor)
	Next
	GUICtrlSetData($CTRL_edit_hex,'0x' & $DrColor)
	GUISetBkColor('0x' & $DrColor,$Colorizer)
	Return 1
EndFunc

;~ Author: Diamond
Func _GetControlPos($HWND, $ControlId)
	Local $Win        = WinGetPos($HWND)
	Local $Client     = WinGetClientSize($HWND)
	Local $Control    = ControlGetPos($HWND,"",$ControlId)
	Local $BorderSize = ($Win[2]-$Client[0])  / 2
	Local $PanelSize  = $Win[3] - $Client[1]  - $BorderSize
	Local $array[4]
	$array[0] = $Win[0]   + $BorderSize + $Control[0] ; left
	$array[1] = $Win[1]   + $PanelSize  + $Control[1] ; $top 
	$array[2] = $array[0] + $Control[2]               ; right
	$array[3] = $array[1] + $Control[3]               ; bottom
	Return $array
EndFunc

Func ChooseColor()
	Local $HexColor = '0x'
	Local $BGR=ColorPicker(SwitchColor(GUICtrlRead($CTRL_edit_hex)), $Colorizer)
	If $BGR = -1 Then Return
	For $i=0 to 2
		$HexColor &= Hex($BGR[$i+1],2)
		GUICtrlSetData($CTRL_edit[$i],$BGR[$i+1])
		GUICtrlSetData($CTRL_slider[$i],$BGR[$i+1])
	Next
	For $i=0 to 2
		GUICtrlSetBkColor($CTRL_slider[$i],$HexColor)
	Next
	GUICtrlSetData($CTRL_edit_hex,$HexColor)
	GUISetBkColor($HexColor,$Colorizer)
EndFunc

Func ColorPicker($Default=0, $hWnd=0)
	Local $p = DllStructCreate("dword;int;int;int;ptr;dword;int;ptr;ptr")
		DllStructSetData($p, 1, DllStructGetSize($p))
		DllStructSetData($p, 2, $hWnd)
		DllStructSetData($p, 4, $Default)
		DllStructSetData($p, 5, DllStructGetPtr(DllStructCreate("int[16]")))
		DllStructSetData($p, 6, BitOR(0x100, 0x2, 0x1))
	$ret = DllCall("comdlg32.dll", "long", "ChooseColor", "ptr",DllStructGetPtr($p))
	If $ret[0] = False Then Return -1
	Local $color_picked = DllStructGetData($p, 4)
	$color_picked = Hex(String($color_picked), 6)
	Local $array[4]
	$array[0]="0x" & StringRight($color_picked,2) & StringMid($color_picked,3,2) & StringLeft($color_picked,2)
	$array[1]=Number("0x" & StringRight($color_picked,2)) ; RED
	$array[2]=Number("0x" & StringMid($color_picked,3,2)) ; GREEN
	$array[3]=Number("0x" & StringLeft($color_picked,2))  ; BLUE
	Return $array
EndFunc

Func WM_COMMAND($hWndGUI, $MsgID, $WParam, $LParam)
	Local $FocusedHandel = ControlGetHandle($hWndGUI, "", ControlGetFocus($hWndGUI))
	Local $Continue = False, $i
	Switch $FocusedHandel
		Case GUICtrlGetHandle($ButtonRnd)
			randomize()
			Return
		Case GUICtrlGetHandle($ButtonDr)
			dropper()
			Return
		Case GUICtrlGetHandle($Button_ChooseColor)
			ChooseColor()
			Return
		Case Else
			For $i = 0 To 2
				If $FocusedHandel = GUICtrlGetHandle($CTRL_edit[$i]) Then
					$Continue = True
					ExitLoop
				EndIf
			Next
			If Not $Continue Then Return
	EndSwitch
	
	$N = $CTRL_edit[$i] - $CTRL_edit[0]
	Local $CtrlRead = GUICtrlRead($CTRL_edit[$N])
	If StringLeft($CtrlRead, 1) = 0 And StringLen($CtrlRead) > 1 Then GUICtrlSetData($CTRL_edit[$N], StringTrimLeft($CtrlRead, 1))
	
	Input()
EndFunc

Func WM_SCROLL($hWndGUI, $MsgID, $WParam, $LParam)
	Local $FocusedHandel = ControlGetHandle($hWndGUI, "", ControlGetFocus($hWndGUI))
	
	For $i = 0 To 2
		If GUICtrlGetHandle($CTRL_slider[$i]) = $FocusedHandel Then
			$N = $i
			ExitLoop
		EndIf
	Next
	
	Local $CurInfo = GUIGetCursorInfo($hWndGUI)
	If $CurInfo[2] = 1 Then
		ToolTip(GUICtrlRead($CTRL_slider[$N]))
	Else
		ToolTip("")
	EndIf
	slEvent()
EndFunc

; Author - I think gafrost ;)
;==================================================================
; $s_file - file to load cursor from
; $i_cursor - system cursor to change
;==================================================================
Func _SetCursor($s_file, $i_cursor)
	Local $newhcurs, $lResult
	$newhcurs = DllCall("user32.dll", "int", "LoadCursorFromFile", "str", $s_file)
	If Not @error Then
		$lResult = DllCall("user32.dll", "int", "SetSystemCursor", "int", $newhcurs[0], "int", $i_cursor)
		If Not @error Then
			$lResult = DllCall("user32.dll", "int", "DestroyCursor", "int", $newhcurs[0])
		Else
			;MsgBox(0, "Error", "Failed SetSystemCursor")
		EndIf
	Else
		;MsgBox(0, "Error", "Failed LoadCursorFromFile")
	EndIf
	Return $lResult[0]
EndFunc  ;==>_SetCursor

; Author - RazerM
Func SwitchColor ($iColor)
    Local $iMask
    $iMask = BitXOR(BitAND($iColor, 0xFF) , ($iColor / 0x10000))
	Return BitXOR($iColor, ($iMask * 0x10001))
EndFunc   ;==>SwitchColor

;~ Author: Diamond
Func _ButtonClassicStyle($controlID, $style=0)
	GUICtrlSetStyle($controlID, 0x0040) ; $BS_ICON
	GUICtrlSetImage($controlID, "shell32.dll",0,0)
	GUICtrlSetStyle($controlID, $style)
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

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

Отправлено: 07:56, 22-09-2007 | #459


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


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

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


Creat0R
Спасибо за отклик!
Цитата:
это скорее в помощь более большой утилитке, как дочерний диалог для управлением цветами
Изначално я её задумал чтобы облегчить подбор цветов для новых GUI, начал писать давно, потом проект забросил, а решил дописать после того как ТЫ привёл на форум пример со слайдерами.
Кстати из-за давности проекта осталось несколько, неуклюже написанных функций, (ведь тогда у меня было поменьше опыта...) они так и остались фактически без изменений...
Цитата:
Теперь диалог для выбора цвета открывается как дочернее окно
Когда переписывал udf-ую _ChooseColor я почему-то убрал эту возможность... а потом и вовсе про неё забыл. Вместо этого стал использовать API-SetOnTop(), а теперь раз окно выбора цвета стало дочерним, SetOnTop() больше не нужна. Спасибо.
Цитата:
также переделал немного методы обновления данных
Ты вернул то, что я так старательно убирал, как раз именно из-за постоянных мельканий элементов. В начале у меня тоже обновлялось в реальном времени. Думаю, обновление лучше оставить как было, чтобы при перемещении позиции слайдера мышкой - обновлялось только один раз, а при использовании мышинного колёсика - постоянно.
По поводу курсора - идея хорошая, но с точки зрения пользователя было бы некорректно заменять текущий курсор на новый... Вижу толька два выхода: либо искать способ для определения текущего курсора, либо искать другую API-функцию (хотелось бы верить что она существует)
Цитата:
поправил ввод полей
... с помощью $WM_COMMAND, ...давно искал решение для мгновенного определения ввода, спасибо!

Куда-то пропала моя любимая фича: При нажатии на тоновую шкалу (точнее при отпускании мышки с $GrCover) происходило определение цвета тоновой шкалы, и это не зависило от Пипетки...
Вместо этого добавился глюк: При клике по $GrCover запускается последнее действие, т.е. если я до этого нажимал кнопку "Цвет", то при клике по $GrCover вызывается диалог выбора цвета и т.д.

Добавлено:
Цитата:
Кстати, а почему используется API-шная функция SetOnTop? Я так понял для скрытия окна и затем показа в режиме Поверх всех окон? но ведь можно было просто прятать по WinSetState($Hwnd, "", @SW_HIDE), и потом показать, OnTop не сбивается при этом
Не @SW_HIDE а @SW_DISABLE... Наверное повторюсь... Сочетание функции SetOnTop() и @SW_DISABLE я тупо использовал из-за того, что "окно выбора цвета" не было дочерним, теперь всё это не потребуется

Последний раз редактировалось Diamond, 22-09-2007 в 16:21. Причина: Добавление


Отправлено: 15:57, 22-09-2007 | #460



Компьютерный форум 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




 
Переход