Ru-Board.club
← Вернуться в раздел «Программы»

» AutoIT

Автор: ViSiToR
Дата сообщения: 12.11.2008 23:37
NIKZZZZ 20:28 12-11-2008
Цитата:
нужно получить .au3 скрипт, работающий на машине, на которой отсутствуют .au3 библиотеки, тоесть выбросить все #include

А не проще подключить эти библиотеки? или это принципиально важно, собрать все инклюды в родительский скрипт?


Цитата:
есть ли что-либо готовое для этой цели?

amel27 написал функции для получения списка всех инклюдов (рекурсия учитывается), а там уже не сложно пройтись по ним и дописать в исходный скрипт их содержание (без инклюдов). Если подходит такой вариант, могу выложить эти функции.
Автор: NIKZZZZ
Дата сообщения: 13.11.2008 00:37
ViSiToR

Цитата:
это принципиально важно, собрать все инклюды в родительский скрипт?

Принципиально. Имеется минимальная обрезанная система, которая крутится в виртуалке. Необходимо именно под ней отладить скрипт, иногда желательно так-же отлаживать UDF'ки.
Loopback

Цитата:
последних версиях Autoit остался только Preprocessor

Попробовал, вроде-бы делает все, что надо.






Автор: ViSiToR
Дата сообщения: 13.11.2008 00:59
NIKZZZZ
Вобщем вот что получилось, я даже сам сделал функцию для смешивания инклюдов (_AU3_MergeAllLibs() ):


Код:
_AU3_MergeAllLibs(@ScriptDir & "\Test.au3")

; ===============================================================
; _AU3_MergeAllLibs($sScriptFile, $iIncludeComments=0, $iRemoveIncludes=1)
; ---------------------------------------------------------------
; Смешивает вложенные библиотеки в тело скрипта
; (таким образом преобразовывая один цельный скрипт со всеим функциями и переменными)
; Использован AutoIT v3.2.12.1
;
; $sScriptFile : AutoIT-скрипт для смешивания
; $iIncludeComments : Определяет, нужно ли обрабатывать строки комментариев
; $iRemoveIncludes : Определяет, нужно ли удалять строки #include'ов с исходного скрипта
;
; Автор : G.Sandler (a.k.a CreatoR)
; ===============================================================

Func _AU3_MergeAllLibs($sScriptFile, $iIncludeComments=0, $iRemoveIncludes=1)
Local $aGetAllLibs, $aScript_Content, $sRead_SrcScript, $sHeader_Content, $hFOpen, $iIsFuncBody = 0
$sRead_SrcScript = FileRead($sScriptFile)

_AU3_GetAllLibUDF($sRead_SrcScript, $aGetAllLibs)

If $iRemoveIncludes Then $sRead_SrcScript = StringRegExpReplace($sRead_SrcScript, "(?i)(?s)#include.*?[\r\n]+", "")

For $i = 1 To $aGetAllLibs[0][0]
$iIsFuncBody = 0
$aScript_Content = StringSplit(StringStripCR(StringStripWS(FileRead($aGetAllLibs[$i][1]), 3)), @LF)

For $j = 1 To $aScript_Content[0]
If $aScript_Content[$j] = "" Then ContinueLoop ;We don't need the empty lines, right?

If StringLeft($aScript_Content[$j], 8) = "#include" Then ContinueLoop ;We don't need the #includes, right?
If Not $iIncludeComments And StringLeft($aScript_Content[$j], 1) = ";" Then ContinueLoop

If
StringLeft($aScript_Content[$j], 4) = "Func" Then
$sRead_SrcScript &= @CRLF
$iIsFuncBody = 1
ElseIf StringLeft($aScript_Content[$j], 7) = "EndFunc" Then
$sRead_SrcScript &= $aScript_Content[$j] & @CRLF
$iIsFuncBody = 0

ContinueLoop
EndIf

If Not
$iIsFuncBody Then ;Write to the Begining of file (Collecting the variables/constants Header)
$sHeader_Content &= $aScript_Content[$j] & @CRLF
Else ;Write to the End of file (UDF functions)
$sRead_SrcScript &= $aScript_Content[$j] & @CRLF
EndIf
Next
Next

If
$sHeader_Content <> "" Then $sRead_SrcScript = $sHeader_Content & @CRLF & $sRead_SrcScript

$hFOpen
= FileOpen($sScriptFile, 2)
FileWrite($hFOpen, $sRead_SrcScript)
FileClose($hFOpen)
EndFunc ; ==> _AU3_MergeAllLibs

; ===============================================================
; _AU3_GetAllLibUDF($sScript_Content, $aIncludes_Arr)
; ---------------------------------------------------------------
; Возвращает массив всех загруженных UDF и библиотечных файлов
; Использован AutoIT v3.2.12.0
;
; $sScript_Content : текст AutoIT-скрипта
; $aIncludes_Arr : ссылка на переменную для выходного массива,
; по выходу содержит двумерный массив:
; $aIncludes_Arr[0][0] - количество элементов в массиве
; $aIncludes_Arr[$i][0] - тип библиотечного файла
; $aIncludes_Arr[$i][1] - Полный путь библиотечного файла
; $aIncludes_Arr[$i][2] - массив UDF, определенных в файле
;
; Функция рекурсивная, поэтому выход по ошибке не предусмотрен
;
; Автор : amel27
; ===============================================================

Func _AU3_GetAllLibUDF($sScript_Content, ByRef $aIncludes_Arr)
Local Const $rFile = '(?i)(?:^|[\n\r])[ \t]*#include[ \t]+((?:\<|")[^\n\r\"\>]+(?:\>|"))'
Local Const $rUDFs = '(?i)(?:^|[\n\r])[ \t]*Func[ \t]+([\w\d]+)'

; Инициализация массива при первом входе / сохранение списка UDF
If UBound($aIncludes_Arr, 2) <> 3 Then Dim $aIncludes_Arr[2][3] = [[1, 0, 0], [0, "", 0]]
$aIncludes_Arr[$aIncludes_Arr[0][0]][2] = StringRegExp($sScript_Content, $rUDFs, 3)

; Инициализация переменных / Получение списка библиотечных файлов
Local $sPath, $iType, $sName, $sText
Local $aFile = StringRegExp($sScript_Content, $rFile, 3)

; Пофайловая обработка списка библиотек
If IsArray($aFile) Then
For
$i = 0 To UBound($aFile)-1
$sPath = _AU3_LibIncToPath($aFile[$i]) ; полное имя файла
If @error Then ContinueLoop ; файл не найден

$iType = @extended ; тип библиотеки
$sName = StringRegExpReplace($sPath, "(?:[^\\]+\\)+", "") ; краткое имя файла

; Исключение повторной обработки / Чтение файла
For $j = 1 To $aIncludes_Arr[0][0]
If $aIncludes_Arr[$j][0] == $iType And $aIncludes_Arr[$j][1] == $sName Then ContinueLoop 2
Next

$sText = FileRead($sPath)
If @error Then ContinueLoop

; При успешном чтении добавляем файл в выходной массив
$aIncludes_Arr[0][0] +=1
ReDim $aIncludes_Arr[$aIncludes_Arr[0][0]+1][3]

$aIncludes_Arr[$aIncludes_Arr[0][0]][0] = $iType
$aIncludes_Arr[$aIncludes_Arr[0][0]][1] = $sPath ;$sName

; Рекурсивный вызов на обработку текста библиотеки
_AU3_GetAllLibUDF($sText, $aIncludes_Arr)
Next
EndIf
EndFunc ; ==> _AU3_GetAllLibUDF

; ===============================================================
; _AU3_LibIncToPath($sInclude)
; ---------------------------------------------------------------
; Возвращает полный путь к библиотечному файлу по строке загрузки
; Использован AutoIT v3.2.12.0
;
; $sInclude : строка загрузки в формате #include, примеры:
; '<array.au3>'
; '"array.au3"'
; '"c:\Program Files\AutoIT3\Include\array.au3"'
;
; При успехе : возвращает полное имя файла, содержащее путь,
; макрос @extended указывает на тип библиотеки:
; 1 - системная библиотека (каталог установки)
; 2 - текущая библиотека (каталог скрипта)
; 3 - пользовательская библиотека (путь из реестра)
; 4 - путь к библиотеке явно указан при загрузке
;
; При неудаче : возвращает пустую строку и устанавливает @error:
; 1 - ошибка формата строки
; 2 - файл не найден
;
; Автор : amel27
; ===============================================================
Func _AU3_LibIncToPath($sInclude)
Local $aRegExp = StringRegExp($sInclude, '^(<|")([^>"]+)(?:>|")$', 3)

; Проверка на корректность формата строки
If Not IsArray($aRegExp) Then Return SetError(1, 0, "")
$sInclude = $aRegExp[1]

If StringInStr($sInclude, "\") = 0 Then
Local $sSYS, $sUDL, $aUDL, $sAU3 = @ScriptDir & "\" & $sInclude

; Определение каталога системных библиотек
$sSYS = StringRegExpReplace(@AutoItExe, "\\[^\\]+$", "")
$sSYS &= "\Include\"& $sInclude

; Чтение списка каталогов пользовательских библиотек
$sUDL = RegRead("HKCU\Software\AutoIt v3\AutoIt", "Include")
$aUDL = StringRegExp($sUDL, "([^;]+)(?:;|$)", 3)

; Проверка типов 1 и 2 (до пользовательских библиотек)
If $aRegExp[0] == '<' Then
If FileExists($sSYS) Then Return SetError(0, 1, $sSYS)
ElseIf $aRegExp[0] == '"' Then
If FileExists($sAU3) Then Return SetError(0, 2, $sAU3)
EndIf

; Проверка типа 3 (поиск среди пользовательских библиотек)
If IsArray($aUDL) Then
For $i = 0 To UBound($aUDL)-1
$aUDL[$i] &= "\" & $sInclude
If FileExists($aUDL[$i]) Then Return SetError(0, 3, $aUDL[$i])
Next
EndIf

; Проверка типов 1 и 2 (после пользовательских библиотек)
If $aRegExp[0] == '<' Then
If FileExists($sAU3) Then Return SetError(0, 2, $sAU3)
ElseIf $aRegExp[0] == '"' Then
If FileExists($sSYS) Then Return SetError(0, 1, $sSYS)
EndIf
Else
; Проверка типа 4 (файл с указанием полного пути)
If FileExists($sInclude) Then Return SetError(0, 4, $sInclude)
EndIf

; ОШИБКА: файл не найден
Return SetError(2, 0, "")
EndFunc ; ==> _AU3_LibIncToPath
Автор: Maza_Faka
Дата сообщения: 13.11.2008 06:18
Partner1

Цитата:
щелкнуть по пункту в контекстном меню любой программы (по имени) висящей в трее?

Кликнуть по иконке в трее можно с помощью этой функции:
[more]

Код: #NoTrayIcon
#Include
<GuiToolBar.au3>

_SysTray_ClickItem("AIMP2", "right", 1)

If @error Then MsgBox(48, "Failure", "Required item not found")

; #FUNCTION# ====================================================================================================================
;Function Name: _SysTray_ClickItem()
;Description: Click on item in Windows system tray by any substring in the title
;Parameters: $iTitle - The title of the item in Windows system tray (you can see the title of the item when mouse cursor hovered on item).
; $iButton - [optional] The button to click, "left" or "right". Default is the left button.
; $iClick - [optional] The number of times to click the mouse. Default is 1
; $sMove = [optional] True = Mouse will be moved, False (default) = Mouse will not be moved
; $iSpeed = [optional] Mouse movement speed
;Return Value(s): Success - Returns 1
; Failure - Returns 0 and sets @error to 1 if required item not found
;Requirement(s): AutoIt 3.2.10.0 and above
;Autor(s): R.Gilman (a.k.a rasim); Siao (Thanks for idea)
;================================================================================================================================

Func _SysTray_ClickItem($iTitle, $iButton = "left", $iClick = 1, $sMove = False, $iSpeed = 1)
Local $hToolbar, $iButCount, $aRect, $cID, $i

$hToolbar
= ControlGetHandle("[Class:Shell_TrayWnd]", "", "[Class:ToolbarWindow32;Instance:1]")
If @error Then
Return
SetError(1, 0, 0)
EndIf

$iButCount = _GUICtrlToolbar_ButtonCount($hToolbar)
If $iButCount = 0 Then
Return
SetError(2, 0, 0)
EndIf

For
$i = 0 To $iButCount - 1
$cID = _GUICtrlToolbar_IndexToCommand($hToolBar, $i)
If StringInStr(_GUICtrlToolbar_GetButtonText($hToolBar, $cID), $iTitle) Then
_GUICtrlToolbar_ClickButton($hToolbar, $cID, $iButton, $sMove, $iClick, $iSpeed)
Return 1
EndIf
Next

Return
SetError(3, 0, 0)
EndFunc
Автор: Partner1
Дата сообщения: 13.11.2008 08:57
Maza_Faka
Спасибо! Буду сидеть разбираться.

Добавлено:
AutoIt v3: Your Quick Guide e-book 2007 O’Reilly Media, Inc
http://www.board4all.cz/showthread.php?p=252144
Автор: Mister_Che
Дата сообщения: 13.11.2008 11:37
Cкажите, пожалуйста, как эмулировать этой прогой клик колесиком (третьей кнопкой мыши)?
Автор: Tipulatoid
Дата сообщения: 13.11.2008 14:23
Mister_Che

Цитата:
Cкажите, пожалуйста, как эмулировать этой прогой клик колесиком (третьей кнопкой мыши)?


Код: MouseClick("middle")
Автор: Mister_Che
Дата сообщения: 13.11.2008 14:49
Господа, ответьте, пожалуйста. На оф. сайте капча не работает - не зарегиться.
Автор: Tipulatoid
Дата сообщения: 13.11.2008 14:54
Mister_Che
Я ошибся в прошлом ответе - поправил. См. выше
Автор: asdfzxcv
Дата сообщения: 13.11.2008 15:02
А как узнать статус сервиса на удалённой тачке авторан он или дизеблед я изощрился конечно через реестр, но может быть есть другой способ ?
и ещё можно ли как нибуть узнать удалённо какая винда стоит на удалённой тачке? я тут тоже изощрился смотрю админиский ресур admin$ если есть то xp а если нет то 98 мож есть какой другой способ ?
Автор: Mister_Che
Дата сообщения: 13.11.2008 15:05
Tipulatoid, спасибо!
Вы спасли мою жизнь.


Добавлено:
Скажите, пожалуйста, а как добавить кнопку экстренной остановки скрипта, по "Эскэйпу", например?
Автор: Maza_Faka
Дата сообщения: 13.11.2008 16:04
Mister_Che

Код:
HotKeySet("{Esc}", "_Exit")

Func _Exit()
    Exit
EndFunc
Автор: timsky
Дата сообщения: 13.11.2008 16:11
Tipulatoid

Цитата:
И чего так все любят рапидшару? Чем старые добрые ftp не устраивают? Никаких тебе ограничений скорости, ожидания в течении 40 секунд, левых окошек и прочей фигни

Дык, фтп еще нужно иметь

Mister_Che

Цитата:
Скажите, пожалуйста, а как добавить кнопку экстренной остановки скрипта, по "Эскэйпу", например?

См. ф-ю HotKeySet в хелпе. Там все четко расписано.
Автор: Mister_Che
Дата сообщения: 13.11.2008 16:12
Maza_Faka
У меня весь скрипт это
While 1
WEnd

внутри которого нажимания, клики.

Засунул вне его - не работает.
Внутри - ошибку выдает.
Помоги, плис.

Exit - это выход из скрипта? А как паузнуть?
Автор: Maza_Faka
Дата сообщения: 13.11.2008 16:14
asdfzxcv

Цитата:
как узнать статус сервиса на удалённой тачке авторан он или дизеблед


Код:
SC.EXE /?
Автор: Tipulatoid
Дата сообщения: 13.11.2008 16:20
Mister_Che

Цитата:
Скажите, пожалуйста, а как добавить кнопку экстренной остановки скрипта, по "Эскэйпу", например?


Код:
HotKeySet("{ESC}", "Terminate")

While 1
    ConsoleWrite ("Скрипт работает" & @CRLF)
WEnd

Func Terminate()
Exit 0
EndFunc
Автор: Maza_Faka
Дата сообщения: 13.11.2008 16:31
Tipulatoid

Цитата:
В шапку бы
И чего так все любят рапидшару? Чем старые добрые ftp не устраивают? Никаких тебе ограничений скорости, ожидания в течении 40 секунд, левых окошек и прочей фигни


timsky

Цитата:

Дык, фтп еще нужно иметь


+1. Залил на ftp, ссылка в шапке
Автор: Tipulatoid
Дата сообщения: 13.11.2008 16:31
Mister_Che

Цитата:
Exit - это выход из скрипта? А как паузнуть?


Код: Global $Paused
HotKeySet("{ESC}", "Terminate")
HotKeySet("{p}", "TogglePause")

While 1
    ConsoleWrite ("Скрипт работает" & @CRLF)
WEnd

Func Terminate()
Exit 0
EndFunc

Func TogglePause()
$Paused = NOT $Paused
While $Paused
        ConsoleWrite ("Скрипт приостановлен" & @CRLF)
Sleep (50)
WEnd
EndFunc
Автор: Mister_Che
Дата сообщения: 13.11.2008 17:40
Работает "Терминэйт", но не работает пауза ни в русской, ни в английской раскладках.
Автор: gal7
Дата сообщения: 13.11.2008 20:06
Посмотрите, пожалуйста можно ли еще усовершенствовать этот скрипт:



Код: Global $COMBO = 0
HotKeySet ("{F3}", "COMBO")
Func COMBO()
If $COMBO = 0 Then
Global $COMBO = 1
For $n = 1 To 8 Step 1
If Eval("@GUI_CtrlId") AND @GUI_CtrlId = Eval("Combo" & $n) Then
Local $idCOMBO = @GUI_CtrlId
While 1
If GUICtrlSendMsg($idCOMBO, $CB_GETDROPPEDSTATE, 0, 0) = 1 Then
Local $COMBOnov = GUICtrlRead($idCOMBO)
If $COMBO <> $COMBOnov Then
ToolTip($COMBOnov, 10, 100)
EndIf
Else
ToolTip("")
Global $COMBO = 0
Return
EndIf
sleep(50)
WEnd
EndIf
Next
Global $COMBO = 0
EndIf
EndFunc
Автор: ViSiToR
Дата сообщения: 13.11.2008 23:33
Tipulatoid 15:23 13-11-2008
Цитата:
И чего так все любят рапидшару?

Реклама -> Заработк -> и т.д.


Maza_Faka 17:31 13-11-2008
Цитата:
Залил на ftp, ссылка в шапке

Обычно на прямые ссылке оставляют размер файла в скобках, для тех кто экономит трафик.

P.S
Долго эта книжка распространялась за 7$, то что её выложат рано или поздно на обменники (бесплатно), было очевидно
Автор: Tipulatoid
Дата сообщения: 14.11.2008 05:10
Mister_Che

Цитата:
Работает "Терминэйт", но не работает пауза ни в русской, ни в английской раскладках.

У меня все работает. Пауза повешена на клавишу p (з) На клавише "Pause/Break" у меня Punto Switcher сидит, потому ее не использовал.
Автор: Maza_Faka
Дата сообщения: 14.11.2008 05:58
gal7

Цитата:
можно ли еще усовершенствовать этот скрипт


Цитата:
но не все мне подошло в примере Maza Faka

Что за пример? Ссылочку пожалуйста, или запости его здесь.
Автор: gal7
Дата сообщения: 14.11.2008 07:35

Цитата:
Что за пример


Код: #include <GuiConstantsEx.au3>
#include <ComboConstants.au3>
#include <WindowsConstants.au3>

Global $sRead

$hGUI = GUICreate("Test GUI", 200, 100)

$CtlCombo = GUICtrlCreateCombo("Long Long Long Long Long Item 1", 50, 30, 100, 20)
GUICtrlSetData(-1, "Long Long Long Long Long Item 2|Long Long Long Long Long Item 3")

$OkButton = GUICtrlCreateButton("Ok", 11, 169, 75, 23)

$CloseButton = GUICtrlCreateButton("Close", 215, 169, 75, 23)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

GUISetState()

While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
Exit
Case $OkButton
MsgBox(0, "", GUICtrlRead($CtlCombo))
EndSwitch

If (GUICtrlSendMsg($CtlCombo, $CB_GETDROPPEDSTATE, 0, 0) = 1) And (GUICtrlRead($CtlCombo) <> $sRead) Then
$sRead = GUICtrlRead($CtlCombo)
$aPos = WinGetPos(GUICtrlGetHandle($CtlCombo))
$iY = (GUICtrlSendMsg($CtlCombo, $CB_GETCURSEL, 0, 0) + 1) * 15 + 3
ToolTip($sRead, $aPos[0], ($aPos[1] + $iY))
EndIf
WEnd

Func WM_COMMAND($hWnd, $msg, $wParam, $lParam)
Local $iIDFrom = BitAND($wParam, 0x0000FFFF)
Local $iCode = BitShift($wParam, 16)

Switch $iIDFrom
Case $CtlCombo
Switch $iCode
Case $CBN_CLOSEUP
ToolTip("")
EndSwitch
EndSwitch

Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
Автор: Maza_Faka
Дата сообщения: 14.11.2008 09:07
gal7
Честно говоря, вся эта идея попахивает извратом, ну не любитель я таких трюков

Код: #include <GuiConstantsEx.au3>
#include <ComboConstants.au3>
#include <WindowsConstants.au3>

Global $TimerProcHandle = DllCallbackRegister("_TimerProc", "none", "hwnd;int;int;dword")

$hGUI = GUICreate("Test GUI", 200, 100)

$CtlCombo = GUICtrlCreateCombo("Long Long Long Long Long Item 1", 50, 30, 100, 20)
GUICtrlSetData(-1, "Long Long Long Long Long Item 2|Long Long Long Long Long Item 3")

$hCombo = GUICtrlGetHandle($CtlCombo)
$hEdit = DllCall("User32.dll", "hwnd", "FindWindowEx", "hwnd", $hCombo, "hwnd", 0, "ptr", 0, "ptr", 0)
$hEdit = $hEdit[0]

$OkButton = GUICtrlCreateButton("Ok", 11, 169, 75, 23)

$CloseButton = GUICtrlCreateButton("Close", 215, 169, 75, 23)

GUISetState()

Global $TimerCall = DllCall("user32.dll", "int", "SetTimer", "hwnd", 0, "int", 0, "int", 100, _
"ptr", DllCallbackGetPtr($TimerProcHandle))
$TimerCall = $TimerCall[0]

While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
Exit
Case $OkButton
MsgBox(0, "", GUICtrlRead($CtlCombo))
EndSwitch
WEnd

DllCallbackFree($TimerProcHandle)
DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "int", $TimerCall)

Func _TimerProc($hWnd, $Msg, $IdTimer, $dwTime)
Local $hWndFrom, $sRead, $aPos, $iState, $iY

$hWndFrom = DllCall("user32.dll", "hwnd", "WindowFromPoint", "int", MouseGetPos(0), "int", MouseGetPos(1))
$sRead = GUICtrlRead($CtlCombo)
$aPos = WinGetPos(GUICtrlGetHandle($CtlCombo))
$iState = GUICtrlSendMsg($CtlCombo, $CB_GETDROPPEDSTATE, 0, 0)

If $iState = 1 Then
$iY = (GUICtrlSendMsg($CtlCombo, $CB_GETCURSEL, 0, 0) + 1) * 15 + 3
Else
$iY = -17
EndIf

If ($hWndFrom[0] = $hCombo) Or ($hWndFrom[0] = $hEdit) Or ($iState = 1) Then
ToolTip($sRead, $aPos[0], $aPos[1] + $iY)
Else
ToolTip("")
EndIf
EndFunc
Автор: Mister_Che
Дата сообщения: 14.11.2008 09:38
Tipulatoid

Цитата:
У меня все работает. Пауза повешена на клавишу p (з) На клавише "Pause/Break" у меня Punto Switcher сидит, потому ее не использовал.


Сменил на {PAUSE}, не выходит. Терминэйт работает.



Цитата:

Global $Paused
HotKeySet("{ESC}", "Terminate")
HotKeySet("{PAUSE}", "TogglePause")

while 1

не имеющий значения код с кликами и слипами

WEnd

Func Terminate()
Exit 0
EndFunc

Func TogglePause()
$Paused = NOT $Paused
EndFunc
Автор: ViSiToR
Дата сообщения: 14.11.2008 09:42
Maza_Faka
Забавно как мы почти одинаково мыслим, я тут вот что наваял, и тоже не люблю такие методы (кстати, в этих примерах тултип начинает "плыть" если в списке больше 3-4 строк )...


Код: #include <GuiConstantsEx.au3>
#include <ComboConstants.au3>
#include <WindowsConstants.au3>
#include <GuiComboBoxEx.au3>

Global $iComboIsOpen = False

$hGUI = GUICreate("Test GUI", 200, 100)

$CtlCombo = GUICtrlCreateCombo("Long Long Long Long Long Item 1", 50, 30, 100, 20)
GUICtrlSetData(-1, "Long Long Long Long Long Item 2|Long Long Long Long Long Item 3")

$OkButton = GUICtrlCreateButton("Ok", 11, 169, 75, 23)

$CloseButton = GUICtrlCreateButton("Close", 215, 169, 75, 23)

$hTimer = DllCall("user32.dll", "int", "SetTimer", "hwnd", $hGUI, "int", 1001, "int", 10, "ptr", 0)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUIRegisterMsg($WM_TIMER, "WM_TIMER")

GUISetState()

While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
DllCall("user32.dll", "int", "KillTimer", "hwnd", $hGUI, "int", 1001)
Exit
Case
$OkButton
MsgBox(0, "", GUICtrlRead($CtlCombo))
EndSwitch
WEnd

Func
WM_TIMER($hWnd, $nMsg, $wParam, $lParam)
If Not $iComboIsOpen Then Return $GUI_RUNDEFMSG

Local $sHovered_ClassName = _WinGetHoveredClassName()

If $sHovered_ClassName <> "ComboLBox" Then
If
$sHovered_ClassName <> "tooltips_class32" Then ToolTip("")
Return $GUI_RUNDEFMSG
EndIf

Local
$iItemHeight = _GUICtrlComboBoxEx_GetItemHeight($CtlCombo)

Local $sRead_Combo = GUICtrlRead($CtlCombo)
Local $aPos = WinGetPos(GUICtrlGetHandle($CtlCombo))
Local $iY = (GUICtrlSendMsg($CtlCombo, $CB_GETCURSEL, 0, 0) + 1) * $iItemHeight + 3

ToolTip($sRead_Combo, $aPos[0], $aPos[1] + $iY)
EndFunc

Func
WM_COMMAND($hWnd, $nMsg, $wParam, $lParam)
Local $iIDFrom = BitAND($wParam, 0x0000FFFF)
Local $iCode = BitShift($wParam, 16)

Switch $iIDFrom
Case $CtlCombo
Switch $iCode
Case $CBN_DROPDOWN
$iComboIsOpen
= True
Case
$CBN_CLOSEUP
$iComboIsOpen
= False
ToolTip("")
EndSwitch
EndSwitch

Return $GUI_RUNDEFMSG
EndFunc

Func _WinGetHoveredClassName()
Local $iOld_Opt_MCM = Opt("MouseCoordMode", 1)
Local $aWFP = DllCall("user32.dll", "int", "WindowFromPoint", "long", MouseGetPos(0), "long", MouseGetPos(1))
Opt("MouseCoordMode", $iOld_Opt_MCM)

Local $aClassName = DLLCall("user32.dll", "int", "GetClassName", "hWnd", HWnd($aWFP[0]), "str", "", "int", 256)
If Not @error And $aClassName[0] <> 0 Then Return $aClassName[2]

Return @error
EndFunc
Автор: gal7
Дата сообщения: 14.11.2008 09:53
Большое спасибо, Maza_Faka, заодно я разобрался с использованием DllCallbackRegister(), буду знать. Буду прикручивать к своему скрипту.

Цитата:
Честно говоря, вся эта идея попахивает извратом, ну не любитель я таких трюков

Да, сложновато, но для моих целей самое то.

Добавлено:
Пока разбирался, появился еще пример Благодарю, ребята
Автор: lex83_2002
Дата сообщения: 14.11.2008 11:02
XML DOM Wrapper

Func _XMLGetField($strXPath)
    If not IsObj($objDoc) then
        _XMLError("No object passed to function _XMLGetField")
        Return SetError(1,2,-1)
    EndIf
    Local $objNodeList, $arrResponse[1], $xmlerr, $szNodePath
        $objNodeList = $objDoc.selectSingleNode ($strXPath)
        If Not IsObj($objNodeList) Then
            _XMLError("\nNo Matching Nodes found")
            $arrResponse[0] = 0
            Return SetError(2,0,-1)
        EndIf
        If $objNodeList.hasChildNodes () Then
            Local $count = $objNodeList.childNodes.length
            For $x =1 to $count
                $objChild = $objNodeList.childNodes($x)
                    _DebugWrite("ParentNode="&$objNodeList.parentNode.nodeType)
                    If $objNodeList.parentNode.nodeType =$NODE_DOCUMENT Then
                        $szNodePath="/"&$objNodeList.baseName &"/*["&$x&"]"
                    Else
                        $szNodePath = $objNodeList.baseName &"/*["&$x&"]"
                    EndIf
                    
                    $aRet = _XMLGetValue($szNodePath)
                    If IsArray($aRet) Then
                        If UBound($aRet) > 1 Then
                            _XMLArrayAdd($arrResponse, $aRet[1])
                            _DebugWrite("GetField>Text:" & $aRet[1])
                        EndIf
                    Else
                        _XMLArrayAdd($arrResponse, "")
                        _DebugWrite("GetField>Text:" & "")
                    EndIf
            Next
            $arrResponse[0] = UBound($arrResponse) - 1
            Return $arrResponse
        Else
            $arrResponse[0] = 0
            _XMLError("\nNo Child Nodes found")
            Return SetError(1,0,-1)
        EndIf
        _XMLError("Error Selecting Node(s): " & $strXPath & $xmlerr)
    Return SetError(1,0,-1)
EndFunc ;==>_XMLGetField

Кто подскажет, а как сюда саму xml-то передать ?
Автор: Tipulatoid
Дата сообщения: 14.11.2008 11:29
Mister_Che

Цитата:
Сменил на {PAUSE}, не выходит. Терминэйт работает.

Ты не только сменил клавишу. Ты еще зачем-то из моего примера убрал из функции TogglePause() цикл While, который паузу и делает.

Код: Global $Paused
HotKeySet("{ESC}", "Terminate")
HotKeySet("{PAUSE}", "TogglePause")

While 1
ConsoleWrite ("Скрипт работает" & @CRLF)
; не имеющий значения код с кликами и слипами
WEnd

Func Terminate()
Exit 0
EndFunc

Func TogglePause()
$Paused = NOT $Paused
ConsoleWrite ("Скрипт приостановлен" & @CRLF)
While $Paused
Sleep (50)
WEnd
EndFunc

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192

Предыдущая тема: Quintura Search


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.