Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.
ошибки выдают »
сам не хошь поразвлекаться? ;) какой выбрал?... там по ходу скрипты немного устарели, надо править для новых версий AutoIT
TERMINAL
14-04-2008, 14:01
amel27, у меня просто времени нет в чужих трудах копаться :( Пробовал все 3 которые ты давал-ниодин не заработал...
у меня просто времени нет в чужих трудах копаться »
ну... тут со временем у всех туго, вряд ли кто "с нуля" напишет для тебя прогу - начни и тебе помогут... собственно, за готовыми решениями в другую ветку (http://forum.oszone.net/forum-7.html) ;)
Maza Faka
16-04-2008, 16:49
amel27
Только ты можешь помочь! :pray:
Пытаюсь сменить разрешение экрана, но безуспешно :(
Global Const $CDS_TEST = 0x00000002
Global Const $CCDEVICENAME = 32
Global Const $CCFORMNAME = 32
Global Const $DM_PELSWIDTH = 0x80000
Global Const $DM_PELSHEIGHT = 0x100000
Global Const $DM_BITSPERPEL = 0x40000
Global Const $WM_DISPLAYCHANGE = 0x007E
Global Const $HWND_BROADCAST = 0xFFFF
Global Const $SPI_SETNONCLIENTMETRICS = 0x2A
Global Const $DM_DISPLAYFLAGS = 0x200000
$DEVMODE = DllStructCreate("char dmDeviceName[255];ushort dmSpecVersion;ushort dmDriverVersion;ushort dmSize;" & _
"ushort dmDriverExtra;dword dmFields;int dmOrientation;int dmPaperSize;int dmPaperLength;" & _
"int dmPaperWidth;int dmScale;int dmCopies;int dmDefaultSource;int dmPrintQuality;" & _
"int dmColor;int dmDuplex;int dmYResolution;int dmTTOption;int dmCollate;char dmFormName[255];" & _
"int dmUnusedPadding;int dmBitsPerPel;int dmPelsWidth;int dmPelsHeight;dword dmDisplayFlags;" & _
"dword dmDisplayFrequency")
DllStructSetData($DEVMODE, "dmDeviceName", $CCDEVICENAME)
DllStructSetData($DEVMODE, "dmFormName", $CCFORMNAME)
DllStructSetData($DEVMODE, "dmPelsWidth", 800)
DllStructSetData($DEVMODE, "dmPelsHeight", 600)
DllStructSetData($DEVMODE, "dmBitsPerPel", 16)
DllStructSetData($DEVMODE, "dmDisplayFrequency", 60)
DllStructSetData($DEVMODE, "dmSize", DllStructGetSize($DEVMODE))
DllStructSetData($DEVMODE, "dmFields", BitOR($DM_PELSWIDTH, $DM_PELSHEIGHT, $DM_BITSPERPEL))
$DllRet = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_TEST)
ConsoleWrite("DllRet = " & $DllRet[0] & @LF)
DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, _
"int", $SPI_SETNONCLIENTMETRICS, "int", 0)
Maza Faka,
Пытаюсь сменить разрешение экрана
Многое уже до нас придумано ;)
$iWidth = 1024
$iHeight = 768
$iBitsPP = 32
$iRefreshRate = 85
$vRes = _ChangeScreenRes($iWidth, $iHeight, $iBitsPP, $iRefreshRate)
If @error Then
MsgBox(262160, "ERROR", "Unable to change screen - check parameters")
EndIf
;===============================================================================
;
; Function Name: _ChangeScreenRes()
; Description: Changes the current screen geometry, colour and refresh rate.
; Version: 1.0.0.1
; Parameter(s): $i_Width - Width of the desktop screen in pixels. (horizontal resolution)
; $i_Height - Height of the desktop screen in pixels. (vertical resolution)
; $i_BitsPP - Depth of the desktop screen in bits per pixel.
; $i_RefreshRate - Refresh rate of the desktop screen in hertz.
; Requirement(s): AutoIt Beta > 3.1
; Return Value(s): On Success - Screen is adjusted, @ERROR = 0
; On Failure - sets @ERROR = 1
; Forum(s): http://www.autoitscript.com/forum/index.php?showtopic=20121
; Author(s): Original code - psandu.ro
; Modifications - PartyPooper
;
;===============================================================================
Func _ChangeScreenRes($i_Width=@DesktopWidth, $i_Height=@DesktopHeight, $i_BitsPP=@DesktopDepth, $i_RefreshRate=@DesktopRefresh)
Local Const $DM_PELSWIDTH = 0x00080000
Local Const $DM_PELSHEIGHT = 0x00100000
Local Const $DM_BITSPERPEL = 0x00040000
Local Const $DM_DISPLAYFREQUENCY = 0x00400000
Local Const $CDS_TEST = 0x00000002
Local Const $CDS_UPDATEREGISTRY = 0x00000001
Local Const $DISP_CHANGE_RESTART = 1
Local Const $DISP_CHANGE_SUCCESSFUL = 0
Local Const $HWND_BROADCAST = 0xffff
Local Const $WM_DISPLAYCHANGE = 0x007E
If $i_Width = "" Or $i_Width = -1 Then $i_Width = @DesktopWidth ; default to current setting
If $i_Height = "" Or $i_Height = -1 Then $i_Height = @DesktopHeight ; default to current setting
If $i_BitsPP = "" Or $i_BitsPP = -1 Then $i_BitsPP = @DesktopDepth ; default to current setting
If $i_RefreshRate = "" Or $i_RefreshRate = -1 Then $i_RefreshRate = @DesktopRefresh ; default to current setting
Local $stDEVMODE = DllStructCreate("byte[32];int[10];byte[32];int[6]")
Local $aEnumDisplay = DllCall("user32.dll", "int", "EnumDisplaySettings", "ptr", 0, "long", 0, _
"ptr", DllStructGetPtr($stDEVMODE))
If @error Then Return SetError(1, 0, 0)
If $aEnumDisplay[0] <> 0 Then
DllStructSetData($stDEVMODE, 2, BitOR($DM_PELSWIDTH, $DM_PELSHEIGHT, $DM_BITSPERPEL, $DM_DISPLAYFREQUENCY), 5)
DllStructSetData($stDEVMODE, 4, $i_Width, 2)
DllStructSetData($stDEVMODE, 4, $i_Height, 3)
DllStructSetData($stDEVMODE, 4, $i_BitsPP, 1)
DllStructSetData($stDEVMODE, 4, $i_RefreshRate, 5)
$aEnumDisplay = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($stDEVMODE), "int", $CDS_TEST)
If @error Then
$aEnumDisplay = -1
Else
$aEnumDisplay = $aEnumDisplay[0]
EndIf
Select
Case $aEnumDisplay = $DISP_CHANGE_RESTART
$stDEVMODE = ""
Return 2
Case $aEnumDisplay = $DISP_CHANGE_SUCCESSFUL
DllCall("user32.dll", "int", "ChangeDisplaySettings", _
"ptr", DllStructGetPtr($stDEVMODE), "int", $CDS_UPDATEREGISTRY)
DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, _
"int", $i_BitsPP, "int", $i_Height * 2 ^ 16 + $i_Width)
$stDEVMODE = ""
Return 1
Case Else
$stDEVMODE = ""
Return SetError(1, 0, $aEnumDisplay)
EndSelect
EndIf
EndFunc ;==>_ChangeScreenRes
Maza Faka
16-04-2008, 18:03
Creat0RМногое уже до нас придумано »
Я знаю, про этот код, но он у меня не работает, из 11 компьютеров срабатывает только на нескольких, да и то через раз. :( Так же есть утилитка написаная на C с использованием функции ChangeDisplaySettings и она прекрасно работает, вот я и пытаюсь написать рабочий код. :)
Maza Faka
из 11 компьютеров срабатывает только на нескольких, да и то через раз »Тут немного погуглил - оказалось эта проблема встречается довольно часто когда функции ChangeDisplaySettings() и EnumDisplaySettings() для нормальной работы требуют снятия в свойствах экрана чекбокса "Скрыть неподдерживаемые режимы...", к примеру: http://www.codeproject.com/KB/system/enum_display_modes.aspx (см. комменты). Думаю это зависит от конкретного драйвера, но нигде не встречал решения равно как и программного способа снять эту галку... Тем более цепляет что:есть утилитка написаная на C с использованием функции ChangeDisplaySettings и она прекрасно работаетможет она использует EX-версии функций?
Maza Faka
18-04-2008, 07:27
amel27
Спасибо за информацию, как я уже тебе писал (в личку), всё дело именно в чекбоксе, а снять его несложно через реестр. :)
Спасибо ещё раз :up:
Maza Faka, снять его несложно через реестр
Было бы полезно подсказать, где заветный раздел можно найти? :) - ведь функцию тогда можно сделать так, чтобы в начале (запомнив значение) записать снятие птички, а на возврате функции вернуть всё обратно...
Maza Faka
18-04-2008, 18:48
Creat0R
Было бы полезно подсказать, где заветный раздел можно найти? »
Воть: :)
_ScreenSetting(800, 600, 32, 85)
Func _ScreenSetting($iWidth = @DesktopWidth, $iHeight = @DesktopHeight, $iDepth = @DesktopDepth, $iRefresh = @DesktopRefresh)
Local Const $DISP_CHANGE_SUCCESSFUL = 0
Local Const $DISP_CHANGE_RESTART = 1
Local Const $DISP_CHANGE_FAILED = -1
Local Const $DISP_CHANGE_BADMODE = -2
Local Const $DISP_CHANGE_NOTUPDATED = -3
Local Const $DISP_CHANGE_BADFLAGS = -4
Local Const $DISP_CHANGE_BADPARAM = -5
Local Const $CDS_TEST = 0x4
Local Const $CDS_UPDATEREGISTRY = 0x1
Local Const $DM_PELSWIDTH = 0x80000
Local Const $DM_PELSHEIGHT = 0x100000
Local Const $DM_BITSPERPEL = 0x40000
Local Const $DM_DISPLAYFREQUENCY = 0x400000
Local Const $ENUM_CURRENT_SETTINGS = -1
Local Const $WM_DISPLAYCHANGE = 0x007E
Local Const $HWND_BROADCAST = 0xFFFF
Local Const $SPI_SETNONCLIENTMETRICS = 0x2A
Local $DEVMODE, $DllRet
$DEVMODE = DllStructCreate("char dmDeviceName[32];ushort dmSpecVersion;ushort dmDriverVersion;short dmSize;" & _
"ushort dmDriverExtra;dword dmFields;short dmOrientation;short dmPaperSize;short dmPaperLength;" & _
"short dmPaperWidth;short dmScale;short dmCopies;short dmDefaultSource;short dmPrintQuality;" & _
"short dmColor;short dmDuplex;short dmYResolution;short dmTTOption;short dmCollate;" & _
"byte dmFormName[32];dword dmBitsPerPel;int dmPelsWidth;dword dmPelsHeight;" & _
"dword dmDisplayFlags;dword dmDisplayFrequency")
$DllRet = DllCall("user32.dll", "int", "EnumDisplaySettings", "ptr", 0, "dword", $ENUM_CURRENT_SETTINGS, _
"ptr", DllStructGetPtr($DEVMODE))
$DllRet = $DllRet[0]
If $DllRet = 0 Then
MsgBox(16, "Error", "Unable to get graphic mode")
Return False
EndIf
$VGA_MAP_KEY = RegRead("HKLM\HARDWARE\DEVICEMAP\VIDEO", "\Device\Video0")
$VGA_KEY = StringReplace($VGA_MAP_KEY, "\Registry\Machine", "HKLM")
RegWrite($VGA_KEY, "PruningMode", "REG_DWORD", 0)
DllStructSetData($DEVMODE, "dmSize", DllStructGetSize($DEVMODE))
DllStructSetData($DEVMODE, "dmPelsWidth", $iWidth)
DllStructSetData($DEVMODE, "dmPelsHeight", $iHeight)
DllStructSetData($DEVMODE, "dmBitsPerPel", $iDepth)
DllStructSetData($DEVMODE, "dmDisplayFrequency", $iRefresh)
DllStructSetData($DEVMODE, "dmFields", BitOR($DM_PELSWIDTH, $DM_PELSHEIGHT, $DM_BITSPERPEL, $DM_DISPLAYFREQUENCY))
$DllRet = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_TEST)
$DllRet = $DllRet[0]
If $DllRet <> $DISP_CHANGE_SUCCESSFUL Then
Switch $DllRet
Case $DISP_CHANGE_RESTART
MsgBox(48, "Warning", "Restart your computer for change display settings")
Case $DISP_CHANGE_FAILED
MsgBox(16, "Error", "The video driver not set a new mode")
Return False
Case $DISP_CHANGE_BADMODE
MsgBox(16, "Error", "Video mode not supported")
Return False
Case $DISP_CHANGE_NOTUPDATED
MsgBox(16, "Error", "Unable to write in registry")
Return False
Case $DISP_CHANGE_BADFLAGS
MsgBox(16, "Error", "Bad flags")
Return False
Case $DISP_CHANGE_BADPARAM
MsgBox(16, "Error", "Bad parameters")
Return False
EndSwitch
EndIf
$DllRet = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_UPDATEREGISTRY)
$DllRet = $DllRet[0]
DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, _
"int", $SPI_SETNONCLIENTMETRICS, "int", 0)
RegWrite($VGA_KEY, "PruningMode", "REG_DWORD", 1)
$DEVMODE = ""
$DllRet = ""
EndFunc
P.S.
2 All! Пожалуйста протестируйте кому не лень. :)
Maza Faka, Воть
Спасибо.
протестируйте кому не лень
Потестировал на двух совершенно разных машинах, работает отлично!
На заметку UDF'о-строителю; плохая идея отображать MsgBox'ы прямо из функции, в случае ошибки всегда нужно возвращать её код, пользователь (функцией :) ) сам решит что нужно делать в случае ошибки.
[hr]
ALL
Такой вопрос: Как можно перекодировать текст кириллицы в Java-юникод?
К примеру «Привет Мир!» будет кодирован так (это я редактор yudit (http://www.yudit.org/) использовал):
\u041f\u0440\u0438\u0432\u0435\u0442 \u041c\u0438\u0440
Нашёл неплохую статью (http://www.javaportal.ru/java/articles/UnicodeJDK1_6.html) на эту тему, но самому не удаётся сообразить, как всё же (и можно ли вообще) средствами AutoIt'а кодировать кириллицу в Java-Unicode?
Maza Faka
22-04-2008, 08:31
Creat0R, На заметку UDF'о-строителю; плохая идея отображать MsgBox'ы прямо из функции, в случае ошибки всегда нужно возвращать её код, пользователь (функцией ) сам решит что нужно делать в случае ошибки. »
Спасибо, учту на будущее :up:
Creat0R
как всё же (и можно ли вообще) средствами AutoIt'а кодировать кириллицу в Java-Unicode? »типа такого?MsgBox (0,"", _StringToJava("Привет Мир!"))
Func _StringToJava($sText)
Local $tw = DllStructCreate("wchar["& StringLen($sText)+1 &"]"), $sOut=""
Local $ts = DllStructCreate("ushort["&StringLen($sText)+1 &"]", DllStructGetPtr($tw))
Local $tb = DllStructCreate("byte["&StringLen($sText)*2+2 &"]", DllStructGetPtr($tw))
DllStructSetData($tw, 1, $sText)
For $i=1 To StringLen($sText)
If DllStructGetData($tb,1,$i*2) Then
$sOut &= "\u"& Hex(DllStructGetData($ts,1,$i),4)
Else
$sOut &= DllStructGetData($tw,1,$i)
EndIf
Next
Return $sOut
EndFunc
amel27, типа такого?
Супер!!! Спасибо :up
P.S
А обратно можно перекодировать? :blush2:
Creat0R
Супер!!!»да нет, нашел ошибку :beta:
А обратно можно перекодировать? »получилось вот что (включая исправленный вариант):MsgBox (0,"_StringToJava()", '"Привет Мир!" ->'& @CRLF &'"'& _StringToJava("Привет Мир!") &'"')
MsgBox (0,"_JavaToString()", '"\u041f\u0440\u0438\u0432\u0435\u0442 \u041c\u0438\u0440!"'& @CRLF &'-> "'& _
_JavaToString("\u041f\u0440\u0438\u0432\u0435\u0442 \u041c\u0438\u0440!") &'"')
Func _StringToJava($sText)
Local $il = StringLen($sText)
Local $tw = DllStructCreate("wchar["& $il+1 &"]"), $sOut=""
Local $ts = DllStructCreate("ushort["&$il+1 &"]", DllStructGetPtr($tw))
DllStructSetData($tw, 1, $sText)
For $i=1 To StringLen($sText)
If DllStructGetData($ts,1,$i)<128 Then
$sOut &= DllStructGetData($tw,1,$i)
Else
$sOut &= "\u"& Hex(DllStructGetData($ts,1,$i),4)
EndIf
Next
Return $sOut
EndFunc
Func _JavaToString($sText)
Local $sOut="", $aText=StringRegExp($sText,"(?:\\u([[:xdigit:]]{4})|[[:ascii:]])",3)
For $i=0 To UBound($aText)-1
If StringLen($aText[$i])=1 Then
$sOut &= $aText[$i]
Else
$sOut &= ChrW(Dec($aText[$i]))
EndIf
Next
Return $sOut
EndFunc
ADD: Возник вопрос с управляющими символами: я тут поиграл Yudit и не совсем понял как должно быть в формате Java, редактор часть ASCII-символов преобразует в Unicode, часть нет... и как быть с символом "\"?.. в Java вроде обозначается "\\" но редактор оставляет одиночным, или нужно учитывать только комбинацию "\u"?.. но тогда как она должна представляться если это обычный текст?... или не заморачиваться и преобразовывать в Unicode все подряд включая ASCII?
amel27, как быть с символом "\"?.. в Java вроде обозначается "\\" но редактор оставляет одиночным
Редактор расчитан на Java-приложения как я понимаю, но в действительности (а точнее в браузерах), для управляющих символов нужно добавлять \.
Простой пример; если вставить это в адресную строку браузера (Opera / IE / FireFox):
javascript: alert('\u041F\u0440\u0438\u0432\u0435\u0442 \u041C\u0438\u0440 \ ' test');
То ничего не произойдёт, а если подставить \ под служебные символы:
javascript: alert('\u041F\u0440\u0438\u0432\u0435\u0442 \u041C\u0438\u0440 \\ \' test');
то будет отображено «Привет мир \ ' test».
Т.е по сути нужно в самом начале функции добавить примерно это:
$sText = StringRegExpReplace($sText, "(['\\])", "\\\1")
Только вопрос как пропарсить обратно в _JavaToString() ? хотя тоже наверно можно через RegExp...
P.S
Кстати, не помешало бы отключать «Opt("Expand(Var/Env)Strings", 0)» для подобной функции, для ускорения обработки :)
Creat0R
исправил с учетом твоих замечаний:
Func _StringToJava($sText)
Local $iLen = StringLen($sText), $sChr, $iAsc
Local $tChr = DllStructCreate("wchar["& $iLen+1 &"]"), $sOut=""
Local $tAsc = DllStructCreate("ushort["&$iLen+1 &"]", DllStructGetPtr($tChr))
DllStructSetData($tChr, 1, $sText)
For $i=1 To StringLen($sText)
$sChr = DllStructGetData($tChr,1,$i)
$iAsc = DllStructGetData($tAsc,1,$i)
If $sChr = "\" Or $sChr = "'" Then
$sOut &= "\"& $sChr
ElseIf $iAsc<128 Then
$sOut &= $sChr
Else
$sOut &= "\u"& Hex($iAsc,4)
EndIf
Next
Return $sOut
EndFunc
Func _JavaToString($sText)
Local $sOut="", $aText=StringRegExp($sText,"(\\\\|\\'|\\u[[:xdigit:]]{4}|[[:ascii:]])", 3)
For $i=0 To UBound($aText)-1
Switch StringLen($aText[$i])
Case 1
$sOut &= $aText[$i]
Case 2
$sOut &= StringRight($aText[$i],1)
Case 6
$sOut &= ChrW(Dec(StringRight($aText[$i],4)))
EndSwitch
Next
Return $sOut
EndFunc
amel27, Осеньно надоть в скрипте определять, данная директория или файл реальные или это ссылки ( в смысле NTFS связи ) И самое главное если связи, то на что они указывають?! С надеждой!
amel27,
исправил с учетом твоих замечаний:
Спасибо огромное, всё отлично работает!
У меня тут возникла проблема с твоими самопальными _FileSave/OpenDialog() и _FileSelectFolder(); на системе где нет поддержки кириллицы, заголовок с русским текстом отображается некорреткно. Как известно в AutoIt добавили поддержку юникода, и как раз оригинальные функции нормально отображают символы кириллицы, вот можно как то поправить и твои функции, чтобы поддерживали Unicode? :blush2:
Кстати, в последних бетах к подобным функциям (практический ко всем диалоговым) приделали наконец дополнительный параметр Win Handle :), но для моих целей нет возможности перейти на эти беты, слишком многое менять нужно в скриптах :(.
NikLok
Насколько я понял речь о символических ссылках, так как для жестких ссылок нельзя отличить ссылку от файла... Имхо различить линк и экземпляр вполне реально через стандартные файловые API, а вот найти путь к оригиналу пока проблематично - полноценные API-функции добавили только в Vista/2008... хотя помнится у API-аналога FileOpenDialog() был флаг, задающий что фозвращает ф-ция - линк или путь к оригиналу... хотя вполне возможно это обычные ярлыки (*.LNK)
Creat0R
дай линки на используемые редакции (а то их уже было немеренно) или кинь в личку
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.