Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.
Никак не могу различить один или два клика было в ListView
Функция $WM_NOTIFY ( если в ней задействованы реакции и на одинарный и на двойной клик) при двойном клике дает сигнал уже при первом клике
Как сделать чтобы при одинарном клике можно было запустить какой-то AI-скрипт на выполнение , а при двойном -на редактирование
gregaz, Как сделать чтобы при одинарном клике можно было запустить какой-то AI-скрипт на выполнение , а при двойном -на редактирование
Примерно так:
#include <GuiConstants.au3>
#include <GuiListView.au3>
;
Global $iDouble_Click_Event = False
Global $iOne_Click_Event = False
$GUI = GUICreate("Test Script", 300, 200)
$hListView = GUICtrlCreateListView("Column", 10, 10, 280, 170)
For $i = 1 To 10
GUICtrlCreateListViewItem("Item " & $i, $hListView)
Next
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState(@SW_SHOW, $GUI)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
If $iOne_Click_Event Or $iDouble_Click_Event Then
Local $sTempAu3File = @TempDir & "\Au3_Script_Tmp.au3"
Local $sTmpScript_Str = 'MsgBox(64, "Hi!", "Hello world!")'
Local $hFileOpen = FileOpen($sTempAu3File, 2)
FileWrite($hFileOpen, $sTmpScript_Str)
FileClose($hFileOpen)
If $iOne_Click_Event Then
$iOne_Click_Event = False
Sleep(200)
If Not $iDouble_Click_Event Then Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & $sTempAu3File & '"')
Else
$iDouble_Click_Event = False
ShellExecute($sTempAu3File, '', '', 'Edit')
EndIf
EndIf
WEnd
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView = $hListView
If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndListView
Switch $iCode
Case $NM_CLICK
$iOne_Click_Event = True
Case $NM_DBLCLK
$iDouble_Click_Event = True
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Пауза в 200 ms' определяет задержку между первым и вторым кликом.
HORRIBLE
18-03-2008, 09:52
Creat0R,
$result = StringRegExp($ReadFile, '(?i)(<TD bgcolor=A5A5A5 align=center><A HREF="/main.pl?edit=.*">Обмундирование</A></TD>)', 3)
Не работает почему то, выдает что Неверный массив. Совпадения отсутствуют.
HORRIBLE, Не работает почему то
Это зависит от строки... попробуй так:
$result = StringRegExp($ReadFile, '(?i)(?s)(<TD bgcolor=A5A5A5 align=center><A HREF="/main\.pl\?edit=.*">Обмундирование</A></TD>)', 3)
Maza Faka
18-03-2008, 10:50
Никак не могу различить один или два клика было в ListView »Пробуй:
#include <GuiConstants.au3>
#include <GuiListView.au3>
Global $DoubleClickSpeed = RegRead("HKEY_CURRENT_USER\Control Panel\Mouse", "DoubleClickSpeed")
If $DoubleClickSpeed = "" Then $DoubleClickSpeed = 500
Global $Click = False, $DoubleClick = False
$GUI = GUICreate("Test Script", 300, 200)
$hListView = GUICtrlCreateListView("Column", 10, 10, 280, 170)
For $i = 1 To 10
GUICtrlCreateListViewItem("Item " & $i, $hListView)
Next
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState(@SW_SHOW, $GUI)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
If $Click Then
$Click = False
$Timer = TimerInit()
Do
Until TimerDiff($Timer) >= $DoubleClickSpeed
If Not $DoubleClick Then
ConsoleWrite("One click" & @LF)
Else
ConsoleWrite("Double click" & @LF)
$DoubleClick = False
EndIf
EndIf
WEnd
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
Local $tNMHDR, $hWndFrom, $iIDFrom, $iCode
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $iIDFrom
Case $hListView
Switch $iCode
Case $NM_CLICK
$Click = True
Case $NM_DBLCLK
$DoubleClick = True
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
NORIO,
Цитата:Как зажать спейс на несколько милисекунд?
Не думаю что можно зажать беспрерывно, но можно нажимать на него довольно интенсивно: »
А SendKeyDownDelay (Option) не подходит????
Angelus,
А SendKeyDownDelay (Option) не подходит?
Точно, я про это забыл :tomato2: ... наверное потому что подобными функциями не пользуюсь ;)
Maza Faka,
Я забыл что задержку между кликами можно брать с реестра :jester: .
Что-то я всё начинаю забывать...
И снова я обращаюсь за помощью :help:
1. Есть сервер обновлений Windows Update, с которого происходит обновление клиентских машин. Все обновления ставятся при подготовке нового ПК.
Задача: из скрипта задать старт Windows Update, который при полной загрузке обновлений висит в трее в виде жёлтого щита и ожидает события onClick. Была, конечно, идея: сканировать трей на наличие жёлтого цвета, определять координаты найденного цвета и кликать туда. Но как это реализовать в рамках AutoIt - не знаю.
2. При автоустановке Windows ХР с интегрированными драйверами возникают ситуации, когда не на всё оборудование находятся драйвера.
Задача: составить список оборудования, которое в диспетчере задач отображается желтыми вопросами. И снова не знаю, как реализовать это скриптом.
Очень прошу, помогите найти решение. Может кто сталкивался с подобными вопросами...
Maza Faka
18-03-2008, 15:39
Задача: из скрипта задать старт Windows Update, который при полной загрузке обновлений висит в трее в виде жёлтого щита и ожидает события onClick. Была, конечно, идея: сканировать трей на наличие жёлтого цвета, определять координаты найденного цвета и кликать туда. »
Когда-то я написал такую функцию, для кликанья по значкам в трее:
#NoTrayIcon
#Include <GuiToolBar.au3>
_SysTray_ClickItem("Громкость", "left", 2)
;====================================================================================
;
;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 2
;
;Return Value(s): None
;Requirement(s): AutoIt 3.2.10.0
;
;
;Autor(s): R.Gilman (a.k.a rasim); Siao (Thanks for idea :))
;
;====================================================================================
Func _SysTray_ClickItem($iTitle, $iButton = "left", $iClick = 2)
Local $hToolbar, $iButCount, $aRect, $i
If Not $iTitle Then
MsgBox(16, "Error", "Please indicate title")
Return 0
EndIf
$hToolbar = ControlGetHandle('[Class:Shell_TrayWnd]', '', '[Class:ToolbarWindow32;Instance:1]')
If @error Then
MsgBox(16, "Error", "System tray not found")
Return 0
EndIf
$iButCount = _GUICtrlToolbar_ButtonCount($hToolbar)
If $iButCount = 0 Then
MsgBox(16, "Error", "Not found item in system tray")
Return
EndIf
For $i = 0 To $iButCount - 1
$cID = _GUICtrlToolbar_IndexToCommand($hToolBar, $i)
If StringInStr(_GUICtrlToolbar_GetButtonText($hToolBar, $i), $iTitle) Then
$aRect = _GUICtrlToolbar_GetButtonRect($hToolBar, $i)
ControlClick("[Class:Shell_TrayWnd]", "", "ToolbarWindow321", $iButton, $iClick, $aRect[0], 5)
$aRect = 0
Return 1
EndIf
Next
MsgBox(48, "Fail", "Required item not found")
EndFunc
Creat0R , Maza Faka , спасибо .
Давно не мог решить проблему детектирования кликов . Интересно решение с использованием реестра.
У кого есть код получения списка расшаренных папок. То есть надоть получить имя папки, ееимя во внешний мир, кому доступна.
Ну на самый крайний случай - проверка расшарена папка или нет?!
Maza Faka
20-03-2008, 12:56
NikLok
net share
NikLok, У кого есть код получения списка расшаренных папок
Не уверен что оно, но вот код (http://www.autoitscript.com/forum/index.php?s=&showtopic=42050&view=findpost&p=312859):
$strComputer = "." ;Your IP here
$objWMIService = ObjGet("winmgmts:" & "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
$colShares = $objWMIService.ExecQuery("Select * from Win32_Share")
For $objShare In $colShares
consolewrite ("Allow Maximum: " & $objShare.AllowMaximum & @CR)
consolewrite ("Caption: " & $objShare.Caption & @CR)
consolewrite ("Maximum Allowed: " & $objShare.MaximumAllowed & @CR)
consolewrite ("Name: " & $objShare.Name & @CR)
consolewrite ("Path: " & $objShare.Path & @CR)
consolewrite ("Type: " & $objShare.Type & @CR)
consolewrite ("---------------------------------" & @CR)
Next
Maza Faka, net share »
Предлагаешь перехватывать вывод и анализировать? ТОже дело конечно!
HORRIBLE
21-03-2008, 13:18
Как можно заставить мигать текст раз в несколько секунд?
Maza Faka
21-03-2008, 14:19
HORRIBLE
Если я правильно тебя понял...Простейший способ:
#include <GuiConstants.au3>
$hGui = GUICreate("Test GUI", 200, 100)
$label = GUICtrlCreateLabel("Some text", 70, 35, 50, 16)
GUISetState()
AdlibEnable("_TextFlicker", 800)
While 1
$msg = GUIGetMsg()
Switch $msg
Case -3
ExitLoop
EndSwitch
WEnd
Func _TextFlicker()
GUICtrlSetColor($label, 0xFF0000)
Sleep(200)
GUICtrlSetColor($label, 0x000000)
EndFunc
HORRIBLE
21-03-2008, 15:43
Maza Faka, Спасибо за этот пример.
Но вот проблема. А если этот пример воткнуть в прогу с другим кодом который должен выполняться непрерывно,то когда пример работает другая часть проги приостанавливает свою работу. Можно сделать (без AdlibEnable("_TextFlicker", 800) и sleep) чтобы просто мигало без влияния на работу программы, просто это мигание показывает, что число превысило допустимое значение?
HORRIBLE,
Можно сделать (без AdlibEnable("_TextFlicker", 800) и sleep) чтобы просто мигало без влияния на работу программы
Используй самопальные Adlib* с CallBack'ами...
#include <GuiConstants.au3>
$iMark = 1
$hGui = GUICreate("Test GUI", 200, 100)
$label = GUICtrlCreateLabel("Some text", 70, 35, 50, 16)
GUISetState()
_AdlibEnable("_TextFlicker", 800, $hGui)
While 1
$msg = GUIGetMsg()
Switch $msg
Case -3
_AdlibDisable($hGui)
ExitLoop
EndSwitch
WEnd
Func _TextFlicker($hWndGUI, $MsgID, $WParam, $LParam)
If $iMark = 1 Then
GUICtrlSetColor($label, 0xFF0000)
$iMark = 0
Else
GUICtrlSetColor($label, 0x000000)
$iMark = 1
EndIf
EndFunc
Func _AdlibEnable($sFunction, $iTime=250, $hWnd=0)
Local Const $WM_TIMER = 0x0113
If Not IsHWnd($hWnd) Then $hWnd = GUICreate("hCallBack_AdlibEnable")
GUIRegisterMsg($WM_TIMER, $sFunction)
Local $aRet = DllCall("User32.dll", "int", "SetTimer", "hwnd", $hWnd, "int", $hWnd, "int", $iTime, "int", 0)
Return $hWnd
EndFunc
Func _AdlibDisable($hWnd=0)
Local Const $WM_TIMER = 0x0113
GUIRegisterMsg($WM_TIMER, "")
Local $aRet = DllCall("user32.dll", "int", "KillTimer", "hwnd", $hWnd, "int", $hWnd)
Return Number(IsArray($aRet) And $aRet[0])
EndFunc
DENoszone
21-03-2008, 22:49
Вопрос: возможно запускать скрипт с сервера?
Ну что бы я задавал программе время а она через это время начинала работать? при выключеном компе?
Maza Faka
22-03-2008, 07:30
при выключеном компе »
И как ты себе это представляешь?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.