Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - Dr_midon

Pages: 1 [2]
16
InqSoft Window Scanner 1.7 поинтереснее будет, побольше функционала, спс ;)
Но она тож довольно-таки старенькая, хотя и помоложе того, что я выложил.

17
При вставке текста(CTRL+V) в редактор, когда текст не влезает на страницу и идет прокрутка страницы наблюдается ошибка: редактор не показывает строчку текста.

18
Есть небольшая утилитка(Spy32 for windows) очень бородатого года, которая поможет разобраться в элементах форм запущенных приложений. Вчера пытался похожие найти, но более свежие. ХЗ как спросить у гугла. Нашел только платную.

Использовать оч просто: запустил и перетягиваешь(Drag`n`Drop) крестик с первой вкладки на нужный тебе элемент. Программка показывает довольно много информации об целевом окне(кнопке/поле/элементе интерфейса). Можно некоторые свойства менять.

19
А чем эта тема не устраивает?
http://clickermann.tk/forum/index.php?topic=47.0

20
Написал небольшой скриптик, который реализует запуск, перемещение, изменение размеров окна и его кнопок, за испытуемого был выбран калькулятор.

Code: (clickermann) [Select]
#name "Windows change"

$HWnd = 0 // Дескриптор окна(указатель на окно)

execute("calc")  // Запускаем калькулятор

wait(1)    // Ждем 1 сек.
           // Если калькулятор запускается первый раз,
           // то немного надо подождать. Последующие разы будет
           // Запускаться мгновенно (так реализована память Windows)

$HWnd = WNDFIND ("Калькулятор Плюс") // Пытаемся найти окно(в Windows XP)
                                     // Если не найдет то ошибки не покажет.
                                     // Но $HWnd будет равна нулю

if ($HWnd > 0)  // Проверяем нашлось ли окно

   WndPos ($HWnd, 200, 200) // Двигаем окно
   WaitMS(500)
   lClick(265,236)  // Кликаем в меню "ВИД"
   WaitMS(500)
   lClick(288,257) // Кликаем в меню "ОБЫЧНЫЙ"
   WaitMS(500)

   // Еще раз повторюсь: любой элемент формы - это окно
   // Значит мы можем двигать и менять размер не только формы,
   // но и кнопок на ней

   $HWnd = hGet (270,300)  // Находим дескриптор кнопки "Backspace" в глобальных координатах 270,300
   WndSize ($HWnd, 36, 29)   // Меняем ее размер в локальных координатах
   WaitMS(500)

   $HWnd = hGet (340,300)  // Находим дескриптор кнопки "CE" в глобальных координатах 340,300
   WndSize ($HWnd, 36, 29)   // Меняем ее размер в локальных координатах
   WaitMS(500)
   WndPos($HWnd, 93, 37)   // и местоположение в локальных координатах
   WaitMS(500)

   $HWnd = hGet (400,300)  // Находим дескриптор кнопки "C" в глобальных координатах
   WndSize ($HWnd, 36, 29)   // Меняем ее размер в локальных координатах
   WaitMS(500)
   WndPos($HWnd, 132, 37)   // и местоположение в локальных координатах
   WaitMS(500)

   halt // Точка выхода из скрипта
end_if



$HWnd = WNDFIND ("Калькулятор") // Окно не нашлось... Мб у Вас Win7 ?

if ($HWnd > 0)  // Проверяем нашлось ли окно
   WndPos ($HWnd, 200, 200) // Двигаем окно
   WaitMS(500)
   
   $HWnd = hGet (250,280)  // Находим дескриптор поля ввода текста  в глобальных координатах
   WndSize ($HWnd, 100, 50)   // Меняем его размер в локальных координатах
   WaitMS(500)
   WndPos($HWnd, 60, 33)   // и местоположение в локальных координатах
   WaitMS(500)
end_if

halt // Точка выхода из скрипта

а есть возможность сохранить и воспроизвести положение ползунков вертикальной и горизонтальной прокрутки содержимого окна?

Стандартными средствами только анализировав картинку и сохранением в переменную смещения ползунка. Или в Photoshop`e посчитав, на сколько пикселей сместился ползунок, а затем при помощи связки LDOWN (x, y) -> MOVE (x, y) -> LUP (x, y) передвинуть его. Либо посылать ему сообщение SendMessage(hwnd, WM_HSCROLL, SB_THUMBPOSITION, 0) подробнее тут: http://msdn.microsoft.com/en-us/library/windows/desktop/bb787575(v=vs.85).aspx
Не стандартными - писать отдельную DLL и с помощью ее это проделывать.
Других вариантов не придумал.

21
Статья была предназначена для разрешения вопросов по привязке к окну и работе в фоновом режиме. Если заинтересовал рисованием тригонометрических графиков то можно погуглить на слова: циклоида, эпициклоида, гипоциклоида, фрактал

http://www.delphigfx.narod.ru/2d/009/2d_9.htm
http://www.megabook.ru/MediaViewer.asp?RNode=4024&MID=453982

2 ЦИТРИН:
Попробуй сам реализовать - это же интересно  ;)
Можно использовать следующие функции:

EXECUTE ("filename", ["param"]) - вызывает внешний файл
Параметры
filename - имя файла
param - необязательный параметр; строка параметров

WNDFIND ("title", [begin]) - числовая функция; возвращает HWND окна с заданным заголовком
Параметры
title - заголовок окна либо его часть
begin - необязательный параметр; флаг сообщает о том что строка title может находиться ТОЛЬКО в начале заголовка

WNDPOS (hwnd, x, y) - помещает окно на экране в указанные координаты
Параметры
hwnd - HWND окна
x,y - экранные координаты

WNDSIZE (hwnd, w, h) - задает размер окна
Параметры
hwnd - HWND окна
w,h - ширина, высота окна

А также можно сказать, что элементы там не передвигаются и статично стоят на своих местах. Остается только найти их координаты при помощи положения и размеров окна.

22
Общие вопросы / Привязка к окну
« on: November 07, 2012, 12:06:48 PM »
Доброго времени суток!

Сегодня поговорим о привязке к окну. В предыдущей статье шла речь о WinApi, но не о привязке к окнам. Хотя можно использовать и WinApi, но есть ряд существенных недостатков. Реализация(написание) скриптов при помощи привязки гораздо проще, т.к. достаточно вставить lclick(x, y) (можно это сделать даже при помощи сочетания ALT+Q) и не нужно громоздить остального кода, включая расчет координат.

Зачем нам оно?
Привязка к окну помогает кликать в окно, даже когда оно свернуто. Также можно свернуть и clickermann. Это значит, что нам можно заниматься своими делами, пока работает кликер. И он нам не будет мешаться.

Ставим задачу
Будем учиться на простом примере: кликать в свернутый Paint(он у каждого в системе есть, стандартная программа). Делать будем не одиночный клик, а нам надо занять рисовалку, пока мы будем проделывать различные действия с окнами. Т.к. тут необходимо уяснить принцип действия, а написание дальнейшего скрипта не будет отличаться от нормального режима.

Что нам понадобится
1. Clickermann 4.7
2. Paint(можно запустить нажав на клавиатуре WIN+R и введя в появившееся окно mspaint, а затем Enter)
3. Скрипт(можно будет скопировать мой Цветок.cms, для примера работы)

Скрипт небольшой, можно и продублировать:
Code: (clickermann) [Select]
#name "Цветок"

// Скрипт, рисующий(в паинте) цветок

$r = 100 // Радиус
$f = 24  // Форм фактор
$i = 0.3 // Смещение начала

while(($i*100) < 1640) // Начало цикла.
                       // Заглушка для проверки дробей

$x = cos($i*$f) // переход от полярных координат
$y = sin($i*$f) // к декартовым

$x = $x *($r-$i*$f/2) // Придание формы  спирали
$y = $y *($r-$i*$f/2) // и задание размера

  $x = $x + 100 + $r // Центрование
  $y = $y + 100 + $r // на холсте
 
  $x = round($x, 0) //  Округление координат
  $y = round($y, 0) //  Иначе клика не получим

  lclick($x, $y) // Сам клик
  waitms(50)  // Пауза: разгружает процессор
  $i = $i + 0.02  // следующая полярная координата
 
end_cyc  // Окончание цикла

halt // Точка выхода из скрипта

Практика
Все достаточно просто, можно разбить всю задачу на 4 пункта:
1. Открываем Paint
2. Открываем фаил Цветок.cms(либо жмем на кнопочку РЕДАКТОР туда вставляем, нажимаем применить и закрываем редактор)
3. В программе Paint мышкой наводим на белый холст будущего рисунка и нажимаем на клавиатуре ALT+W. При этом в окне Clickermann`a должна появиться надпись вкл напротив строчки Статус: в группе Привязка к окну.
4. Запускаем Clickermann, нажав на зеленую кнопочку, или на клавиатуре ALT+A

Все, теперь программа работает и мы можем перекрыть окно паинта другим окном или вовсе свернуть. Скрипт продолжит работу в любом случае.

Эпилог
Теперь Вы можете не загораживать экран окном, в котором работает Clickermann. Достаточно просто свернуть их и делать любые другие действия, кроме нажатия на горячие клавиши старта/стопа(ALT+A / ALT+S). Также не забываем отлаживать скрипты, прежде чем их помещать на задний план. Они должны отработать стабильно(без ошибок) несколько десятков раз на Ваших глазах.

23
Во флуд превратилась тема, если дальше так пойдет, то можно во флуд перенести или удалить.

Quote
1. Слабая аргументация
2. Продвинутый юзер таки и ушел из винды в  линкус
3. Масса уважаемых  программ, имеет 2 уровня сложности
4. Как чаще всего используется данная функция

1. Я вообще дизайном на жизнь зарабатываю, но это ни сколько не мешает программить. Человек разумен. Если человеку интересна тема то он в ней разберется, а иначе даже не будет по справкам и форумам лазать. Необходимость тоже не исключаю, но если приперло, то обходиться придется простейшими функциями коих немало и запись действий тоже есть(но это уж совсем для одноразового использования). Можно несколько типовых примеров различных скриптов с избыточным числом комментариев запихать от простого к сложному.

2. Программа - это инструмент. Это не означает, что очень умный и талантливый плотник микроскопом гвозди забивает. Сервер поднимать надо на Linux`e - никто не спорит. А вот 3D пакетов моделирования там сколь(Blender - одна?)? А сколь из них поддерживают просчет глобального освещения? На сколько больше времени уходит на просчет одной картинки? Думаю, что есть еще не одна программа, которая не реализована на Linux в полной мере.

3. Согласен. 2 интерфейса уже есть. Что можно рассказать в справке для начинающих про первый? 4 кнопки: запись, проигрывание, стоп и закрыть? Для этого спец. справку нужно?

4. Блокнот, калькулятор, обычный поисковик гугла имеют места, куда нужно кликать. И они у всех есть и у физика, и у лирика. А процедуре LCLICK(123,456) без разницы, кто компом управляет и описание у нее, как и пример работы будет очень лаконичным. А для описания процедуры моей племяннице, например, SendMessage(WndFind("Receiver", 1), $WM_COPYDATA, 0, $cd) придется начинать с устройства Windows, описание так растянется, что уже будет не описанием этой конкретной процедуры, а будет статьей. Но статья - это не справка же?

24
Использование / Re: BenchMark Test
« on: November 06, 2012, 01:55:29 PM »
Ничего не надо - программа не параллельная, а последовательная. Т.е. одна функция отработала и только потом вторая запускается. А тут мы пис***** меряемся  ;D

25
Использование / Re: BenchMark Test
« on: November 06, 2012, 01:39:03 PM »
OS: Windows XP 32
CPU: AMD Phenom II X4 3.01 Ghz
RAM: 4gb(0,75gb не используется ввиду битности ОСи)
VGA: ATI Radeon HD 4870 (RV770)

Code: [Select]
16:26:59 ====BenchMark Test====
16:26:59 Разрешение:  1280x1024
16:26:59 Итерации:    100
16:26:59 ========Время=========
16:26:59 Мин:         77 мс
16:26:59 Сред:        78.06 мс
16:26:59 Макс:        88 мс
16:26:59 Общ:         7806 мс
16:26:59 ==Кол-во вычислений===
16:26:59 Всего:       131072000
16:26:59 За 1 мс:     16791.186
16:26:59 ======================
Скрипт в начале темы.

26
Использование / Re: Зыбытые Измерения
« on: November 06, 2012, 01:13:33 PM »
Браузер у тебя зависает потому, что есть буфер(очередь) команд. И если туда много накликать то и не только браузер может зависнуть  ;) . Oraven правильно написал, но используй HALT в конце скрипта.
Code: [Select]
LCLICK(1067,300)
WAITMS (40)
LCLICK(919,357)
HALT // полностью останавливает выполнение сценария

Можно усложнить конструкцию, чтоб не запускать кликер каждый раз. А запустить его 1 раз и когда нужно нажимать забитую клавишу на клавиатуре(я забил  CTRL):
Code: (clickermann) [Select]
IF ( ISKEYDOWN(#CTRL)=1 ) // проверяет, нажата ли клавиша CTRL
    LCLICK(1067,300)  // кликает
    WAITMS (40)  // ждет 40 миллисекунд
    LCLICK(919,357)  // кликает
    WAIT (3) // ждет 3 секунды, чтоб не накликал больше раз до того как отпустишь  CTRL
END_IF  // окончание блока кода, который исполняется при нажатом  CTRL
WAITMS (200) // останавливается на 200 миллисекунд(разгружает процессор)

27
1. Лично я против того, "что справка должна быть  двухуровневая". Достаточно одной справки, но которая подходила бы для всех. Не стоит людей делить, иначе нужно и двухуровневую программу делать и 2 виндовс и т.д. Да еще и людям придется рассказывать, какая справка написана для каждого из них(в какой тип относить конкретного пользователя). Кстати я почти весь форум уже прочитал  :P и видел, о чем писали.

2. Согласен. Тут надо побольше подумать, как оформить примеры. Чтоб они и суть функции раскрывали, и "плюг энд плей" были, и не были растянутыми. Возможно нужно показать, как чаще всего используется данная функция.

28
Начинающий программист не всегда знает стандартов, которые используются во множестве технической литературы. За сим предлагаю добавить в начальную(Введение:ФУНКЦИИ И ПРОЦЕДУРЫ) страницу описания программы следующее:

Quote
Параметры, которые принимают функции и процедуры, могут быть нескольких типов. Описание в справке может содержать следующий интуитивно понятный вид с любыми вариациями названия параметра:
$value - параметр является переменной(начинается с $, например: $var, $_return1, $_hwnd и т.п.);
"value" - параметр является строкой(параметр обрамлен кавычками, например: "filename", "parname" и т.п.)
value - параметр является числом(название без дополнительных смиволов, например: a, b, x, y, keycode)
[value] - необязательный параметр(параметр обрамлен квадратными скобками, например: ["section"], [mult], [$var] и т.п.)

А вообще, если комьюнити и автор не против, то могу взять на себя обязанность переписать(когда время свободное появится) справку по типу:

Quote
Функция StrLen

Синтаксис
StrLen(Str: String): Integer;

Параметры
Str - входная строка

Описание
Возвращает количество символов в строке Str, причем нулевой символ окончания строки в длину не засчитывается

Пример
StrLen("lol") // результат "3"

См. также описание функций StrCut, StrCut2, StrFilter, StrPos, StrConcat, StrReplace.



29
Ошибки / Re: Ошибка NAME и INCLUDE
« on: November 06, 2012, 09:15:31 AM »
Было бы не плохо добавить их в HELP ;)
instructions.chm не содержит в индексе(вкладка Указатель) ни #name, ни name.
А также нет #include и include. Хотя они довольно хорошо описаны на второй странице Введение

30
Общие вопросы / Re: Типовые алгоритмы
« on: November 04, 2012, 02:04:37 AM »
Доброго времени суток!

Решил показать, как пользоваться WinAPI функцией
POSTMESSAGE (hwnd, message, wParam, lParam)

Что это такое?
Windows API (англ. application programming interfaces) — общее наименование целого набора базовых функций интерфейсов программирования приложений операционных систем семейств Microsoft Windows. Или по простому - базовый язык наших любимых окошек(Windows). Остальные языки программирования делают свои функции и процедуры из WinAPI или используют его на прямую.

POSTMESSAGE — функция помещает сообщение в очередь.

Зачем нам оно?
Количество функций Clickermann`а неуклонно продолжает расти, но необходимо очень много времени, чтоб можно было сделать свои обертки на все функции Windows. А теперь, когда появилась эта функция мы можем на прямую работать с интерфейсами окошек. И использовать максимум функционала.

Ставим задачу
Нужно написать код, чтоб можно было кликать в окошке, которое находится позади других.
Невозможно, скажете вы и ошибетесь ;D . Потому, как мы не будем эмулировать клик мыши, а станем посылать сообщение окну, в котором должен быть произведен клик. Нужно это для разных случаев, но мне пригодилось во флеш игре, в которой необходимо кликать мышкой каждую минуту(даже сейчас она кликает, нервно помигивая кнопкой на панели задач, пока я пишу эту статью).

Что нам понадобится
нам понадобится сама функция
PostMessage(
    HWND hWnd,
    UINT Msg,
    WPARAM wParam,
    LPARAM lParam
);

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

Msg - Сообщение, которое должно быть поставлено в очередь. Сообщение цифровое и писать мы будем его цифрами. Есть куча сообщений, которые могут приходить окну. Вот небольшой список:
wm_LButtonDblClk, wm_LButtonDown, wm_LButtonUp, wm_MButtonDblClk, wm_MButtonDown, wm_MButtonUp, wm_MouseMove, wm_NCLButtonDown, wm_NCLButtonUp, wm_NCLButtonDblClk, wm_NCMButtonDown, wm_NCMButtonDblClk, wm_NCMouseMove, wm_NCRButtonDown, wm_NCRButtonUp, wm_NCRButtonDblClk, wm_RButtonDown, wm_RButtonUp, wm_RButtonDblClk и т.п.
И каждому такому сообщению выдан свой код(0x0201 — означает шестнадцатиричный вид, например 0x0201 = 513):
Code: [Select]
WM_LBUTTONDOWN   =  0x0201  // Левая кнопка мыши нажата.
WM_LBUTTONUP     =  0x0202  // Левая кнопка мыши отпущена.

WM_RBUTTONDOWN   =  0x0204  // Правая кнопка мыши нажата.
WM_RBUTTONUP     =  0x0205  // Правая кнопка мыши отпущена.

WM_MOUSEMOVE     =  0x0200  // Мышь передвинута.

WM_MOUSEWHEEL    =  0x020A  // Кручение колесика мыши.

wParam и lParam - Это 32-битовые парaметры. Для каждого случая свои. Но в нашем случае в первом параметре задается нажатые кнопки(если нажато несколько кнопок то они складываются, например нажаты вместе SHIFT и левая кнопка мыши — 0x0004 + 0x0001 = 0x0005):

Code: [Select]
MK_LBUTTON  =  0x0001  // Левая кнопка мыши находится в нажатом состоянии.
MK_RBUTTON  =  0x0002  // Правая кнопка мыши находится в нажатом состоянии.
MK_SHIFT    =  0x0004  // Клавиша SHIFT находится в нажатом состоянии.
MK_CONTROL  =  0x0008  // Клавиша CTRL находится в нажатом состоянии.
MK_MBUTTON  =  0x0010  // Средняя кнопка мыши находится в нажатом состоянии.
MK_XBUTTON1 =  0x0020  // Windows 2000/XP: Первая X-кнопка находится в нажатом состоянии.
MK_XBUTTON2 =  0x0040  // Windows 2000/XP: Вторая X-кнопка находится в нажатом состоянии.
Мышкины события и их коды описаны в MSDN(en)
http://msdn.microsoft.com/en-us/library/windows/desktop/ff468877(v=vs.85).aspx
Клавиатурные события и их коды описаны в MSDN(en)
http://msdn.microsoft.com/en-us/library/windows/desktop/ff468861(v=vs.85).aspx

А во втором параметре координаты курсора мыши. Как же можно в одном числе записать 2 значения X и Y? Давольно просто: используя 32 битную операционную систему можно в первых 16 битах передавать Y, а во второй части — X. Например координаты (123 , 456) в шестнадцатиричнном виде будут выглядеть как (0x007B , 0x01C8) и мы получим параметер lParam = 0x01C8007B или в десятичном будет непойми что 29 884 539 = 123 + 456 * 65536. Откуда взялась цифра 65536 оставлю на домашнее задание(подсказка: 256*256=65536, 256 — BYTE, 65536 — WORD)

Практика
Вы дочитали до этих строк и не бросили это нудное дело? Тогда хвала Вам и почет, о любимый мой читатель. А еще лэвэл ап и новый скилл. Копируем и вставляем в Clickermann следующее:

Code: (clickermann) [Select]
$WM_LBUTTONDOWN = 0x0201 // Левая кнопка мыши нажата.
$WM_LBUTTONUP = 0x0202 // Левая кнопка мыши отпущена.
$MK_LBUTTON = 0x0001 // Левая кнопка мыши находится в нажатом состоянии.

$HWND = 16515858 // изменяется при каждом запуске целевой программы,
                 // нужно каждый раз вписывать заного

$x = 100 // Координата по X
$y = 100 // Координата по Y

//Отправляем сообщение окну о нажатой левой кнопке мыши
postmessage($HWND, $WM_LBUTTONDOWN, $MK_LBUTTON, $x + ($y*65536))

//Мало-мало ждем, а можно и вообще не ждать,
//   т.к. сообщения уходят в список и выполняются по порядку
waitms(50)

//Отправляем сообщение окну, что левую кнопку мыши отпустили
postmessage($HWND, $WM_LBUTTONUP, $MK_LBUTTON, $x + ($y*65536))

// Завершаем программу
halt

Запускаем mspaint — стандартную рисовалку Windows, наводим мышь на белый холст и наблюдаем в редакторе кода за hWND. Пишем свое число вместо моего $HWND = и запускаем скрипт(Clickermann). Все. Теперь на холсте паинта стоит точка на расстоянии 100 пикселей от левого края холста(а не экрана!!!) и 100 пикселей от правого.

Эпилог
В браузерах обычно сам сайт и все, что в нем есть имеет один hWND. И высчитав количество пикселей сверху, которое занимает панели браузера можно к Y дописать $y = 100-61 (61 - высота панели хрома) и задавать координаты без вычислений, но при условии, что форма развернута на весь экран. Если двигать форму по всему экрану то прийдется каждый раз пересчитывать координаты. Т.к. все элементы будут содержать собственные координаты. И угол (0,0) - это не угол экрана в данном случае, а верхний левый угол элемента(будь то кнопка, или поле для ввода текста, или страница в браузере - прокручивание не влияет на координаты на экране монитора).
Удачи!

Pages: 1 [2]