26

Re: AHK, GUI: Как вывести по верх всех окон изображение.

serzh82saratov пишет:

Я бы ещё на HID попробовал отследить,

Хотя тут палка о двух концах. С хуком без таймера - гарантия что окно будет всегда рядом с курсором, но просадки повлияют на соответствие движений мышью и курсора. И случается что с хуком (тем более мышиным) происходят затыки, вплоть до блокировки ввода.
С HID просадки повлияют на соответствие позиции курсора и окна.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

27

Re: AHK, GUI: Как вывести по верх всех окон изображение.

Извиняюсь, без констант, и определения что сообщение - движение мышью.

#SingleInstance, Force
#NoEnv
SetBatchLines, -1
CoordMode, Mouse, Screen 

#Include <GDIP_All>

If !pToken := Gdip_Startup()
{
	MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
	ExitApp
}
OnExit, Exit

Width := 20, Height := 20
WS_EX_LAYERED := 0x80000, WS_EX_TRANSPARENT := 0x20
Gui, New, % "-Caption +AlwaysOnTop +ToolWindow +hwndhGui +E" . Format("{:#x}", WS_EX_LAYERED|WS_EX_TRANSPARENT)
Gui, Show, NA
hwnd1 := hGui 

hbm := CreateDIBSection(Width, Height)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
G := Gdip_GraphicsFromHDC(hdc)
Gdip_SetSmoothingMode(G, 4)
pBrush := Gdip_BrushCreateSolid(0x70ff0000)
Gdip_FillEllipse(G, pBrush, 0, 0, 20, 20)
Gdip_DeleteBrush(pBrush) 
Gdip_DeleteGraphics(G)
DeleteObject(hbm)  
DeleteObject(obm)  

OnMessage(0x00FF, "InputHandler")
RegisterRawInputDevices(1, 2) 
Return 

Esc::
Exit: 
	DeleteDC(hdc)
	Gdip_Shutdown(pToken)
	ExitApp
	
InputHandler(wParam, lParam) { 
	Global
	MouseGetPos, xx, yy 
	UpdateLayeredWindow(hwnd1, hdc, xx, yy, Width, Height) 
	; Gui, % hwnd1 ": +AlwaysOnTop"
}

RegisterRawInputDevices(usagePage, usage) {
    static RIDEV_INPUTSINK := 0x00000100
    VarSetCapacity(rawDevice, 8 + A_PtrSize)
    NumPut(usagePage,       rawDevice, 0, "UShort")
    NumPut(usage,           rawDevice, 2, "UShort")
    NumPut(RIDEV_INPUTSINK, rawDevice, 4, "UInt")
    NumPut(A_ScriptHWND,    rawDevice, 8, "UPtr")

    if !DllCall("RegisterRawInputDevices"
        , "Ptr", &rawDevice
        , "UInt", 1
        , "UInt", 8 + A_PtrSize)
    {
        throw "Failed to register for HID Device"
    }
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

28 (изменено: KusochekDobra, 2019-04-10 19:41:03)

Re: AHK, GUI: Как вывести по верх всех окон изображение.

Последний вариант отлично работает. Спасибо за хороший пример!