Author Topic: Типовые алгоритмы, вводные статьи (Новички, читайте!)  (Read 328262 times)

0 Members and 4 Guests are viewing this topic.

Dr_midon

  • Освоившийся
  • **
  • Posts: 30
    • View Profile
Re: Типовые алгоритмы
« Reply #15 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) - это не угол экрана в данном случае, а верхний левый угол элемента(будь то кнопка, или поле для ввода текста, или страница в браузере - прокручивание не влияет на координаты на экране монитора).
Удачи!
« Last Edit: November 26, 2016, 08:49:58 AM by Oraven »

Johnny

  • Создатель
  • Герой форума
  • *
  • Posts: 593
    • View Profile
Re: Типовые алгоритмы, вводные статьи
« Reply #16 on: November 04, 2012, 11:32:16 AM »
молодец. добавил в оп-пост. учитесь, господа
можно еще добавить ссылки на MSDN, там есть все коды событий и флагов

Dr_midon

  • Освоившийся
  • **
  • Posts: 30
    • View Profile
Привязка к окну
« Reply #17 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). Также не забываем отлаживать скрипты, прежде чем их помещать на задний план. Они должны отработать стабильно(без ошибок) несколько десятков раз на Ваших глазах.

Сергей

  • Активный участник
  • ***
  • Posts: 159
    • View Profile
Re: Типовые алгоритмы, вводные статьи
« Reply #18 on: November 07, 2012, 03:38:10 PM »
Хе-хе, красиво получилось!
Отсутствую.

ЦИТРИН

  • Супермодератор
  • Оплот сообщества
  • *
  • Posts: 484
  • Марафон опавших листьев, коктейль из дыма и мыслей
    • View Profile
Re: Типовые алгоритмы, вводные статьи
« Reply #19 on: November 07, 2012, 03:59:51 PM »
Хе-хе, красиво получилось!
Красиво )
Пара вопросов от нуба.
Нельзя ли из  самого скрипта пейнт  вызвать ,  плюс растянуть его холст на нужный размер?
Как сделать  например  цветные спирали ?
Бабочки полёт будит тихую поляну в солнечном свету...

Dr_midon

  • Освоившийся
  • **
  • Posts: 30
    • View Profile
Re: Типовые алгоритмы, вводные статьи
« Reply #20 on: November 07, 2012, 07:55:40 PM »
Статья была предназначена для разрешения вопросов по привязке к окну и работе в фоновом режиме. Если заинтересовал рисованием тригонометрических графиков то можно погуглить на слова: циклоида, эпициклоида, гипоциклоида, фрактал

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 - ширина, высота окна

А также можно сказать, что элементы там не передвигаются и статично стоят на своих местах. Остается только найти их координаты при помощи положения и размеров окна.
« Last Edit: November 08, 2012, 11:34:26 PM by Dr_midon »

ЦИТРИН

  • Супермодератор
  • Оплот сообщества
  • *
  • Posts: 484
  • Марафон опавших листьев, коктейль из дыма и мыслей
    • View Profile
Re: Типовые алгоритмы, вводные статьи
« Reply #21 on: November 07, 2012, 08:49:57 PM »
2 ЦИТРИН:
Попробуй сам реализовать - это же интересно  ;)
Можно использовать следующие функции:
WNDFIND
WNDPOS
WNDSIZE (hwnd, w, h)[/b] - задает размер окна
Вы полагаете я не пробовал играть в  эти команды?
Пробовал.
Ничего не вышло.
Если не затруднит, покажите алгоритм их использования , в 100% рабочем скрипте, с подробными  пошаговыми комментариями . Тогда  в аналогичной задаче ( скажем с фотошопом ) новичкам будет легче.
Заранее благодарен )
Бабочки полёт будит тихую поляну в солнечном свету...

Ляпис

  • Освоившийся
  • **
  • Posts: 35
    • View Profile
Re: Типовые алгоритмы, вводные статьи
« Reply #22 on: November 08, 2012, 08:38:59 AM »
WNDFIND/POS/SIZE - это хорошо, а есть возможность сохранить и воспроизвести положение ползунков вертикальной и горизонтальной прокрутки содержимого окна?
cmann4.7 se win8 slimbrowser intel core2duo
текущий проект - "Зомби Ферма" VK

Dr_midon

  • Освоившийся
  • **
  • Posts: 30
    • View Profile
Re: Типовые алгоритмы, вводные статьи
« Reply #23 on: November 08, 2012, 11:55:12 PM »
Написал небольшой скриптик, который реализует запуск, перемещение, изменение размеров окна и его кнопок, за испытуемого был выбран калькулятор.

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 и с помощью ее это проделывать.
Других вариантов не придумал.
« Last Edit: November 09, 2012, 12:03:23 PM by Dr_midon »

ЦИТРИН

  • Супермодератор
  • Оплот сообщества
  • *
  • Posts: 484
  • Марафон опавших листьев, коктейль из дыма и мыслей
    • View Profile
Re: Типовые алгоритмы, вводные статьи
« Reply #24 on: November 09, 2012, 11:24:40 AM »
Спасибо Dr_midon)
Скрипт 100% рабочий. Очень толково все  разъясняющий.
Интересно получилось. Вы не зря потратили свое время. 
Добавлю в твиттер . https://twitter.com/ClickerForum
Бабочки полёт будит тихую поляну в солнечном свету...

Dr_midon

  • Освоившийся
  • **
  • Posts: 30
    • View Profile
Re: Типовые алгоритмы, вводные статьи
« Reply #25 on: November 09, 2012, 12:39:36 PM »
Есть небольшая утилитка(Spy32 for windows) очень бородатого года, которая поможет разобраться в элементах форм запущенных приложений. Вчера пытался похожие найти, но более свежие. ХЗ как спросить у гугла. Нашел только платную.

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

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Типовые алгоритмы, вводные статьи
« Reply #26 on: November 09, 2012, 01:04:56 PM »
Есть небольшая утилитка(Spy32 for windows) очень бородатого года, которая поможет разобраться в элементах форм запущенных приложений. Вчера пытался похожие найти, но более свежие. ХЗ как спросить у гугла. Нашел только платную.

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

InqSoft Window Scanner 1.7
http://clickermann.tk/forum/index.php?topic=42.msg572#msg572
« Last Edit: November 09, 2012, 01:09:48 PM by Oraven »

Dr_midon

  • Освоившийся
  • **
  • Posts: 30
    • View Profile
Re: Типовые алгоритмы, вводные статьи
« Reply #27 on: November 09, 2012, 02:50:37 PM »
InqSoft Window Scanner 1.7 поинтереснее будет, побольше функционала, спс ;)
Но она тож довольно-таки старенькая, хотя и помоложе того, что я выложил.

Ляпис

  • Освоившийся
  • **
  • Posts: 35
    • View Profile
Re: Типовые алгоритмы, вводные статьи
« Reply #28 on: November 09, 2012, 08:37:39 PM »
а есть возможность сохранить и воспроизвести положение ползунков вертикальной и горизонтальной прокрутки содержимого окна?
Стандартными средствами только анализировав картинку и сохранением в переменную смещения ползунка. Или в 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 и с помощью ее это проделывать.
Других вариантов не придумал.
Хотел попробовать SendMessage(hwnd, WM_HSCROLL, SB_THUMBPOSITION, 0). В справке кмана написано:
Quote
Поскольку у нас нет всех констант "WM_", то параметр message необходимо задавать десятичным числом.
на чём собственно все мои потуги и закончились. Не нашел справочника где даются числовые значения констант "WM_", если я правильно всё понял.
cmann4.7 se win8 slimbrowser intel core2duo
текущий проект - "Зомби Ферма" VK

Dr_midon

  • Освоившийся
  • **
  • Posts: 30
    • View Profile
Re: Типовые алгоритмы, вводные статьи
« Reply #29 on: November 09, 2012, 10:09:00 PM »
Жаль нет у форума сворачивающихся блоков, так бы туда все переписал.
Нашел следующее на японском сайте, но думаю проблем с языком не возникнет  ;D
messages: http://www1.u-netsurf.ne.jp/~ozawa/prog/event/message.html

Еще нужны запросы пользователя (wParam):
Code: [Select]
     WM_VSCROLL                          WM_HSCROLL
--------------------------------------------------------
SB_LINEUP        = 0                SB_LINELEFT      = 0
SB_LINEDOWN      = 1                SB_LINERIGHT     = 1
SB_PAGEUP        = 2                SB_PAGELEFT      = 2
SB_PAGEDOWN      = 3                SB_PAGERIGHT     = 3
SB_THUMBPOSITION = 4                SB_THUMBPOSITION = 4
SB_THUMBTRACK    = 5                SB_THUMBTRACK    = 5
SB_TOP           = 6                SB_LEFT          = 6
SB_BOTTOM        = 7                SB_RIGHT         = 7
SB_ENDSCROLL     = 8                SB_ENDSCROLL     = 8

Кроме того не стоит забывать, что
http://msdn.microsoft.com/ru-ru/library/windows/desktop/bb787575(v=vs.85).aspx

The WM_HSCROLL message is sent to a window when a scroll event occurs in the window's standard horizontal scroll bar. This message is also sent to the owner of a horizontal scroll bar control when a scroll event occurs in the control.

wParam
The HIWORD specifies the current position of the scroll box if the LOWORD is SB_THUMBPOSITION or SB_THUMBTRACK; otherwise, this word is not used.
The LOWORD specifies a scroll bar value that indicates the user's scrolling request. This word can be one of the following values.
SB_ENDSCROLL
SB_LEFT
SB_RIGHT
SB_LINELEFT
SB_LINERIGHT
SB_PAGELEFT
SB_PAGERIGHT
SB_THUMBPOSITION
SB_THUMBTRACK

lParam
If the message is sent by a scroll bar control, this parameter is the handle to the scroll bar control. If the message is sent by a standard scroll bar, this parameter is NULL.

Вольный перевод:
WM_HSCROLL сообщение отправляется в окно, когда событие scroll происходит в горизонтальной полосе прокрутки окна. Это сообщение также отправляется владельцу горизонтальной полосы прокрутки при возникновении события scroll в элементе управления.

WPARAM
HIWORD определяет положение полосы прокрутки, если LOWORD берется значение SB_THUMBPOSITION или SB_THUMBTRACK, в противном случае это слово не используется.
LOWORD указывает запрос пользователя. Это слово может быть одним из следующих значений.
SB_ENDSCROLL
SB_LEFT
SB_RIGHT
SB_LINELEFT
SB_LINERIGHT
SB_PAGELEFT
SB_PAGERIGHT
SB_THUMBPOSITION
SB_THUMBTRACK

lParam
Если сообщение отправляется и полосе прокрутки, lParam является дескриптором управления полосы прокрутки. Если сообщение не отправляется полосе прокрутки, lParam имеет значение NULL
« Last Edit: November 09, 2012, 10:27:30 PM by Dr_midon »