Войти

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

Diamond
10-08-2007, 17:20
Creat0R
Немного(?) переделал под свои нужды
Спасибо. Правда у меня антивирус ругается на Клавиатурный перехватчик, хотя это вполне логично.
А зачем Sleep() добавлена дважды? И ещё, постоянно происходит открытие/закрытие dll'ки, имхо лучше использовать один раз DllOpen(), а затем обращатся только к хэндлу (я поправил, и у меня CPU уменьшилось в полтора раза) - Хотя, на самом деле, всё это мелочи, ;) спасибо ещё раз! :)

Diamond
11-08-2007, 11:56
Реестровый способ установки обоев рабочего стола.

;~ Этот метод только для BMP-файлов, (!проверено только на Windows XP!)
;~ $BMP - Путь к BMP-файлу
;~ $STYLE - Расположение:
;~ 0 - По центру; 1 - Замостить; 2 - Растянуть
Func SetWallpaper($BMP,$STYLE=0)
Local $Tile=0
If $STYLE=1 Then $Tile=1
RegWrite("HKCU\Control Panel\Desktop","Wallpaper","REG_SZ",$BMP)
RegWrite("HKCU\Control Panel\Desktop","WallpaperStyle","REG_SZ",$STYLE)
RegWrite("HKCU\Control Panel\Desktop","TileWallpaper","REG_SZ",$Tile)
RegWrite("HKCU\Software\Microsoft\Internet Explorer\Desktop\General","Wallpaper","REG_SZ",$BMP)
RegWrite("HKCU\Software\Microsoft\Internet Explorer\Desktop\General","WallpaperStyle","REG_SZ",$STYLE)
RegWrite("HKCU\Software\Microsoft\Internet Explorer\Desktop\General","TileWallpaper","REG_SZ",$Tile)
DllCall("user32.dll","int","UpdatePerUserSystemParameters","int",0,"int",0)
EndFunc

P.S.
К сожалению этот способ работает только с BMP-файлами, поэтому для конвертации из *.jpg во временный *.bmp я пользуюсь консольной утилитой (http://www.download.ru/soft/converters__optimizers/graphic_apps/jpg2bmp/20886)
P.P.S.
Хотелось бы конечно решить проблему конвертации средствами AutoIt. Думаю это возможно, поскольку при ручной установке обоев через апплет(desk.cpl) система сама конвертирует их в bmp, но как она это делает - для меня пока загадка.

Diamond
11-08-2007, 14:38
1. Как создать MDI-окно($WS_EX_MDICHILD) внутри родительского и как переключаться между ними? Наподобие того, как это делает программа установки... (типа страничного перелистывания: NextPage - PreviewPage).
2. Зачем нужен стиль $WS_GROUP? Я читал справку но так ничего и не понял...

Creat0R
11-08-2007, 18:41
Diamond,
при ручной установке обоев через апплет(desk.cpl) система сама конвертирует их в bmp
А может просто переименовывает? может немного глупо и банально, но ты пробовал переименовывать просто формат файла? :shuffle:

Как создать MDI-окно($WS_EX_MDICHILD) внутри родительского и как переключаться между ними? Наподобие того, как это делает программа установки... (типа страничного перелистывания: NextPage - PreviewPage).
Не думаю что тут нужно MDI-окно, тут просто нужно построить функции в начачле которых будут прятаться все динамичные контроли, а в теле просто показываться нужные (созданные предварительно в самом начале строения ГУИ) - И потом при каждом переключении (нажатии Next/Back) вызывать соответственно эти функции.

Хотя в принципе для MDI-окон (почти) можно попробовать типа такого:


#include <GuiConstants.au3>

$Gui = GuiCreate("MDI Demo", 400, 300)

$Back = GUICtrlCreateButton("<<Back", 240, 270, 60)
$Next = GUICtrlCreateButton("Next>>", 320, 270, 60)

$ChildGui_1 = GuiCreate("Child window 1", 400, 260, 5, 5, $WS_POPUP)
$LabelGui1 = GUICtrlCreateLabel("Test 1", 20, 60)

$ChildGui_2 = GuiCreate("Child window 2", 400, 260, 5, 5, $WS_POPUP)
$LabelGui2 = GUICtrlCreateLabel("Test 2", 20, 60)

DllCall("user32.dll", "int", "SetParent", "hwnd", $ChildGui_1, "hwnd", $GUI)
DllCall("user32.dll", "int", "SetParent", "hwnd", $ChildGui_2, "hwnd", $GUI)

GUISetState(@SW_SHOW, $Gui)
GUISetState(@SW_SHOW, $ChildGui_1)

While 1
$Msg = GUIGetMsg(1)
Select
Case $Msg[1] = $Gui And $Msg[0] = -3
Exit
Case $Msg[0] = $Next
GUISetState(@SW_HIDE, $ChildGui_1)
GUISetState(@SW_SHOW, $ChildGui_2)
Case $Msg[0] = $Back
GUISetState(@SW_HIDE, $ChildGui_2)
GUISetState(@SW_SHOW, $ChildGui_1)
EndSelect
WEnd


Зачем нужен стиль $WS_GROUP?
Ну он как бы групирует все последующие контроли (до следующего использования этого стиля), но в каких целях, я честно сам не понял.

Diamond
11-08-2007, 21:36
Creat0R
...ты пробовал переименовывать просто формат файла?
Именно bmp, и именно конвертация! Было бы слишком просто, хотя, такая мысль приходила раньше и ко мне.
Хотя в принципе для MDI-окон (почти) можно попробовать типа такого:
Идея хорошая, спасибо. Всё-таки хотелось бы увидеть как работает MDI, и хотелось бы точно знать как на самом деле правильно.
Ну он как бы групирует все последующие контроли (до следующего использования этого стиля), но в каких целях, я честно сам не понял.
Я просто предположил что этот стиль как-то связан с моим первым вопросом, т.е. группирует окна.

Creat0R
11-08-2007, 23:50
Diamond,
хотелось бы увидеть как работает MDI
Вот так (изменённый пример с оф. форума):

#include <GuiConstants.au3>

Global $gui[100000]
$x = 1

$Mother_GUI = GUICreate("Thinking box",-1,-1,-1,-1,BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS))
$Button_1 = GUICtrlCreateButton("New Box", 5, 5, 70, 20)
GUICtrlSetResizing(-1,$GUI_DOCKALL)
$Button_2 = GUICtrlCreateButton("Delete Box",5,30,70,20)
GUICtrlSetResizing(-1,$GUI_DOCKALL)
$Input_1 = GUICtrlCreateInput("1",5,60,70,20)
GUICtrlSetResizing(-1,$GUI_DOCKALL)
GUISetState(@SW_SHOW, $Mother_GUI)

$Main_GUI = GUICreate("",220,300,80,5,$WS_POPUPWINDOW)
GUISetBkColor(0xCCCCCC)

DllCall("user32.dll", "int", "SetParent", "hwnd", WinGetHandle($Main_GUI), "hwnd", WinGetHandle($Mother_GUI))

$LeftCounter = 0
$TopPlus = 20
Makebox()

GUISetState(@SW_SHOW,$Main_GUI)

While 1
setsize()
$msg = GUIGetMsg()
if $msg = $GUI_EVENT_CLOSE then Exit
if $msg = $Button_1 then Makebox()
if $msg = $Button_2 then GUIDelete($Gui[GUICtrlRead($Input_1)])
sleep(10)
WEnd

Func Makebox()
if $x < 100000 then
$Mother_GUI_Pos_Arr = WinGetPos($Mother_GUI)
$LeftCounter += 1

If 250+$LeftCounter*5 > $Mother_GUI_Pos_Arr[2] Then
$LeftCounter = 1
$TopPlus -= 20
If $TopPlus < 0 Then $TopPlus = 60
EndIf

$Left = 40+$LeftCounter*5
$Top = $TopPlus+$LeftCounter*5

$gui[$x] = GUICreate("", 200, 90, $Left, $Top, $WS_POPUPWINDOW, $WS_EX_TOOLWINDOW)
$label = GUICtrlCreateLabel(" Box number: " & $x,0,0,200,20,-1,$GUI_WS_EX_PARENTDRAG)
GUICtrlSetFont(-1,12,14,0,"Comic Sans MS")
settopbarcolor()
GUICtrlCreateEdit("",0,20,200,70,$WS_VSCROLL)
DllCall("user32.dll", "int", "SetParent", "hwnd", WinGetHandle($Gui[$x]), "hwnd", WinGetHandle($Main_GUI))
GUISetState(@SW_SHOW,$gui[$x])
$x += 1
EndIf
EndFunc

Func settopbarcolor($s_control=-1)
$Random = Random(1,6,1)
if $Random = 1 Then
GUICtrlSetBkColor($s_control,0x0000FF)
elseif $Random = 2 Then
GUICtrlSetBkColor($s_control,0x00FF00)
elseif $Random = 3 then
GUICtrlSetBkColor($s_control,0xFF0000)
elseif $Random = 4 then
GUICtrlSetBkColor($s_control,0x00FFFF)
elseif $Random = 5 then
GUICtrlSetBkColor($s_control,0xFF00FF)
elseif $Random = 6 Then
GUICtrlSetBkColor($s_control,0xFFFF00)
EndIf
EndFunc

Func setsize()
$Motherpos = WinGetPos($Mother_GUI)
$Mainpos = WinGetPos($Main_GUI)
if $Mainpos[2] <> $Motherpos[2]-98 or $Mainpos[3] <> $Motherpos[3]-40 then WinMove($Main_GUI,"",85,5,$Motherpos[2]-98,$Motherpos[3]-45)
EndFunc

Func SpecialEvents()
Select
Case @GUI_CTRLID = $GUI_EVENT_CLOSE
Exit
EndSelect
EndFunc

То что ты задумал, имхо, не имеет отношения к MDI - Multiple document interface (http://en.wikipedia.org/wiki/Multiple_document_interface).

И стиль $WS_EX_MDICHILD не совсем делает нужный “эффект”:
Create a child window included in its parent window (simulation not real MDI).

Вот ещё примерчик MDI:

#include <GuiConstants.au3>

$MainGui = GuiCreate("Main", 485, 280)
$Child_1_Gui = GuiCreate("Child 1", 150, 100, 5, 5)
$Child_2_Gui = GuiCreate("Child 2", 150, 100, 165, 5)
$Child_3_Gui = GuiCreate("Child 3", 150, 100, 325, 5)
$Child_4_Gui = GuiCreate("Child 4", 150, 100, 5, 135)
$Child_5_Gui = GuiCreate("Child 5", 150, 100, 165, 135)
$Child_6_Gui = GuiCreate("Child 6", 150, 100, 325, 135)

GUISetState(@SW_SHOW, $MainGui)
DllCall("user32.dll", "int", "SetParent", "hwnd", $Child_1_Gui, "hwnd", $MainGui)
GUISetState(@SW_SHOW, $Child_1_Gui)
DllCall("user32.dll", "int", "SetParent", "hwnd", $Child_2_Gui, "hwnd", $MainGui)
GUISetState(@SW_SHOW, $Child_2_Gui)
DllCall("user32.dll", "int", "SetParent", "hwnd", $Child_3_Gui, "hwnd", $MainGui)
GUISetState(@SW_SHOW, $Child_3_Gui)
DllCall("user32.dll", "int", "SetParent", "hwnd", $Child_4_Gui, "hwnd", $MainGui)
GUISetState(@SW_SHOW, $Child_4_Gui)
DllCall("user32.dll", "int", "SetParent", "hwnd", $Child_5_Gui, "hwnd", $MainGui)
GUISetState(@SW_SHOW, $Child_5_Gui)
DllCall("user32.dll", "int", "SetParent", "hwnd", $Child_6_Gui, "hwnd", $MainGui)
GUISetState(@SW_SHOW, $Child_6_Gui)

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

EndSwitch
WEnd

как на самом деле правильно.
Смотря что тебе требуется, если нужно создать устновщик используя стиль с Next/Back кнопками, тогда как я и упоминал ранее, нужно в начале построения ГУИ создать ВСЕ контроли (кнопки, лейблы, инпуты и т.д :)), спрятать их (GuiCtrlSetState($ID, $GUI_HIDE)), потом на первой стадии показать нужные ($GUI_SHOW); или просто не прятать их изначально ;), и при нажатии Next/Back прятать предыдущие (можно сделать счётчик нажатии кнопок вперёд/назад) и показывать нужные для следующего этапа.

Creat0R
12-08-2007, 00:40
Diamond,
По поводу смены обоев - вот тут (http://www.autoitscript.com/forum/index.php?showtopic=5815&hl=SetWallpaper) нашёл кое что:

DllCall('shell32', 'long', 'SetWallpaper', 'string', $sFile, 'int', 0)

Но у меня почему то не работает :dont-know

Creat0R
12-08-2007, 10:40
Пытаюсь сделать функцию для массовой замены по тексту используя флаг “Whole word only” (только слово целиком) - Но всё что у меня получилось, так это замена нужного текста + тех символов которые считаются как разделителями между словами (Таб, пробел, перевод строки, возврат каретки, начало строки, и конец строки):


$Ret = _StringReplace_WholeWord(@TAB & "test" & @CRLF & "_test_" & @CRLF, "test", "000", 0)
ConsoleWrite($Ret) ;@TAB'а уже нету :(

Func _StringReplace_WholeWord($String, $WhatToFind, $Replace, $MatchCaseParam=0)
Local $CaseSenceStr = '(?i)'
If $MatchCaseParam = 1 Then $CaseSenceStr = ''

Local $RetVal = StringRegExpReplace($String, $CaseSenceStr & GetRegExpPattern($WhatToFind), $Replace)
Return SetExtended(@extended, $RetVal)
EndFunc

Func GetRegExpPattern($Var)
Return '\t' & $Var & '\z|\A' & _
$Var & '\t|\t' & $Var & '\t|\t' & $Var & '\s|\s' & _
$Var & '\t|\A' & $Var & '\s|\s' & $Var & '\z|\s' & _
$Var & '\s|\n' & $Var & '\s|\n' & $Var & '\t|\n' & _
$Var & '\r|\n' & $Var & '\z|\A' & $Var & '\n|\A' & _
$Var & '\r|\t' & $Var & '\n|\t' & $Var & '\r|\r' & _
$Var & '\s|\r' & $Var & '\t|\r' & $Var & '\n|\r' & _
$Var & '\z|\n' & $Var & '\r|\A' & $Var & '\z'
EndFunc


Как можно построить подобную функцию? :clever-ma

amel27
12-08-2007, 12:49
Creat0R
Но у меня почему то не работаети не пытайся - код нерабочий. Это не функция и даже не объект, а интерфейс. Уже не раз пытался заюзать аналогичные... пока AutoIT не способен сконвертить обычный указатель в объект

Пытаюсь сделать функцию для массовой замены по тексту используя флаг “Whole word only”не совсем понял что надо, но может пригодится:$s = @TAB & "test" & @CRLF & "_test_" & @CRLF
ConsoleWrite('---'&@CRLF&$s&@CRLF&'---'&@CRLF)
$r = _StringReplace_WholeWord($s, "test", "000", 0)
ConsoleWrite('---'&@CRLF&$r&@CRLF&'---'&@CRLF)

Func _StringReplace_WholeWord($String, $WhatToFind, $Replace, $MatchCaseParam=0)
Local $CaseSenceStr = '(?i)'
If $MatchCaseParam = 1 Then $CaseSenceStr = ''
Local $RetVal = StringRegExpReplace($String, $CaseSenceStr & '\b'& $WhatToFind &'\b', $Replace)
Return SetExtended(@extended, $RetVal)
EndFunc

Diamond
12-08-2007, 14:05
Creat0R
Спасибо за примеры. Получил полное моральное удовлетворение. :)
То что ты задумал, имхо, не имеет отношения к MDI
Убедил! :) Хотя, взяв за основу приведённые тобой примеры наверное ещё немного поколдую. :wizard: А для себя я всё-таки решил показывать/прятать контроли, думаю, так будет проще и удобнее.
По поводу смены обоев - вот тут
Попытался зайти по ссылке, но там пишут что ссылка устарела либо битая. :(
Но у меня почему то не работает
В shell32.dll нету функции "SetWallpaper"

Нашёл!!! :yahoo: http://www.autoitscript.com/forum/index.php?showtopic=50753 - конвертирует в BMP и устанавливает обои, но для самой функции нужна библиотека AutoItLib.au3 (Библиотеку можно найти там же (http://www.autoitscript.com/forum/index.php?act=attach&type=post&id=15948))
Вот эта функция:

#include <.\AutoItLib.au3>

Func _ChangeDesktopBackground($sFile, $iPosition=3)
Local $sCLSID, $tBuffer, $hImage, $sTemp

; Convert JPG image to BMP image
_GDI_Startup()
$hImage = _GDI_LoadFromFile($sFile)
$sCLSID = _GDI_GetEncoderCLSID("BMP")
$sTemp = _Str_ChangeFileExt($sFile, ".bmp")
_GDI_SaveToFile($hImage, $sTemp, $sCLSID)
_GDI_DisposeImage($hImage)
_GDI_Shutdown()

; Set wallpaper position
Switch $iPosition
Case 1 ; Tile
RegWrite('HKCU\Control Panel\Desktop', 'TileWallpaper' , 'reg_sz', '1')
RegWrite('HKCU\Control Panel\Desktop', 'WallpaperStyle', 'reg_sz', '0')
RegWrite("HKCU\Software\Microsoft\Internet Explorer\Desktop\General","TileWallpaper", "REG_SZ",'1')
RegWrite("HKCU\Software\Microsoft\Internet Explorer\Desktop\General","WallpaperStyle","REG_SZ",'0')
Case 2 ; Center
RegWrite('HKCU\Control Panel\Desktop', 'TileWallpaper' , 'reg_sz', '0')
RegWrite('HKCU\Control Panel\Desktop', 'WallpaperStyle', 'reg_sz', '0')
RegWrite("HKCU\Software\Microsoft\Internet Explorer\Desktop\General","TileWallpaper", "REG_SZ",'0')
RegWrite("HKCU\Software\Microsoft\Internet Explorer\Desktop\General","WallpaperStyle","REG_SZ",'0')
Case 3 ; Stretch
RegWrite('HKCU\Control Panel\Desktop', 'TileWallpaper' , 'reg_sz', '0')
RegWrite('HKCU\Control Panel\Desktop', 'WallpaperStyle', 'reg_sz', '2')
RegWrite("HKCU\Software\Microsoft\Internet Explorer\Desktop\General","TileWallpaper", "REG_SZ",'0')
RegWrite("HKCU\Software\Microsoft\Internet Explorer\Desktop\General","WallpaperStyle","REG_SZ",'2')
EndSwitch

; Set wallpaper
$tBuffer = DllStructCreate("char Text[" & StringLen($sTemp) + 1 & "]")
DllStructSetData($tBuffer, "Text", $sTemp)
_API_SystemParametersInfo($SPI_SETDESKWALLPAPER, 0, DllStructGetPtr($tBuffer), BitOR($SPIF_UPDATEINIFILE, $SPIF_SENDCHANGE))
EndFunc

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

Creat0R
13-08-2007, 02:51
amel27,
не совсем понял что надо
Я пытаюсь (с твоей помощью почти закончил :)) сделать UDF с гуи для поиска и замены по тексту (текст передаётся как параметр, т.ч это предназначено не только для однократного использования) - Саму функцию выложу чуть позже.

может пригодится
Ещё как... Я сколько не лазил в справке, но этот момент упустил:

\b - Matches at a word boundary.

А я столько мучался подбирал разные вариации с табами/пробелами и т.д :biggrin:
Спасибо!

Creat0R
13-08-2007, 03:52
По поводу функции конвертирования формата даты - всё таки пришлось делать две функции, проверьте плиз кто нибудь, как оно работает:


$FullDateTime = _TimeConvertFormat("HH:MM:SS") & ", " & _DateConvertFormat("DD/MM/YY")
MsgBox(64, "Date/Time Convert Results", $FullDateTime)

Func _TimeConvertFormat($sFormat)
Local $RetDateTime = $sFormat

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

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

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

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

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

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

Return $RetDateTime
EndFunc

Func _DateConvertFormat($sFormat)
Local $RetDateTime = $sFormat

StringReplace($RetDateTime, "y", "")
Local $Year = StringRight(@YEAR, @extended)

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

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

$RetDateTime = StringReplace($RetDateTime, "y", $Year, 1)
$RetDateTime = StringReplace($RetDateTime, "y", "")

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

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

amel27
13-08-2007, 05:28
проверьте плиз кто нибудь, как оно работает
вроде работает... при условии что год встречается не больше 1 раза, немного изменил:Func _TimeConvertFormat($sFormat)
Local $Hours_Raw = @HOUR
Local $Minutes_Raw = @MIN
Local $Seconds_Raw = @SEC

$sFormat = StringReplace($sFormat, "hh",$Hours_Raw)
$sFormat = StringReplace($sFormat, "h", $Hours_Raw+0)

$sFormat = StringReplace($sFormat, "mm",$Minutes_Raw)
$sFormat = StringReplace($sFormat, "m", $Minutes_Raw+0)

$sFormat = StringReplace($sFormat, "ss",$Seconds_Raw)
$sFormat = StringReplace($sFormat, "s", $Seconds_Raw+0)

Return $sFormat
EndFunc

Func _DateConvertFormat($sFormat)
StringReplace($sFormat, "y", "")
Local $Year = StringRight(@YEAR, @extended)
Local $Mounth_Raw = @MON
Local $Day_Raw = @MDAY

$sFormat = StringRegExpReplace($sFormat, '(?i)y+', $Year)

$sFormat = StringReplace($sFormat, "mm",$Mounth_Raw)
$sFormat = StringReplace($sFormat, "m", $Mounth_Raw+0)

$sFormat = StringReplace($sFormat, "dd",$Day_Raw)
$sFormat = StringReplace($sFormat, "d", $Day_Raw+0)

Return $sFormat
EndFunc

Creat0R
13-08-2007, 06:12
amel27,
немного изменил:
Спасибо - Я как то не подумал что прибавляя ноль на втором этапе замены, получается тот же результат :) - И код короче стал...

Но мне всё же нужно доделать чтобы оно работало с одной строкой (где может встречаться и дата, и время)... вот что пока получилось:


$Str = 'DD/MM/YYYY, [HH;MM;SS]'

ConsoleWrite(_DateTimeConvertFormat($Str))

Func _DateTimeConvertFormat($sFormat)
Local $RetDateTime = $sFormat

If StringRegExp($sFormat, '(?i)\[(.*)\]') Then
$TPos_1 = StringInStr($sFormat, "[")
$TPos_2 = StringInStr($sFormat, "]")

$TruimVal = 1
If StringInStr(StringMid($sFormat, $TPos_2 + 1), "]") Then $TruimVal = 0

$TimeStr = StringMid($sFormat, $TPos_1+1, ($TPos_2 - $TPos_1) - $TruimVal)
$TimeStr = _TimeConvertFormat($TimeStr)
$DateStr = _DateConvertFormat(StringRegExpReplace($sFormat, '(?i)\[(.*)\]', '', 1))
If StringRegExp(StringMid($sFormat, $TPos_2), '(?i)D|MM/Y') Then
$RetDateTime = $TimeStr & $DateStr
Else
$RetDateTime = $DateStr & $TimeStr
EndIf
Else
$RetDateTime = _DateConvertFormat($sFormat)
EndIf

If $RetDateTime = $sFormat Then $RetDateTime = _DateConvertFormat($sFormat)
Return $RetDateTime
EndFunc


Время может быть задано только обрамлённое квадратными скобками, другого выхода пока не вижу :dont-know

amel27
13-08-2007, 11:19
Но мне всё же нужно доделать чтобы оно работало с одной строкой (где может встречаться и дата, и время)...например так - опознавать месяц по наличию вблизи "M" символов "D" и "Y":$Str = 'DD/MM/YYYY, [HH;MM;SS]'
ConsoleWrite(_DateTimeConvertFormat($Str))

Func _DateTimeConvertFormat($sFormat)
StringReplace($sFormat, "y", "")
Local $Year = StringRight(@YEAR, @extended)
Local $Stamp = '<'& Random(10000000,99999999,1) &'>'
Local $Mounth_Raw = @MON
Local $Day_Raw = @MDAY
Local $Hours_Raw = @HOUR
Local $Minutes_Raw = @MIN
Local $Seconds_Raw = @SEC

$sFormat = StringRegExpReplace($sFormat, "(?i)(?:(d+|y+)(\W*)(mm)|(mm)(\W*)(d+|y+))", '\1\2'& $Stamp &'\5\6')
If @extended Then $sFormat = StringReplace($sFormat, $Stamp, $Mounth_Raw)
$sFormat = StringRegExpReplace($sFormat, "(?i)(?:(d+|y+)(\W*)(m)|(m)(\W*)(d+|y+))", '\1\2'& $Stamp &'\5\6')
If @extended Then $sFormat = StringReplace($sFormat, $Stamp, $Mounth_Raw+0)

$sFormat = StringRegExpReplace($sFormat, '(?i)y+', $Year)

$sFormat = StringReplace($sFormat, "mm",$Minutes_Raw)
$sFormat = StringReplace($sFormat, "m", $Minutes_Raw+0)

$sFormat = StringReplace($sFormat, "dd",$Day_Raw)
$sFormat = StringReplace($sFormat, "d", $Day_Raw+0)

$sFormat = StringReplace($sFormat, "hh",$Hours_Raw)
$sFormat = StringReplace($sFormat, "h", $Hours_Raw+0)

$sFormat = StringReplace($sFormat, "ss",$Seconds_Raw)
$sFormat = StringReplace($sFormat, "s", $Seconds_Raw+0)

Return $sFormat
EndFunc

Maza Faka
13-08-2007, 12:17
Упрощённая схема кода:


#include <GuiConstants.au3>
Dim $msg, $time = 3000

GUICreate("Test", 300, 200)
GUISetState()

AdlibEnable("Play", $time)

While $msg <> $Gui_Event_Close
$msg = GUIGetMsg()
WEnd

Func Play()
SoundPlay(@ScriptDir & "\24.wav")
$time = 10000
EndFunc


Как присвоить переменной $time значение 10000, что бы
AdlibEnable("Play", $time)

вызывал функцию с этим новым значением переменной?

SvetlanaK
13-08-2007, 17:16
Добрый день!
не подскажет ли кто по сочетаниям клавиш в AutoIt...SendKey.
программа выполняет сохранение файла в Exel. Меню "Файл"- >Enter->-5 раз Down - будет "сохранить как"
Но! другие пользователи поменяли меню "Файл", удалив из него открыть и закрыть...в результате 5 раз Down получилось - печать! скрипт не работает:( по идее надо бы сделать сочетание клавиш Ctrl+S, но
ControlSend("^{S}") просто печатает в ячейке S. не могу понять в чем дело( в кодировках? как быть?
Буду благодарна за любой ответ.

Maza Faka
13-08-2007, 17:33
SvetlanaK
Попробуй так:

Opt("WinTitleMatchMode", 1)
If WinExists("Microsoft Excel") Then WinActivate("Microsoft Excel")
Send("^s")

Sanja Alone
13-08-2007, 21:43
SvetlanaK
Можно и с помощью COM:

$sFilePath = 'D:\MyDoc\Sample.xls' ;путь файла для выполнения действий над ним

$oExcel = ObjGet("", "Excel.Application") ; "схватить" существующий объект Excel (например, файл уже открыт в Excel)
If @error Then ; в случае неудачи создаем новый объект Excel и открываем требуемый файл
$oExcel = ObjCreate("Excel.Application") ; создать объект Excel
If Not IsObj($oExcel) Then Exit ; выйти, если не удалось создать объект Excel
If FileExists($sFilePath) Then $oExcel.Workbooks.Open ($sFilePath) ; открыть в Excel указанный файл
EndIf

$oExcel.CalculateFull ; пересчитать формулы (это просто для примера, здесь можно выполнять массу других действий)
$oExcel.DisplayAlerts = 0 ; отключить предупреждения
$oExcel.Save ; сохранить файл
$oExcel.Quit ; выйти
P.S. Все вышеприведенные действия будут выполнены в hidden-режиме (за одним исключением - если на момент запуска скрипта файл открыт в Excel "руками"). Скрытый режим использован потому, что при данных условиях нет смысла отображать окно Excel - это приведет к неприятному мельканию...

Creat0R
13-08-2007, 21:46
amel27,
например так
Гинеально! Работает лучше чем ожидалось! :up:

Я правда добавил небольшую подстраховку на $Stamp :)


Func _DateTimeConvertFormat($sFormat)
Local $Stamp = '<_>'
While StringInStr($sFormat, $Stamp)
$Stamp = '<'& Random(10000000,99999999,1) &'>'
WEnd

StringReplace($sFormat, "y", "")
Local $Year = StringRight(@YEAR, @extended)
Local $Mounth = @MON
Local $Day = @MDAY
Local $Hours = @HOUR
Local $Minutes = @MIN
Local $Seconds = @SEC

$sFormat = StringRegExpReplace($sFormat, "(?i)(?:(d+|y+)(\W*)(mm)|(mm)(\W*)(d+|y+))", '\1\2' & $Stamp & '\5\6')
If @extended Then $sFormat = StringReplace($sFormat, $Stamp, $Mounth)
$sFormat = StringRegExpReplace($sFormat, "(?i)(?:(d+|y+)(\W*)(m)|(m)(\W*)(d+|y+))", '\1\2' & $Stamp & '\5\6')
If @extended Then $sFormat = StringReplace($sFormat, $Stamp, $Mounth+0)

$sFormat = StringRegExpReplace($sFormat, '(?i)y+', $Year)

$sFormat = StringReplace($sFormat, "mm",$Minutes)
$sFormat = StringReplace($sFormat, "m", $Minutes+0)

$sFormat = StringReplace($sFormat, "dd",$Day)
$sFormat = StringReplace($sFormat, "d", $Day+0)

$sFormat = StringReplace($sFormat, "hh",$Hours)
$sFormat = StringReplace($sFormat, "h", $Hours+0)

$sFormat = StringReplace($sFormat, "ss",$Seconds)
$sFormat = StringReplace($sFormat, "s", $Seconds+0)

Return $sFormat
EndFunc


Шанс конечно очень маленький (а точнее мизерный) на то что будет сгенерирован штамп существующий в передаваемом формате даты/времени, но он всё же есть ;)

Maza Faka,
Как присвоить переменной $time значение 10000, что бы
AdlibEnable("Play", $time)
вызывал функцию с этим новым значением переменной?

Просто вызови по новой функцию ;) :


#include <GuiConstants.au3>
Dim $msg, $time = 3000

GUICreate("Test", 300, 200)
GUISetState()

AdlibEnable("Play", $time)

While $msg <> $Gui_Event_Close
$msg = GUIGetMsg()
WEnd

Func Play()
SoundPlay(@ScriptDir & "\24.wav")
$time = 10000
AdlibEnable("Play", $time)
EndFunc


SvetlanaK,
ControlSend("^{S}") просто печатает в ячейке S
Потому что там фокус находится...
Попробуй активировать окно Excel (тем самым убрав фокус с ячеек), затем вызвать клавиши.
Но тут возможна всплывёт другая проблема - если раскладка языка клавиатуры по умолчанию будет русской к примеру, тогда это сочетание не сработает, нужно будет делать так:


If @KBLayout = 0419 Then
Send("^ы")
Else
Send("^s")
EndIf


Есть ещё один такой подводный камушек - а если изменять профиль сочетании клавиш в Excel? не знаком с ним, но полагаю там есть такая возможность? :)




© OSzone.net 2001-2012