Войти

Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 [15] 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

gregaz
18-03-2008, 08:33
Никак не могу различить один или два клика было в ListView

Функция $WM_NOTIFY ( если в ней задействованы реакции и на одинарный и на двойной клик) при двойном клике дает сигнал уже при первом клике

Как сделать чтобы при одинарном клике можно было запустить какой-то AI-скрипт на выполнение , а при двойном -на редактирование

Creat0R
18-03-2008, 09:00
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)

Не работает почему то, выдает что Неверный массив. Совпадения отсутствуют.

Creat0R
18-03-2008, 10:01
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

Angelus
18-03-2008, 11:47
NORIO,
Цитата:Как зажать спейс на несколько милисекунд?
Не думаю что можно зажать беспрерывно, но можно нажимать на него довольно интенсивно: »
А SendKeyDownDelay (Option) не подходит????

Creat0R
18-03-2008, 12:41
Angelus,
А SendKeyDownDelay (Option) не подходит?
Точно, я про это забыл :tomato2: ... наверное потому что подобными функциями не пользуюсь ;)

Maza Faka,
Я забыл что задержку между кликами можно брать с реестра :jester: .


Что-то я всё начинаю забывать...

DNK_Inc
18-03-2008, 13:00
И снова я обращаюсь за помощью :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

gregaz
18-03-2008, 16:01
Creat0R , Maza Faka , спасибо .
Давно не мог решить проблему детектирования кликов . Интересно решение с использованием реестра.

NikLok
20-03-2008, 12:23
У кого есть код получения списка расшаренных папок. То есть надоть получить имя папки, ееимя во внешний мир, кому доступна.
Ну на самый крайний случай - проверка расшарена папка или нет?!

Maza Faka
20-03-2008, 12:56
NikLok

net share

Creat0R
20-03-2008, 13:18
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

NikLok
20-03-2008, 13:48
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) чтобы просто мигало без влияния на работу программы, просто это мигание показывает, что число превысило допустимое значение?

Creat0R
21-03-2008, 16:17
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