Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.
amel27, Имхо идентификации окна по одному заголовку маловато, надо проверять на его принадлежность текущему процессу
Согласен. Но во время построения примера я был озабочен другими проблемами :)
Типа такого
Хм.. не совсем понял как это использовать из функции, ведь hWnd нам не известен, если бы он был известен, то можно было бы просто использовать его вместо заголовка ;)
Вот пример с функцией, возвращает идентификатор окна (Handle) основываясь на идентификаторе процесса (PID), тексте, и классе окна:
$iPID = Run("Notepad.exe")
ProcessWait($iPID)
Sleep(500)
Send("^s")
Sleep(1000)
$Handle = _WinGetHandleEx($iPID, "#32770", "", "FolderView")
MsgBox(64, "Title:", WinGetTitle($Handle))
Func _WinGetHandleEx($iPID, $sClassNN="", $sPartTitle="", $sText="", $iVisibleOnly=1)
If IsString($iPID) Then $iPID = ProcessExists($iPID)
Local $aWList = WinList("[CLASS:" & $sClassNN & ";REGEXPTITLE:(?i).*" & $sPartTitle & ".*]", $sText)
If @error Then Return SetError(1, 0, "")
For $i = 1 To $aWList[0][0]
If WinGetProcess($aWList[$i][1]) = $iPID And (Not $iVisibleOnly Or _
($iVisibleOnly And BitAND(WinGetState($aWList[$i][1]), 2))) Then Return $aWList[$i][1]
Next
Return SetError(2, 0, "")
EndFunc
P.S
А по поводу моей проблемы с мышкой, есть идеи что можно придумать? :clever-ma
пока запущена определённая функция (в цикле), нажатие мышки (левую кнопку) нужно отключить, но чтобы можно было отследить, нажал ли юзер на эту кнопку »собственно, аналогично клавиатуре ;)Global Const $WH_MOUSE_LL = 14
Global $hKeyProc = DllCallbackRegister ("_KeyProc", "int", "int;ptr;ptr")
Global $hmod = DllCall("kernel32.dll","hwnd","GetModuleHandle","ptr",0)
MsgBox(4096, "", 'После нажатия "Ok" левая кнопка мыши будет заблокирована на 10 сек.')
Global $hHook = DllCall("user32.dll","hwnd","SetWindowsHookEx","int", $WH_MOUSE_LL, _
"ptr", DllCallbackGetPtr($hKeyProc), "hwnd", $hmod[0], "dword", 0)
Sleep(10000)
MsgBox(4096, "", 'Для разблокирования мышки нажмите "Ок"! ;)')
Exit
Func _KeyProc($nCode, $wParam, $lParam)
If $nCode < 0 Or ($wParam<>0x201 And $wParam<>0x202) Then
$ret = DllCall("user32.dll","long","CallNextHookEx","hwnd", $hHook[0], _
"int", $nCode, "ptr", $wParam, "ptr", $lParam)
Return $ret[0]
EndIf
Return 1
EndFunc
Func OnAutoItExit()
DllCall("user32.dll","int","UnhookWindowsHookEx","hwnd",$hHook[0])
DllCallbackFree($hKeyProc)
EndFunc
А по поводу моей проблемы с мышкой, есть идеи что можно придумать? »тестил... :)
как это использовать из функции, ведь hWnd нам не известен »ну, видимо перебрать все окна с одинаковыми титлами и найти своё... :unsure:
amel27,
аналогично клавиатуре
Абалдеть!!! другого слова просто не позволяю себе сказать (написать)! http://files.myopera.com/Creat0R/Opera_AC/Icons/thumbs-up_cool.gif
Вот пример, подобный обработке сообщении для элементов GUI (ListView в частности):
Global Const $WH_MOUSE_LL = 14
Global $hKeyProc = DllCallbackRegister ("_Mouse_Handler", "int", "int;ptr;ptr")
Global $hmod = DllCall("kernel32.dll", "hwnd", "GetModuleHandle", "ptr", 0)
MsgBox(4096, "", 'После нажатия "Ok" левая кнопка мыши будет заблокирована на 10 сек.')
Global $hHook = DllCall("user32.dll", "hwnd", "SetWindowsHookEx", "int", $WH_MOUSE_LL, _
"ptr", DllCallbackGetPtr($hKeyProc), "hwnd", $hmod[0], "dword", 0)
Sleep(10000)
DllCall("user32.dll", "int", "UnhookWindowsHookEx", "hwnd", $hHook[0])
DllCallbackFree($hKeyProc)
Func _Mouse_Handler($nCode, $wParam, $lParam)
Switch BitAND($WParam, 0xFFFF)
Case 512 ;Mouse Move
PrintF("Mouse Moving")
Case 513 ;Primary Down
PrintF("Primary Down [Blocked]")
Return 1 ;Block default processing
Case 514 ;Primary Up
PrintF("Primary Up")
Case 516 ;Secondary Down
PrintF("Secondary Down")
Case 517 ;Secondary Up
PrintF("Secondary Up")
Case 519 ;Midle Down
PrintF("Midle Down")
Case 520 ;Midle Up
PrintF("Midle Up")
Case 522 ;Mouse Whell
PrintF("Mouse Whell")
Case Else
PrintF("Event: " & BitAND($WParam, 0xFFFF))
Return 0 ;Allow default processing
EndSwitch
EndFunc
Func PrintF($sString, $iMode=0, $iLine=@ScriptLineNumber)
If $iMode = 0 Then
ConsoleWrite("+======================================================" & @LF & _
"--> Script Line (" & $iLine & "):" & @LF & "!" & @TAB & $sString & @LF & _
"+======================================================" & @LF)
Else
MsgBox(64, "Debug", "> Script Line (" & $iLine & "):" & @LF & @LF & "Debug:" & @LF & $sString)
EndIf
EndFunc
Теперь я наконец могу завершить свой проэкт. Спасибо!
HORRIBLE
12-02-2008, 13:46
Как реализовать при наведении мышки на картинку, курсор меняет вид, как уловить вот это момент поменял ли он вид или нет???
Для пирмера, на этом форуме если мышку довести до списка страниц то она вместо стрелочки окажется рукой.
HORRIBLE,
GUICtrlSetCursor ( -1, 0 )
"-1" - означает предыдущую команду
"0" - означает вид курсора
или тебе нужно именно момент выловить???
HORRIBLE
12-02-2008, 14:19
Angelus, именно, что уловить.
Я знаю только, что моя картинка находиться на постоянной высоте, а по горизонтале ее положение может меняться. Вожу мышкой на заданной высоте по горизонтали, бац при попадании на картинку поменялся курсор, мне надо нажать на эту картинку, если так и не нашел вожу дальше.... и .тд. высоту при этом не меняю.
Maza Faka
12-02-2008, 16:24
HORRIBLE
Ммм...может проще определить координаты элемента, например функцией ControlGetPos()?
HORRIBLE,
как уловить вот это момент поменял ли он вид или нет???
Эта картинка часть AutoIt'овского GUI? или внешняя картинка?
Если AutoIt'овская, то наверное проще проверять положение мышки над картинкой, а если внешняя, то нужно циклом проверять MouseGetCursor:
HotKeySet("{ESC}", "Quit")
$Last_Cursor = MouseGetCursor()
While 1
Sleep(100)
$Current_Cursor = MouseGetCursor()
If $Last_Cursor <> $Current_Cursor Then
MsgBox(64, "Внимание!", _
StringFormat("Смена курсора:\n\nПредыдущий <%s>, Текущий <%s>", _
_GetCursorStringValue($Last_Cursor), _GetCursorStringValue($Current_Cursor)), 2)
$Last_Cursor = $Current_Cursor
EndIf
WEnd
Func _GetCursorStringValue($iValue)
Local $aStr_Values[16] = ["Pointing/Grabbing hand", "APPSTARTING", "ARROW (Default?)", "CROSS", "HELP", "IBEAM (Selection)", _
"ICON", "NO", "SIZE", "SIZEALL", "SIZENESW", "SIZENS", "SIZENWSE", "SIZEWE", "UPARROW", "WAIT"]
If $iValue < UBound($aStr_Values) And $iValue >= 0 Then Return $aStr_Values[$iValue]
Return $iValue
EndFunc
Func Quit()
Exit
EndFunc
В случае с курсором руки (наведение над ссылкой), будет выведено «Текущий: Pointing/Grabbing hand».
Нужно напечатать файл-изображение, но при печати должен быть выведен диалог Мастера печати:
http://ipicture.ru/uploads/080213/thumbs/huK0z37PPQ.png (http://ipicture.ru/Gallery/Viewfull/552625.html)
_FilePrint/ShellExecute (одно и тоже) не подходят, они вызывают программу просмотра изображении и всё, печать не происходит (возможно потому что принтер у меня не установлен? :) ). Но если нажать кнопку «Печать» в этой самой программе просмотра, то выводится диалог мастера печати. Вот он мне и нужен, только без программы просмотра.
Чувствую есть спец. команда для Dll'ки принтера, но какая, этого мне не удалось узнать. Есть список комманд RunDll32 (http://creator-lab.ucoz.ru/RunDll32.htm), но там вроде нет ничего подходящего.
Maza Faka
13-02-2008, 11:03
Creat0R
Это (http://www.dx21.com/SCRIPTING/RUNDLL32/VIEWITEM.ASP?OID=200&CMD=P-A) пробовал?
Maza Faka,
Это пробовал?
Спасибо за ссылку, я никак не мог найти этот ресурс (знал о нём давно) :).
Но проблема в том что ручной вызов не срабатывает так как ожидалось. Эта-же команда используется в реестре, но там выводится диалог мастера (если к примеру на файле изображения, вызвать пункт «Печать»), а ручной вызов отображает диалог сохранения файла *.xps (при сохранении начинается печать), и то, это только если указать имя принтера, которое скрипт естественно, не знает.
Люди добрые помогите решить проблему. GUI элемент Edit поддерживает максимум 30 000 символов, это лажа =(( даже ничего поделать не могу... Можно ли как то увеличить это допустимое значение?
Timurko, GUI элемент Edit поддерживает максимум 30 000
На основе чего это (неверное :) ) утверждение?
Вот пример, доказывает что Edit поле может содержать больше чем 30000 символов (пару минут правда подождать нужно, прежде чем поле заполнится ;)):
#include <GuiConstants.au3>
$GUI = GUICreate("Test Script", 300, 200)
$Edit = GUICtrlCreateEdit("", 20, 40, 260, 140)
GUISetState(@SW_SHOW, $GUI)
For $i = 1 To 31000
GUICtrlSetData($Edit, GUICtrlRead($Edit) & "a")
Sleep(1)
Next
GUICtrlSetData($Edit, GUICtrlRead($Edit) & "b")
ConsoleWrite(StringLen(GUICtrlRead($Edit)))
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
По завершению, последние символы:
...aaaaaab
А длина 31000.
zero_1632
14-02-2008, 15:54
подскажите, как отслеживать консольные программы, написанные на c++ (предположительно). Выводятся параметры, надо следить за тем, повесилась программа или нет, если параметры в окне меняются - отлично. Нет - закрывам процесс. Проблема в том, что ничего, по мнению autoit (autoit info tool) не выводит. Можно как-то победить?
Посоветовали через StdOutRead, но при этом процесс должен быть запущен чтобы получить process_id.
Пробовал делать даже так,хотя это крайне нежелательно. В итоге - не смог даже запустить эту консольную программу - то есть она работает, но в окно ничего не выводит, и приведенный пример для функции StdOutRead в самом autout ничего не выводит. Даже простая dir *.* выводит только по завершению процесса(по ощущуениям) , а мне нужно чтобы эта консольная программа "крутилась".
Ворос - можно как-то получить process_id, не запуская программу из autoit?
Как потом запускать прогу через run, но так, чтобы было нормальное окно и в нем что-то отображалось? Если делать через start _приложение_ то наверное process_id изменится?
В итоге - не смог даже запустить эту консольную программу - то есть она работает, но в окно ничего не выводит
Нужно использовать @SW_SHOW как третьий параметр.
можно как-то получить process_id, не запуская программу из autoit?
Можно, ProcessExists("ProcName.exe") вернёт PID процесса.
Но проблема тут в другом, выводит ли эта программа данные в поток (Stream), который потом можно перехватывать через StdOutRead...
Как потом запускать прогу через run, но так, чтобы было нормальное окно и в нем что-то отображалось?
$iPID = Run("Proga.exe", "", @SW_SHOW, 2 + 4)
zero_1632
14-02-2008, 22:13
Но проблема тут в другом, выводит ли эта программа данные в поток (Stream), который потом можно перехватывать через StdOutRead... »
Блин никак.
$iPID = ProcessExists("program.exe")
MsgBox (4096,$iPID,StdoutRead ($iPID)) - ничего не выводит. Можно ли делать с помощью autoit скриншоты окна или его любой части?
вообще народ рекомендовал pid искать через вызов user32.dll, неужели все так просто?
Maza Faka
15-02-2008, 07:34
zero_1632
$iPID = ProcessExists("program.exe")
MsgBox (4096,$iPID,StdoutRead ($iPID)) - ничего не выводит
Выводит, посмотри на заголовок окна MsgBox(). А вот, что бы читать данные через StdoutRead(), нужно запустить программу с помощью функции Run().
прошу прощение за свой банальнейший вопрос - возможно он уже поднимался на форуме, но я не смог найти по нему ничего.
Есть две программы
Program1 и Program2
у меня в скрипте сначала запускается
Program1 а потом после ее окончания Program2
вся проблема в том что Program1 работает в фоновом режиме
можно ли приостановить запуск Program2 на какое то время или как то отследить окончание Program1?
или может есть какой то таймер? что бы отсрочить запуск второго приложения скажем минуты на 2?
SvetlanaK
15-02-2008, 09:47
Здравствуйте! кто-нибудь пользовался SQLite ? что он дает? просто создание базы данных и работа с ней из автоита? а можно ли вытянуть данные из существующей базы, например из аксесс-а? поделитесь опытом пожалуйста, кто пользовался. Может у кого ссылки есть на статьи и литературу по использованию SQLite библиотеки. В любом случае буду благодарна всем откликнувшимся.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.