1 (изменено: alexii, 2012-04-01 19:22:27)

Тема: AHK: Панорамирование окна (сдвиг содержимого за курсором мыши)

Двигать окно за стрелочкой мыши, причем даже за любую его часть (а не только за заголовок) - это на AHK никакой проблемы не представляет.
А вот нельзя ли заставить двигаться СОДЕРЖИМОЕ окна (естественно, при условии что в окне есть "лифты")?
Была такая функция в "драйвере" мыши A4Tech (очень старой версии, в теперешних нет), очень удобно, двигалось содержимое любой программы, Word, Page Maker, Photoshop - любой!
Могу даже выложить ТЕ DLL-ки, может быть, можно использовать некую процедуру из них?

2

Re: AHK: Панорамирование окна (сдвиг содержимого за курсором мыши)

А что есть СОДЕРЖИМОЕ окна? Элементы управления (контролы)? Пользуюсь A4Tech с 2004 года, "Панорамирование" вроде бы представляет из себя аналог вертикальной полосы прокрутки. При этом курсор принимает вид ладошки, вцепившейся в окно. Если это оно, то в версии программы iWhelWorks Delux 7.80 эта возможность присутствует.
В AutoHotkey см. справку по разделу "List of Keys and Mouse/Joystick Buttons" (Список клавиш и кнопок мыши/джойстика. Ник переводчика: Дед Мазай):
WheelDown - поворот колеса мыши "вниз"
WheelUp - поворот колеса мыши "вверх"
Например, ставим на среднюю кнопку мышки: пока кнопка не будет отжата, проверять координаты курсора относительно экрана. Если координаты изменились, разницу поделить на скорость прокрутки. Полученное число поворотов колёсика посылаем в целевое окно.

3

Re: AHK: Панорамирование окна (сдвиг содержимого за курсором мыши)

Интересная задумка, хотелось бы силами AHK решить эту задачу, без доп.софта, причем двигать содержимое не тоько по Y, но и по X.
Можно попробовать через SendMessage, вдруг получиться задействововать wm_HScroll ?

4

Re: AHK: Панорамирование окна (сдвиг содержимого за курсором мыши)

Уже опробовано.

5

Re: AHK: Панорамирование окна (сдвиг содержимого за курсором мыши)

Вышел вот такой вот скрипт, недостаток в том что он прокручивает поочерёдно по горизонтали и по вертикали, для прокрутки по диагонали необходимо немного доработать


CoordMode Mouse, Screen
VarSetCapacity(pt,8)
ScrlIgnoreStyle:=0

^RButton::
MouseGetPos prevmx,prevmy,hParentWnd,hChildWnd,2
if !hChildWnd
hChildWnd:=hParentWnd
SendMessage 132,0,prevmy<<16|prevmx,,ahk_id %hChildWnd% ; WM_NCHITTEST 132
if ErrorLevel<>1 ; HTCLIENT 1
return
if !ScrlIgnoreStyle
{
	; WS_HSCROLL 0x100000 WS_VSCROLL 0x200000
	WndStyle:=DllCall("GetWindowLong","uint",hChildWnd,"int",-16) ; GWL_STYLE -16
	if (WndStyle&0x200000)
	ScrlV:=1
	else ScrlV:=0
	if (WndStyle&0x100000)
	ScrlH:=1
	else ScrlH:=0
	if !(ScrlV|ScrlH)
	{
		WndStyle:=DllCall("GetWindowLong","uint",hChildWnd,"int",-16) ; GWL_STYLE -16
		if (WndStyle&0x200000)
		ScrlV:=1
		else ScrlV:=0
		if (WndStyle&0x100000)
		ScrlH:=1
		else ScrlH:=0
	}
	if !(ScrlV|ScrlH)
	return
}
While % GetKeyState("RButton","P")
{
	DllCall("GetCursorPos","uint",&pt)
	mx:=NumGet(pt), my:=NumGet(&pt+4)
	scrllr:=prevmx-mx,scrlud:=prevmy-my
	if ScrlH|ScrlIgnoreStyle
	if (scrllr>0)
	{
		Loop % scrllr
		SendMessage 276,0,0,,ahk_id %hChildWnd%
		prevmx:=mx
	}
	else if (scrllr<0)
	{
		Loop % Abs(scrllr)
		SendMessage 276,1,0,,ahk_id %hChildWnd%
		prevmx:=mx
	}
	if ScrlV|ScrlIgnoreStyle
	if (scrlud>0)
	{
		Loop % scrlud
		SendMessage 277,0,0,,ahk_id %hChildWnd%
		;Send {WheelUp}
		prevmy:=my
	}
	else if (scrlud<0)
	{
		Loop % Abs(scrlud)
		SendMessage 277,1,0,,ahk_id %hChildWnd%
		;Send {WheelDown}
		prevmy:=my
	}
	;DllCall("ScrollWindow","uint",hChildWnd,"int",prevmx-mx,"int",prevmy-my,"uint",0,"uint",0)
	;ToolTip % "lr " scrllr " ud " scrlud
	Sleep 250
}

return

+ScrollLock::
ScrlIgnoreStyle:=!ScrlIgnoreStyle
return

Esc::
ExitApp

/*
WM_HSCROLL 276
WM_VSCROLL 277
WM_NCHITTEST 132

SB_LINEUP	     0
SB_LINEDOWN	     1
SB_LINELEFT	     0
SB_LINERIGHT     1
SB_PAGEUP	     2
SB_PAGEDOWN	     3
SB_PAGELEFT	     2
SB_PAGERIGHT     3
SB_THUMBPOSITION 4
SB_THUMBTRACK    5
SB_ENDSCROLL     8

HTERROR (-2)
HTTRANSPARENT (-1)
HTNOWHERE 0
HTCLIENT 1
HTCAPTION 2
HTSYSMENU 3
HTGROWBOX 4
HTSIZE 4
HTMENU 5
HTHSCROLL 6
HTVSCROLL 7
HTMINBUTTON 8
HTMAXBUTTON 9
HTREDUCE 8
HTZOOM 9
HTLEFT 10
HTSIZEFIRST 10
HTRIGHT 11
HTTOP 12
HTTOPLEFT 13
HTTOPRIGHT 14
HTBOTTOM 15
HTBOTTOMLEFT 16
HTBOTTOMRIGHT 17
HTSIZELAST 17
HTBORDER 18
HTOBJECT 19
HTCLOSE 20
HTHELP 21
*/

6 (изменено: Irbis, 2012-04-02 01:38:22)

Re: AHK: Панорамирование окна (сдвиг содержимого за курсором мыши)

Пример из справки не совсем то, что нужно - SB_LINELEFT, SB_LINEUP и прочие сдвигают окно на слишком большое значение, не получается плавный сдвиг вместе с мышью.
Но он натолкнул меня на мысль написать вот такой скрипт:

MButton::
   MouseGetPos, X, Y, id, fcontrol,2
   X0 := DllCall("GetScrollPos", Int, fcontrol, Int, 0, Int)
   Y0 := DllCall("GetScrollPos", Int, fcontrol, Int, 1, Int)
   Loop {
      MouseGetPos, X_now, Y_now
      SendMessage, 0x114, (((X0-X_now+X)<<16)^5), 0,, ahk_id %fcontrol%
      SendMessage, 0x115, (((Y0-Y_now+Y)<<16)^5), 0,, ahk_id %fcontrol%
      if !GetKeyState("MButton", "P")
         break
   }
return

Средняя кнопка мыши прекрасно таскает содержимое Paint'а и просмотрщика ТКоммандера (Imagine)... Но не работает в Опере и Word'е.
Насколько я понял, в Ворде сообщения надо посылать непосредствено полосам прокрутки, которые имеют свои hwnd...
В общем, разбираться и разбираться

7

Re: AHK: Панорамирование окна (сдвиг содержимого за курсором мыши)

Прошу простить, получается, я "гавкнул и в кусты", не было доступа к инету на выходных.

ypppu пишет:

А что есть СОДЕРЖИМОЕ окна? Элементы управления (контролы)?

Я неточно сформулировал, содержимое документа, документ, собственно имеется в виду...

ypppu пишет:

Пользуюсь A4Tech с 2004 года, "Панорамирование" вроде бы представляет из себя аналог вертикальной полосы прокрутки. При этом курсор принимает вид ладошки, вцепившейся в окно. Если это оно, то в версии программы iWhelWorks Delux 7.80 эта возможность присутствует.

Совершенно верно, сабж "из тех времён"... Только, не факт, что старинный драйвер мышки будет работать с современными...

8

Re: AHK: Панорамирование окна (сдвиг содержимого за курсором мыши)

Irbis пишет:

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

че-то у меня вообще не пашет...:(
ОнО к какой ДЛЛ-ке обращается? Мож, надо "забросить" в папку скрипта ТУ длл-ку, которая была в комплекте ТЕХ мышей?

9

Re: AHK: Панорамирование окна (сдвиг содержимого за курсором мыши)

Steve Key пишет:

... че-то у меня вообще не пашет...:(
ОнО к какой ДЛЛ-ке обращается?...

Вполне стандартная функция GetScrollPos из user32.dll
В справке  Ahk_L (у меня версия 1.1.7.3 + win7 x86) сказано, что для вызова функций из этой и ряда других стандартных dll не нужно прописывать полное название вида user32.dll/GetScrollPos
Конечно, на сайте MS сказано, что GetScrollPos рекомендуется заменять GetScrollInfo... Не захотел возиться с передачей/приемом данных через структуры
Я написал, что мой пример работает в MS Пайнте и Imagine, к ряду прочих программ с другим устройством контролов нужен другой подход.
Может, у тебя средняя кнопка мыши уже занята, вот скрипт и не пашет? Попробуй с другим сочетанием, например win+ЛКМ:

#LButton::
...
  if !GetKeyState("LButton", "P")
...

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

10

Re: AHK: Панорамирование окна (сдвиг содержимого за курсором мыши)

У меня AHK НЕ L...

11

Re: AHK: Панорамирование окна (сдвиг содержимого за курсором мыши)

Вот и повод начать использовать актуальную версию AHK.

12

Re: AHK: Панорамирование окна (сдвиг содержимого за курсором мыши)

creature.ws пишет:

Вот и повод начать использовать актуальную версию AHK.

Спасибо за "пинок в нужном направлении", сделано!:)

13

Re: AHK: Панорамирование окна (сдвиг содержимого за курсором мыши)

Irbis пишет:

Может, у тебя средняя кнопка мыши уже занята, вот скрипт и не пашет? Попробуй с другим сочетанием, например win+ЛКМ:

#LButton::
...
  if !GetKeyState("LButton", "P")
...

Ага, выяснил - при нажатии горячей кнопки окно программы, которая "подчиняется" скрипту (не ворд) быстренько сдвигается в левый верхний угол... И всё...:|

14

Re: AHK: Панорамирование окна (сдвиг содержимого за курсором мыши)

Irbis пишет:

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

Да, припоминаю, в описании функции в драйвере старой мышки так и было написано - мы работаем, более 40 программ (или как-то так) уже поддерживается...:P