1

Тема: AHK: Установить поверх всех окон в Windows 10 с помощью SetWindowBand

Вот ссылка на этот api, работа очень хорошего реверс-инженера ADeltaX.
https://blog.adeltax.com/window-z-order-in-windows-10/
Чтобы вызвать SetWindowBand, нам нужно заинжектить dll в explorer.exe, установить хук на SetWindowBand и показать стартовое меню.
Вот скрипт, который инжектит autohotkey.dll и устанавливает хук с помощью minhook.dll
Нужно скачать minhook враппер от tmplinshi.
https://github.com/tmplinshi/MinHook-AHK
И запустить следующий код из папки с примерами.
Нажатие f11 установит самый высокий window band в активное окно, равный osk или окну лупы.

SetWorkingDir %A_ScriptDir%
#NoEnv
#Persistent
#SingleInstance Force
if (A_Is64bitOS && A_PtrSize = 4)
{
   Run, %A_AhkPath%\..\AutoHotkeyU64.exe "%A_ScriptFullPath%", %A_ScriptDir%
   ExitApp
}

f11::
ourHwnd := WinExist("A")
ourBand := 2   ; ZBID_UIACCESS

code =
(LTrim
   SetWorkingDir, %A_ScriptDir%
   #Include %A_ScriptDir%\Lib\MinHook.ahk
   address_SetWindowBand := DllCall("GetProcAddress", Ptr, DllCall("GetModuleHandle", Str, "user32", "Ptr"), AStr, "SetWindowBand", "Ptr")
   hook1 := New MinHook("", address_SetWindowBand, "SetWindowBand_Hook")
   hook1.Enable()
   send {LWin}
   return

   SetWindowBand_Hook(hWnd, hwndInsertAfter, dwBand)
   {
      global hook1
      return DllCall(hook1.original, "ptr", %ourHwnd%, "ptr", 0, "uint", %ourBand%)
   }
)

Process, Exist, explorer.exe
pid := ErrorLevel
dllFile := FileExist("AutoHotkeyMini.dll") ? A_ScriptDir "\AutoHotkeyMini.dll"
          : (A_PtrSize = 8)                  ? A_ScriptDir "\ahkDll\x64\AutoHotkeyMini.dll"
          : A_ScriptDir "\ahkDll\x32\AutoHotkeyMini.dll"
rThread := InjectAhkDll(pid, dllFile, "")
rThread.Exec(code)
AppVisibility := ComObjCreate(CLSID_AppVisibility := "{7E5FE3D9-985F-4908-91F9-EE19F9FD1514}", IID_IAppVisibility := "{2246EA2D-CAEA-4444-A3C4-6DE827E44313}")
loop
{
   if (DllCall(NumGet(NumGet(AppVisibility+0)+4*A_PtrSize), "Ptr", AppVisibility, "Int*", fVisible) >= 0)
   {
      if (fVisible = 1)
         break
   }
   sleep 10
}
send {LWin}
loop
{
   if (DllCall("GetWindowBand", "ptr", ourHwnd, "uint*", pdwBand) = 1)
   {
      if (pdwBand = ourBand)
         break
   }
   sleep 10
}
rThread:=""
return

2

Re: AHK: Установить поверх всех окон в Windows 10 с помощью SetWindowBand

Malcev пишет:

работа очень хорошего реверс-инженера

Да, приятно, когда всё простым языком объясняется. Жаль, что пока негусто у него контента.

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