1 (изменено: Malcev, 2021-10-09 17:15:03)

Тема: AHK: Тест гуи в портретном режиме монитора

Понадобилось написать гуи для портретного режима монитора.
Переворачивать монитор взад-вперед неохота - написал скрипт.
По f11 идет переключение режимов.
При нажатии esc переходит в режим альбома.

#SingleInstance, Force
OnExit, RemoveHook
Global prevX, prevY
VarSetCapacity(DEVMODE, 220, 0)
NumPut(220, DEVMODE, 68, "short")   ; dmSize
DllCall("EnumDisplaySettingsW", "ptr", 0, "int", -1, "ptr", &DEVMODE)
width := NumGet(DEVMODE, 172, "uint")
height := NumGet(DEVMODE, 176, "uint")

f11::
if !hHookMouse
{
   NumPut(width, DEVMODE, 176, "int")
   NumPut(height, DEVMODE, 172, "int")
   NumPut(DMDO_90 := 1, DEVMODE, 84, "int")   ; dmDisplayOrientation
   DllCall("ChangeDisplaySettingsW", "ptr", &DEVMODE, "uint", 0)
   hHookMouse := DllCall("SetWindowsHookEx", "int", WH_MOUSE_LL := 14, "ptr", RegisterCallback("WH_MOUSE_LL", "Fast"), "ptr", DllCall("GetModuleHandle", "uint", 0, "ptr"), "uint", 0, "ptr")
}
else
   GoSub, RemoveHook
return

esc::
GoSub, RemoveHook
return

RemoveHook:
if hHookMouse
{
   DllCall("UnhookWindowsHookEx", "ptr", hHookMouse)
   NumPut(width, DEVMODE, 172, "int")
   NumPut(height, DEVMODE, 176, "int")
   NumPut(DMDO_DEFAULT := 0, DEVMODE, 84, "int")   ; dmDisplayOrientation
   DllCall("ChangeDisplaySettingsW", "ptr", &DEVMODE, "uint", 0)
   prevX := prevY := hHookMouse := ""
}
if A_ExitReason
   ExitApp
return

WH_MOUSE_LL(nCode, wParam, lParam)
{
   Critical
   if !nCode && (wParam = 0x200)   ; WM_MOUSEMOVE
   {
      x := NumGet(lParam+0, 0, "int") ; x-coord
      y := NumGet(lParam+0, 4, "int") ; y-coord
      if (prevX = "")
         prevX := x
      if (prevY = "")
         prevY := y
      newX := prevX - y + prevY
      newY := prevY + x - prevX
      DllCall("SetCursorPos", "int", newX, "int", newY)
      VarSetCapacity(lpPoint, 8)
      DllCall("GetCursorPos", "ptr", &lpPoint)
      prevX := NumGet(lpPoint, 0, "int")
      prevY := NumGet(lpPoint, 4, "int")
      NumPut(newX, lParam+0, 0, "int")
      NumPut(newY, lParam+0, 4, "int")
      DllCall("CallNextHookEx", "ptr", 0, "int", nCode, "int", wParam, "ptr", lParam)
      return 1
   }
   else
      return DllCall("CallNextHookEx", "ptr", 0, "int", nCode, "int", wParam, "ptr", lParam) 
}

2

Re: AHK: Тест гуи в портретном режиме монитора

Интересная штука. А где на практике это бывает нужно?

3

Re: AHK: Тест гуи в портретном режиме монитора

Если вы имеете в виду где на практике бывает нужно вертикальное разрешение монитора, то имхо это зависит от вкусовых предпочтений.
Мне, например, на вертикальном удобнее читать книги.
А что касается этого скрипта, то меня попросили создать анимационный полноэкранный гуи для вертикальных мониторов.
И хотя мой текущий монитор можно физически повернуть на 90 градусов (предыдущий нельзя было), но мне не хочется постоянно его туда-сюда дергать.
Поэтому я и сделал скрипт для тестирования вертикальных полноэкранных гуи, на горизонтальных мониторах. Например, 1080x1920 гуи на 1920x1080 мониторе.

4

Re: AHK: Тест гуи в портретном режиме монитора

Интересно, почему нет системных настроек для мыши в портретном режиме. Я, по крайней мере, не нашёл.

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

5

Re: AHK: Тест гуи в портретном режиме монитора

А какие настройки ты имеешь в виду?

6

Re: AHK: Тест гуи в портретном режиме монитора

Чтобы курсор в портретном режиме двигался так, как у тебя сделано с помощью хука.

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

7

Re: AHK: Тест гуи в портретном режиме монитора

Да, я тоже не нашел.
Наверное, изменение движения мыши не предусмотрено.