[архив - Часть 2] AutoIt скрипты

Ответить
 • Просмотры: 27
Аватара пользователя
amel27

Re: [архив - Часть 2] AutoIt скрипты

Сообщение amel27 »

amel27,


Цитата:



если пусто, значит берется дефолтовый из HKLM\SOFTWARE\Classes\CLSID



У меня там кроме Мой компьютер везде пусто...



А по второму адресу - к примеру тут HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E} должно быть имя корзины, там так и написано Корзина (в “по умолчанию”), но у меня корзина именуется как Mycop Изображение - Вот тут то и проблема, список содержит именно Mycop (это латинские буквы кстати), в реестре я не нашёл это значение Изображение
Аватара пользователя
Creat0R

Re: [архив - Часть 2] AutoIt скрипты

Сообщение Creat0R »

amel27,
Цитата:



Вот тестовый вариант для определения длины текста текущего контрола, попробуй для своего:



Попробовал, всегда возвращает 0 Изображение (текст ест-но набран).




Цитата:



нужен вест текст



Ctrl Shift Home Изображение




Цитата:



нет гарантий, что разные окна будут обрабатывать клавиши одинаково



Ну хотябы для тех которые обрабатывают стандартные клавиши (виндовские).




Цитата:



Вот что получилось



Класно получилось, спасибо, попробую это использовать в моё скрипте...

Я кстати ещё хотел бы сделать небольшой GUI-интерфейс для этого скрипта, чтобы “на лету” можно было править соотношения символов (т.е сопостовлять к одной клавише другую, у меня иногда не очень удобно получается, нужно руками править некоторые символы). Это поможет использовать не только Rus Eng Изображение
Аватара пользователя
amel27

Re: [архив - Часть 2] AutoIt скрипты

Сообщение amel27 »

Creat0R


Цитата:



Попробовал, всегда возвращает 0



HWND возвращается корректно, хотя стандартные сообщения действительно не воспринимает... причем все тулзы класса WinInfo вообще не распознают текст окна... на всякий случай может кому пригодится - функция для возврата HWND окна/контрола текущего ввода:

Код:

Код: Выделить всё

Func _ControlGetFocus()
    Local $res, $u = DllStructCreate("int;int;hwnd;hwnd;hwnd;hwnd;hwnd;hwnd;long;long;long;long")
    DllStructSetData ($u, 1, DllStructGetSize($u))
    $res = DllCall('user32.dll', 'hwnd', 'GetForegroundWindow')
    $res = DllCall('user32.dll', 'int', 'GetWindowThreadProcessId', 'hwnd', $res[0], 'ptr', 0)
    DllCall('user32.dll', 'int', 'GetGUIThreadInfo', 'int', $res[0], 'ptr', DllStructGetPtr($u))
    Return DllStructGetData($u, 4)
EndFunc


Цитата:



Ctrl Shift Home



нет, при этом потеряется текущая позиция курсора... для полного обсчета требуется: полный текст, выделенный текст, текущая позиция курсора - положение выделенного фрагмента по отношению ко всему тексту... т.е. одними клавишами тут ИМХО не обойтись - нужны альтернативные способы получения инфы... но тогда потеряется универсальность (твой пример с OperaWindowClass).
Аватара пользователя
Creat0R

Re: [архив - Часть 2] AutoIt скрипты

Сообщение Creat0R »

amel27,
Цитата:



стандартные сообщения действительно не воспринимает



Может есть другие методы получения текста? вот интересно, как Punto Switcher распознаёт текст в любом месте?




Цитата:



тогда потеряется универсальность



Ну хотябы для стандартнных полей, не страшно если в строке адреса выделяться не будет, в крайнем случае там можно будет использовать текущий метод (Send(+{Left " & StringLen($ClipText) & "}")).



Но вообще то, вот как я имел в виду:



Откроем Notepad, и впишем туда это:




Цитата:



this is a test() and ; only test ;



Теперь поставим курсор в конец этого текста, зажмём Ctrl + Shift, и поодиночно будем нажимать клавишу влево - нам понадобится нажать 10 раз клавишу влево чтобы весь наш (нужный) текст был выделен.



Вот я и подумал, если мы заранее знаем наш текст (который изначально был выделен и конвертирован - но нам нужен уже “новый”, конвертированный текст), то всё что нам нужно сделать, так это распознать сколько раз в этом тексте, встречаются символы по которым Ctrl Shift Left будет переходить - т.е как я это вижу, нужно по RegExp подобрать условия замены (на основе нашего текста), чтобы получить в результате нужное количество сдвигов влево (в нашем случае должно получится 10) по @Extended, ну или через размерность массива если использовать только StringRegExp().
Аватара пользователя
Maza Faka

Re: [архив - Часть 2] AutoIt скрипты

Сообщение Maza Faka »

При копировании с использованием

Код:

Код: Выделить всё

ObjCreate("shell.application")

, возвращаемое значение отсутствует, соответственно возникает вопрос, как отследить скопировался ли файл или во время процесса копирования пользователь отменил копирование и исходя из результата выдать итоговое сообщение. Пока проверяю сравнивая размер исходного и конечного файла, но может есть более красивое и практичное решение?



Код:

Код: Выделить всё

$copy = CopyFile("d:\Video\Films", "C:\", "video.avi")
If @error Then
    MsgBox(16, "Error", "Copying is canceled")
Else
    MsgBox(0, "Done", "Copying successful")
EndIf
Func CopyFile($source, $dest, $file)
    $WinShell = ObjCreate("shell.application")
    $WinSHell.NameSpace($dest).CopyHere($source &"\"& $file)
    If FileGetSize($source &"\"& $file) = FileGetSize($dest & $file) Then
        Return 0
    Else
        Return SetError(1)
    EndIf
EndFunc
Аватара пользователя
Diamond

Re: [архив - Часть 2] AutoIt скрипты

Сообщение Diamond »

Вопрос по GUIRegisterMsg($WM_NCPAINT), как я понял если $wParam возвращает 1, значит произошла перерисовка всего окна.

Во всех остальных случаях можно ли как-то узнать координаты перерисовки?
Аватара пользователя
Creat0R

Re: [архив - Часть 2] AutoIt скрипты

Сообщение Creat0R »

Creat0R,
Цитата Creat0R:



А «Мои документы» тоже нормально отображаются в реестре?
[архив - Часть 2] AutoIt скрипты




измененное имя в HKCU аналогично другим, дефолтового действительно нет но его можно взять из параметра Personal ключа "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
Аватара пользователя
Maza Faka

Re: [архив - Часть 2] AutoIt скрипты

Сообщение Maza Faka »

Очень часто спрашивают, как кликнуть по иконке программы в трее. С помощью библиотеки
SysTray_UDF.au3
, которую доработал amel27 сделать это очень просто: Изображение



Код:

Код: Выделить всё

#include 
$pid = ProcessExists("edialer.exe")
$index = _SysTrayIconIndex($pid)
If @error Then MsgBox(16, "Error", "This process not have tray icon")
$pos = _SysTrayIconPos($index)
MouseClick("right", $pos[0], $pos[1])
Аватара пользователя
Creat0R

Re: [архив - Часть 2] AutoIt скрипты

Сообщение Creat0R »

Maza Faka,

Хотел сделать ещё и возможность кликания без задействования мышки, но что то не выходит...

Полагаю я неправильно использую функцию ScreenToClient в User32.dll. Может кто-то знает как правильнее? (это кстати моя одна из первых попыток работать с Dll Изображение).





Код:

Код: Выделить всё

#NoTrayIcon
#include 
$Pid = ProcessExists("Opera.exe")
If Not $Pid Then
    MsgBox(16, "Error", "This process not exists")
    Exit
EndIf
$Index = _SysTrayIconIndex($Pid)
If @error Then
    MsgBox(16, "Error", "This process not have tray icon")
    Exit
EndIf
$Pos = _SysTrayIconPos($Index)
$hWnd = WinGetHandle("[Class:Shell_TrayWnd]")
$YPos = ScreenToClient($hWnd, $Pos[0])
$XPos = ScreenToClient($hWnd, $Pos[1])
ControlClick("[Class:Shell_TrayWnd]", "", "ToolbarWindow321", "Right", 1, $XPos, $YPos)
Func ScreenToClient($hWnd, $Point)
    Local $Struct = DllStructCreate("int;int")
    DllStructSetData($Struct, 1, $Point)
    DllStructSetData($Struct, 2, $Point)
    Local $Ret = DllCall("User32.dll", "int", "ScreenToClient", "hwnd", $hWnd, "ptr", DllStructGetPtr($Struct))
    Return $Ret[0]
EndFunc
Аватара пользователя
Maza Faka

Re: [архив - Часть 2] AutoIt скрипты

Сообщение Maza Faka »

Creat0R

Задумка неплохая, но тут я тебе не советчик, для меня все эти функции с DLL пока тёмный лес :-)
Ответить

Вернуться в «AutoIt»