Показать полную графическую версию : [архив - Часть 2] AutoIt скрипты
Davlet,
Не получилось, таже ситуации.
А если так:
Opt("WinTitleMatchMode", 2)
BlockInput(1)
Run("notepad")
WinWaitActive("- Notepad")
Send("Test")
BlockInput(0)
amel27,
Ты приводил функцию (http://forum.oszone.net/thread-60616-162.html#post661341) для получения контроля по идентификатору, я вот пытаюсь сделать нечто похожее, но для Handle от контроля GUI (аутоита)... типа такого:
Func _HwndToID($hwnd)
Local $iRet = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $hwnd)
Return $iRet[0]
EndFunc
По сути это нужно для того, чтобы можно было на _GuiCtrlTreeViewInsertItem повесить событие - т.е там возвращается handle на вставлены пункт, а мне нужен Id, вот и пытаюсь конвертировать, но почему то всегда эта функци возвращает 0 :(
там возвращается handle на вставлены пункт, а мне нужен Id »дык "вставленый пункт" не является контролом, поэтому и полученный хэндл не является хэндлом окна... посмотри хоть через "Window Info"... это какая-то внутренняя нумерация которую ведет для себя сам контрол... кстати, посмотри текст функции _GUICtrlTreeViewInsertItem() - она по сути лишь враппер для сообщения $TVM_INSERTITEM, отправляемого контролу SysTreeView32.
чтобы можно было на _GuiCtrlTreeViewInsertItem повесить событие »смысл?.. ведь вставка элемента является синхронным событием (в отличие скажем от нажатия на кнопку) и скрипт всегда знает когда оно случилось... т.е. вставку можно произвести только через вызов определенной функции
amel27,
смысл?
Как смысл :unsure: , мне нужно отслеживать нажатия на определённый элемент TreeView, и соответствено делать что-то (к примеру получить текст выбранного контроля, но не только).
Я это сделал через CallBack, т.е просто тупо вызывается определённая функция каждые 100 мс., она и проверяет текст выбранного элемента (через _GuiCtrlTreeViewGetTree()), но хотелось обойтись без CallBack или другой постоянной проверкой (пусть то в цикле или в зарегистрированном сообщении через GuiRegisterMsg()) - просто есть и другие задачи для главного цикла, и не хочется нагружать его слишком много и/или вызывать несколько подобных циклов.
P.S
Я про событие как через GuiCtrlSetOnEvent(), не событие самой вставки :)
Maza Faka
27-10-2007, 10:36
Creat0R
Видно не получится при помощи API вернуть ID TreeViewItem.
Наверное потому, что даже утилита AutoIt Window Info не показывает класс и instance TreeViewItem, а вот например с контроль Button идентификатор возвращается:
#include <GUIConstants.au3>
#include <GuiTreeView.au3>
Opt("GuiOnEventMode", 1)
$gui = GUICreate("Test", 300, 200)
GUISetOnEvent(-3, "OnExit")
$treeView = GUICtrlCreateTreeView(20, 10, 200, 150, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_CHECKBOXES), $WS_EX_CLIENTEDGE)
$all = GUICtrlCreateTreeViewItem("All", $treeView)
GUICtrlCreateTreeViewItem("One", $all)
$button = GUICtrlCreateButton("Insert", 240, 10, 50, 25)
GUICtrlSetOnEvent(-1, "HwndToID")
GUISetState()
While 1
Sleep(200)
WEnd
Func OnExit()
Exit
EndFunc
Func HwndToID()
$insert = _GUICtrlTreeViewInsertItem($treeView, "Inserted")
$handle = GUICtrlGetHandle($button)
MsgBox(0, "Handle", $handle)
$iRet = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $handle)
MsgBox(0, "ID", $iRet[0])
EndFunc
Вот что я имел в виду:
#include <GUIConstants.au3>
#include <GuiTreeView.au3>
Opt("GuiOnEventMode", 1)
$Gui = GUICreate("Test", 300, 200)
GUISetOnEvent(-3, "OnExit")
$TreeView = GUICtrlCreateTreeView(20, 20)
$hItem = _GUICtrlTreeViewInsertItem($TreeView, "Inserted")
$TV_ID = HwndToID($hItem)
; Закомментируем две предыдущие строчки, а ту то чуть ниже раскомментируем, и получем то что нужно при нажатии на пункт
; (но с ограничением в количестве создаваемых элементов)
;$TV_ID = GUICtrlCreateTreeViewItem("Inserted", $TreeView)
GUICtrlSetOnEvent($TV_ID, "TV_Event")
GUISetState()
While 1
Sleep(100)
WEnd
Func TV_Event()
ConsoleWrite("Ok, we have clicked tv item")
EndFunc
Func OnExit()
Exit
EndFunc
Func HwndToID($hID)
$iRet = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $hID)
Return $iRet[0]
EndFunc
Вот что я имел в виду »
все равно не понимаю - что мешает вставить в TV_Event() тот же _GUICtrlTreeViewGetTree(), определяющий какую ветку кликнули, а затем Switch вызывающий действие в зависимости от типа ветки?... и никаких циклов
amel27,
что мешает вставить в TV_Event() тот же _GUICtrlTreeViewGetTree(), определяющий какую ветку кликнули
А как будет распознаваться что был кликнут пункт в TreeView? (без постоянной проверки)
Creat0R
распознается клик на TreeView, а сам пункт "вычисляем" в функции-обработчике... ведь клик на TreeView это всегда клик на каком-то элементе?
ведь клик на TreeView это всегда клик на каком-то элементе?
Во-первых не всегда, можно ведь кликнуть в пустом месте ;)
Но не в этом дело, ведь если поставить событие для TreeView, то оно не срабатывает как таковое:
#include <GUIConstants.au3>
#include <GuiTreeView.au3>
Opt("GuiOnEventMode", 1)
$Gui = GUICreate("Test", 300, 200)
GUISetOnEvent(-3, "OnExit")
$TreeView = GUICtrlCreateTreeView(20, 20)
GUICtrlSetOnEvent($TreeView, "TV_Event")
$hItem = _GUICtrlTreeViewInsertItem($TreeView, "Inserted")
GUISetState()
While 1
Sleep(100)
WEnd
Func TV_Event()
ConsoleWrite("Ok, we have clicked tv item")
EndFunc
Func OnExit()
Exit
EndFunc
Или что-то другое имеется в виду? покажи плиз на примере.
Creat0R
Или что-то другое имеется в виду? покажи плиз на примере »
ура, дошло! :) ...извиняюсь, невнимательно читал твой код :blush:
провел вот такой эксперимент:#include <GUIConstants.au3>
#include <GuiTreeView.au3>
Opt("GuiOnEventMode", 1)
$Gui = GUICreate("Test", 300, 200)
GUISetOnEvent(-3, "OnExit")
$TreeView = GUICtrlCreateTreeView(20, 20)
$hTreeView= IDToHwnd($Gui, $TreeView) ; хэндл $TreeView
$TV_ID1 = GUICtrlCreateTreeViewItem("Created1", $TreeView)
$hItem = _GUICtrlTreeViewInsertItem($TreeView, "Inserted1")
$TV_ID2 = GUICtrlCreateTreeViewItem("Created2", $TreeView)
GUISetOnEvent(-3, "OnExit")
GUISetState()
; отсюда видно что элемент, вставленный через _GUICtrlTreeViewInsertItem()
; не получает своего ControlID (нумерация ID сквозная)
ConsoleWrite($TreeView&@CRLF) ; ControlID $TreeView
ConsoleWrite($TV_ID1 &@CRLF) ; ControlID $TV_ID1
; тут должен был быть ControlID $hItem
ConsoleWrite($TV_ID2 &@CRLF) ; ControlID $TV_ID2
; это просто хэндл $TreeView
ConsoleWrite(@CRLF)
ConsoleWrite('0x'&Hex($hTreeView)&@CRLF)
; видно, что Hwnd элементов TreeView не являетя Hwnd окна:
ConsoleWrite(@CRLF)
ConsoleWrite('0x'&Hex(IDToHwnd($Gui, 4))&@CRLF)
ConsoleWrite('0x'&Hex(IDToHwnd($Gui, 5))&@CRLF)
; или даже так, один фиг:
ConsoleWrite(@CRLF)
ConsoleWrite('0x'&Hex(IDToHwnd($hTreeView, 4))&@CRLF)
ConsoleWrite('0x'&Hex(IDToHwnd($hTreeView, 5))&@CRLF)
While 1
Sleep(100)
WEnd
Func HwndToID($hWnd)
Local $iRet = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $hWnd)
Return $iRet[0]
EndFunc
Func IDToHwnd($hWndMain, $CtrlID)
Local $iRet = DllCall("user32.dll", "int", "GetDlgItem", "hwnd", $hWndMain, "int", $CtrlID)
Return $iRet[0]
EndFunc
Func OnExit()
Exit
EndFunc
ведь если поставить событие для TreeView, то оно не срабатывает как таковое »Хм... вот это странно, ведь ControlID у него есть... можно было и сделать для случая клика на любом пункте TreeView
но с ограничением в количестве создаваемых элементов »откуда инфа и чем ограничено количество?...
может ограничение как раз и связано с присвоением пунктам ControlID?
так глядишь и сам начну понимать кой-чего в ГУИ :)
amel27,
ура, дошло!
:)
Хм... вот это странно, ведь ControlID у него есть... можно было и сделать для случая клика на любом пункте TreeView
С ListView подобна структура срабатывает, видимо потому что у него есть заголовок.
откуда инфа и чем ограничено количество?
Инфа из справки (http://www.autoitscript.com/autoit3/docs/faq.htm#15) как ни странно :)
Maximum number of GUI controls per window: 4096
Но как говорится, «Доверяй но проверяй», вот я и проверяю:
#include <GUIConstants.au3>
Opt("GuiOnEventMode", 1)
$Gui = GUICreate("Test", 300, 200)
GUISetOnEvent(-3, "OnExit")
$TreeView = GUICtrlCreateTreeView(20, 20)
GUISetState()
For $i = 1 To 4100
$Item = GUICtrlCreateTreeViewItem("Item " & $i, $TreeView)
If $Item Then
PrintF("Created Item: " & $i)
Else
PrintF("Oops, we have reached the limit on Item: " & $i-1)
ExitLoop
EndIf
Next
While 1
Sleep(100)
WEnd
Func PrintF($Str, $Line=@ScriptLineNumber)
ConsoleWrite(@LF & "+======================================================" & @LF & _
"--> Script Line (" & $Line & "):" & @LF & "!" & @TAB & $Str & @LF & _
"+======================================================")
EndFunc
Func OnExit()
Exit
EndFunc
Создание останавливается на 4095 потому что создание самого TreeView это уже первый контрол.
TERMINAL
29-10-2007, 11:15
какая команда делает печать?
Creat0R
может через GUIRegisterMsg() типа такого?
#include <GUIConstants.au3>
#include <A3LConstants.au3>
#include <GuiTreeView.au3>
Opt("GuiOnEventMode", 1)
$Gui = GUICreate("Test", 300, 200)
GUISetOnEvent(-3, "OnExit")
$nTreeView = GUICtrlCreateTreeView(20, 20)
$hTreeView = IDToHwnd($Gui, $nTreeView)
$nTV1_ID = _GUICtrlTreeViewInsertItem($nTreeView,"Inserted1")
$nTV2_ID = _GUICtrlTreeViewInsertItem($nTreeView,"Inserted2")
GUIRegisterMsg ($WM_NOTIFY, "TV_Event")
GUISetState()
While 1
Sleep(100)
WEnd
Func TV_Event($hWnd, $Msg, $wParam, $lParam)
If $Msg = $WM_NOTIFY Then
Local $NMHDR = DllStructCreate("hwnd;uint;short", $lParam)
If DllStructGetData($NMHDR, 1)=$hTreeView And DllStructGetData($NMHDR,3)=-451 Then
ConsoleWrite(_GUICtrlTreeViewGetTree($nTreeView,'\')&@CRLF)
EndIf
EndIf
Return $GUI_RUNDEFMSG
EndFunc
Func OnExit()
Exit
EndFunc
Func HwndToID($hControlID)
$iRet = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $hControlID)
Return $iRet[0]
EndFunc
Func IDToHwnd($hWnd, $CtrlID)
$iRet = DllCall("user32.dll", "int", "GetDlgItem", "hwnd", $hWnd, "int", $CtrlID)
Return $iRet[0]
EndFunc
З.Ы. я уже сталкивался ранее с контролами без ControlID при установке специфического софта... вот я с ними тогда помучился... :aggressiv собсно из-за них и пришлось лезть в дебри
mikola1983
29-10-2007, 15:53
как передать строку?
вобщем есть вот это:
$file = FileOpen("c:\1.txt", 0)
$line = FileReadLine($file)
If @error = -1 Then ExitLoop
Run ("notepad.exe")
WinWait("Untitled - Notepad","")
If Not WinActive("Untitled - Notepad","") Then WinActivate("Untitled - Notepad","")
WinWaitActive("Untitled - Notepad","")
Send(GUICtrlRead($line))
но в нотпаде пишет НОЛЬ вместо определенного ключа . есть ли возможность вставить этот ключ в окно программы желательно посимвольно через SEND т.к. 4 окна.
и еше хотелось бы удалять использованный ключ
Maza Faka
29-10-2007, 16:57
mikola1983
Send(GUICtrlRead($line))
Это что? :o
Как я понял ты хочешь выслать строку в блокнот?
Сделай так:
ControlSend("Untitled - Notepad", "", "Edit1", $line)
TERMINAL,
какая команда делает печать?
Конкретной такой команды нет, но для печати документа с файла можно использовать ShellExecute()....
ShellExecute("MyFile.txt", "", @ScriptDir, "Print")
amel27, может через GUIRegisterMsg() типа такого?
О, оно работает получше чем все мои попытки (я пробовал через другие сообщения, например улавливал нажатия мышки, но не всегда срабатывало).
Спасибо!
P.S
Функция IDToHwnd() не обязательна в этом случае, можно просто использовать GUICtrlGetHandle($nTreeView) :)
Creat0R
Конкретной такой команды нетКак же нет?.. по справке как минимум две: _FilePrint() и _WordDocPrint() ;)
первая по сути тот же ShellExecute(), а вторая специально для печати документов MS Word, пример:#include <Word.au3>
$sDocPath = @ScriptDir & "\Test.doc" ; путь к документу Word
$oWordApp = _WordCreate ("") ; создаем объект MS Word
$oDoc = _WordDocOpen ($oWordApp, $sDocPath) ; открываем существующий файл
_WordDocPrint ($oDoc) ; печатаем документ
_WordQuit ($oWordApp, 0) ; закрываем окно и освобождаем объектнеобязательные параметры:
$b_Background - ожидать или нет завершения печати;
$i_Copies - количество экземпляров;
$i_Orientation - ориентация страницы (книга/альбом);
$b_Collate - разобрать по копиям;
$s_Printer - выбор принтера (имя);
$i_Range - выбор страниц для печати;
$i_From - с какой страницы (для $i_Range=3);
$i_To - по какую страницу печатать (для $i_Range=3);
$s_Pages - список страниц через запятую (для $i_Range=4);
$i_PageType - все/четные/нечетные;
$i_Item - печать дополнительных элементов.
оно работает
угу, только я не совсем понял насчет сообщения $TVN_SELCHANGED - в "A3LTreeView.au3" определен $TVN_SELCHANGEDA = $TVN_FIRST-2 (-402), а по факту приходит $TVN_SELCHANGEDW = $TVN_FIRST-51 (-451)
amel27,
по справке как минимум две: _FilePrint() и _WordDocPrint()
Я про UDF'ы забыл, прошёлся поиском по обычной справке, а там только ShellExecute всплыл как вариант.
Добрый вечер.
Вот есть 2 вопроса:
1 Как сделать чтобы можно было скомпилированому файлу автоита передавать даные через ключи, например так: script.exe /f "list.txt" или так script.exe /h /d /s ?
2 Как сделать так чтобы результат выполнения например функции ProcessList(выводит массив со списком процесов) выдавался в командную строку windows?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.