1 (изменено: Drugoy, 2012-10-11 13:58:34)

Тема: AHK: Исправить скрипт перемещения неактивных окон (hold alt&drag)

Помогите, пожалуйста, с этим скриптом:

#SingleInstance,Force
SetWinDelay,0
SetBatchLines,-1
CoordMode,Mouse,Screen


!LButton::
MouseGetPos,oldmx,oldmy,mwin,mctrl

Loop
{
  GetKeyState,lbutton,LButton,P
  GetKeyState,alt,Alt,P
  If (lbutton="U" Or alt="U")
    Break
  MouseGetPos,mx,my
  WinGetPos,wx,wy,ww,wh,ahk_id %mwin%
  wx:=wx+mx-oldmx
  wy:=wy+my-oldmy
  WinMove,ahk_id %mwin%,,%wx%,%wy%
  oldmx:=mx
  oldmy:=my
}
Return

99GuiClose:
  Gui,99:Destroy
  OnMessage(0x200,"")
  DllCall("DestroyCursor","Uint",hCur)
Return

WM_MOUSEMOVE(wParam,lParam)
{
  Global hCurs
  MouseGetPos,,,,ctrl
  If ctrl in Static9,Static13,Static17
    DllCall("SetCursor","UInt",hCurs)
  Return
}
Return

Проблема заключается в том, что он срабатывает и для активного окна, а не должен бы.
Я наивно думал, что добавив #IfWinNotActive в начало скрипта - баг исчезнет, ан нет.
Также, я не очень понимаю суть последних двух блоков кода, поэтому боюсь, что сам не справлюсь и прошу помощи у вас: помогите, пожалуйста!

2 (изменено: creature.ws, 2012-10-11 09:14:50)

Re: AHK: Исправить скрипт перемещения неактивных окон (hold alt&drag)

Баг — это ведь «поведение обусловленное допущенной при разработке ошибкой», у вас баг в заголовке темы 

; этот код в древности был утянут с оф форума.
!LButton::KDE_WinMove("LButton") ; при нажатии !Lbutton в потоке этой горячей клавиши происходит вызов процедуры KDE_WinMove с параметром «указывающем на левую кнопку мыши»

KDE_WinMove(sButton)
{
    if !GetKeyState(sButton, "P") ; если посланная в качестве параметра клавиша или кнопка не нажаты выполнение подпрограммы завершается здесь.
        Exit

    SetWinDelay, 0
    CoordMode, Mouse
    MouseGetPos, x1, y1, id ; определяем координаты курсора и id окна под ним
    WinExist("ahk_id" . id) ; осуществляем «поиск» этого окна чтоб установить lastfound window и не искать окно попусту в прочих командах.

    WinGetClass, winClass
    if (winClass == "WorkerW") ; не пытаемся переместить рабочий стол
        Exit

    WinGet, win, MinMax ; не пытаемся переместить максимизированные окна
    if (win)
        Exit

    WinGetPos, winX1, winY1
    while GetKeyState(sButton, "P") ; собственно таскаем окно при зажатой кнопке, имя которой послано данной процедуре в качестве параметра
    {
        MouseGetPos, x2, y2
        x2 -= x1, y2 -= y1, winX2 := winX1 + x2, winY2 := winY1 + y2
        WinMove,,, winx2, winY2
        Sleep 15
    }
}

Пример выше позволяет перемешать окна «за любую точку» при клике левой кнопкой с зажатым альт при последующем перемещении курсора при зажатой левой кнопке мыши.

Если нужно исключить возможность перемещения активных окон — достачно добавить проверку не является ли окно под курсором активным:

!LButton::KDE_WinMove("LButton")

KDE_WinMove(sButton)
{
    if !GetKeyState(sButton, "P")
        Exit

    SetWinDelay, 0
    CoordMode, Mouse
    MouseGetPos, x1, y1, id
    WinExist("ahk_id" . id)

    if WinActive() ; если найденное выше окно активно — выходим из подпрограммы горячей клавиши.
        Exit

    WinGetClass, winClass
    if (winClass == "WorkerW")
        Exit

    WinGet, win, MinMax
    if (win)
        Exit

    WinGetPos, winX1, winY1
    while GetKeyState(sButton, "P")
    {
        MouseGetPos, x2, y2
        x2 -= x1, y2 -= y1, winX2 := winX1 + x2, winY2 := winY1 + y2
        WinMove,,, winx2, winY2
        Sleep 15
    }
}

Два последних блока кода в вашем примере — не используются. «Мёртвый груз»

3

Re: AHK: Исправить скрипт перемещения неактивных окон (hold alt&drag)

Drugoy, ознакомься с этой темой, отредактируй заголовок.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4 (изменено: Drugoy, 2012-10-11 14:11:32)

Re: AHK: Исправить скрипт перемещения неактивных окон (hold alt&drag)

creature.ws пишет:

Баг — это ведь «поведение обусловленное допущенной при разработке ошибкой», у вас баг в заголовке темы 

Подправил.

creature.ws пишет:

Пример выше позволяет перемешать окна «за любую точку» при клике левой кнопкой с зажатым альт при последующем перемещении курсора при зажатой левой кнопке мыши.

Если нужно исключить возможность перемещения активных окон — достачно добавить проверку не является ли окно под курсором активным:

Ммм, так намного лучше (активное окно не перемещается), но поведение всё равно не корректное: в браузере при зажатом ALT обычно можно выделять текст, а с этим скриптом - он в таком случае не выделяется.
Если это нельзя как-то победить, то можно, конечно, в скрипте сменить хоткей Alt на RAlt, а в браузере для выделения текста использовать левый Alt.

5 (изменено: creature.ws, 2012-10-11 17:17:04)

Re: AHK: Исправить скрипт перемещения неактивных окон (hold alt&drag)

Поведение корректное. Ниже вариант подразумевающий активацию клавиши лишь если окно под курсором неактивно

#if !WinUnderMousePointerActive()
    !Lbutton::KDE_WinMove("Lbutton")
#if

WinUnderMousePointerActive()
{
    MouseGetPos,,, hWnd
    return WinActive("ahk_id" hWnd)
}

KDE_WinMove(sButton)
{
    if !GetKeyState(sButton, "P")
        Exit

    CoordMode, Mouse
    MouseGetPos, x1, y1, id
    WinExist("ahk_id" . id)

    WinGetClass, winClass
    if (winClass == "WorkerW" || winClass == "Progman")
        Exit

    WinGet, win, MinMax
    if (win)
        Exit

    SetWinDelay, 0
    WinGetPos, winX1, winY1
    while GetKeyState(sButton, "P")
    {
        MouseGetPos, x2, y2
        x2 -= x1, y2 -= y1, winX2 := winX1 + x2, winY2 := winY1 + y2
        WinMove,,, winx2, winY2
        Sleep 15
    }
}

6

Re: AHK: Исправить скрипт перемещения неактивных окон (hold alt&drag)

Спасибо огрррромнейшее!
Работает отлично.

7

Re: AHK: Исправить скрипт перемещения неактивных окон (hold alt&drag)

Drugoy пишет:

Может добавить это в коллекцию скриптов?

1. Может быть. Я не могу об этом судить.
2. Предлагать сие имеет смысл непосредственно здесь, в теме.
3. Пользоваться ссылкой «Сообщить модератору» стоит по прямому назначению.