| View previous topic :: View next topic |
| Author |
Message |
AkulaBig
Joined: 03 Dec 2008 Posts: 601
|
(Separately) Posted: Tue Sep 22, 2026 22:31 Post subject: |
|
|
| Orion9 wrote: | | Вы бы гифку записали, а то не понятно о чем речь. |
Я разобрался, но там все достаточно печально и кажется корректно не решаемо. Вот такой код я прописал где требуется обновление ПИ:
| Code: | # Обновляем текущую панель инструментов для смены иконки
# Updating current toolbar to change the icon
SendMessage(AUTORUN_TCHANDLE, 11, 0, 0)
SendCommand cm_ReloadBarIcons
# Sleep(auX64 ? 0 : 10)
SendMessage(AUTORUN_TCHANDLE, 11, 1, 0)
WinRedraw(1) |
Но теперь надо и пользовательские команды ТС через Авторан переделывать. Так как любая команда cm_ReloadBarIcons вызывает дерганье на ТС32 Вин11.
Дак вот, почему я в унынии. Видите у меня закомментирована команда Слип? А без нее в ТС32 все равно есть небольшое подергивание. А с ней подергивания ПИ нет совсем, как в ТС64, но дергается иконка в трее То-есть избавится полностью от подергивания не получится.
Поэтому вроде и ни к чему возиться с гифкой. Тем более увидеть подергивание очень просто. Выполните команду cm_ReloadBarIcons в обоих разрядностях через командную строку ТС. |
|
| Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 1254
|
(Separately) Posted: Wed Sep 23, 2026 13:40 Post subject: |
|
|
AkulaBig
Продолжил общаться с болваном. Можно еще через PostMessage сделать, о чем сразу не подумал
 Hidden text Для отправки комбинации Ctrl + Shift + Левый клик мыши в конкретное фоновое окно через PostMessage не нужно отправлять нажатия клавиш Ctrl и Shift по отдельности.
В Win32 API клики мыши обрабатывают модификаторы гораздо проще: в сообщение WM_LBUTTONDOWN передается специальная битовая маска, которая сообщает окну, что в момент клика клавиатурные клавиши Ctrl и Shift уже были зажаты.
Вот готовый и чистый код на AutoHotkey v2:
| Code: | #Requires AutoHotkey v2.0
; Пример: по нажатию F2 отправляем Ctrl+Shift+Клик в окно Блокнота по координатам X:300, Y:200
F2::DllPostCtrlShiftClick(WinExist("ahk_exe notepad.exe"), 300, 200)
/**
* Симулирует комбинацию Ctrl + Shift + Левый клик мыши в фоновом окне
* @param {Integer} hwnd - Дескриптор (HWND) целевого окна
* @param {Integer} x - Координата X внутри окна (в пикселях)
* @param {Integer} y - Координата Y внутри окна (в пикселях)
*/
DllPostCtrlShiftClick(hwnd, x, y) {
if (!hwnd)
return
; Константы сообщений мыши
static WM_LBUTTONDOWN := 0x0201
static WM_LBUTTONUP := 0x0202
; Битовые маски модификаторов для wParam
static MK_LBUTTON := 0x0001
static MK_CONTROL := 0x0008
static MK_SHIFT := 0x0004
; Объединяем флаги для нажатия (ЛКМ + Ctrl + Shift)
wParamDown := MK_LBUTTON | MK_CONTROL | MK_SHIFT
; Объединяем флаги для отжатия (только Ctrl + Shift, так как ЛКМ уже отпущена)
wParamUp := MK_CONTROL | MK_SHIFT
; Упаковываем координаты X и Y в один 32-битный параметр lParam
; Y уходит в старшие 16 бит (сдвиг << 16), X остается в младших 16 битах
lParam := (y << 16) | (x & 0xFFFF)
; 1. Посылаем нажатие ЛКМ с зажатыми Ctrl и Shift
DllCall("user32\PostMessage", "Ptr", hwnd, "UInt", WM_LBUTTONDOWN, "Ptr", wParamDown, "Ptr", lParam)
Sleep(30) ; Короткая пауза, чтобы окно успело зафиксировать клик
; 2. Посылаем отжатие ЛКМ
DllCall("user32\PostMessage", "Ptr", hwnd, "UInt", WM_LBUTTONUP, "Ptr", wParamUp, "Ptr", lParam)
}
|
## Как это работает:
1. Флаги wParam: Вместо того чтобы «заставлять» операционную систему думать, что пользователь нажал физические клавиши, мы напрямую передаем окну готовый статус: MK_CONTROL | MK_SHIFT. Окно считывает этот параметр и сразу обрабатывает событие как комплексную комбинацию.
2. Координаты lParam: Важно помнить, что при использовании PostMessage координаты X и Y отсчитываются от левого верхнего угла клиентской области самого окна, а не от экрана. То есть 0, 0 — это самый крайний левый верхний пиксель внутри выбранной программы.
Но из-за того, что lParam в сообщении указывает координаты клиентской области, реализация на Autorun немного громоздкая и, возможно, не везде будет уместна. Т.е. вместо
| Code: | SendLCtrlViaDll()
Sleep(10)
MouseClick()
Sleep(10)
SendLCtrlViaDll("up") |
в моем случае будет
| Code: | Local x, y
MouseGetPos("x","y")
Local hWnd = WinFromPoint(x,y)
Static buf = Buffer(8) # POINT
buf.Zero()
buf.SetNum(0, "long", x, "long", y)
DllCall("ScreenToClient", "hwnd", hWnd, "ptr", buf.ptr)
x = buf.GetNum(0)
y = buf.GetNum(4)
Local MousePos = MakeInt(x,y)
PostMessage(hWnd, 0x0201, 0x0008, MousePos)
PostMessage(hWnd, 0x0202, 0x0008, MousePos) |
Но зато слип не нужен (у меня и так работает), да и сама возможность интересная, может кому пригодится.
Ну я понял теперь о чем вы говорите. Это старая проблема. Лечится она (по крайне мере у меня) через WinRedraw(2). Полная версия примерно такая. Не знаю поможет вам или нет, но других вариантов по сути нет. Иконка на панели задач будет исчезать и появляться.
| Code: | SendMessage(AUTORUN_TCHANDLE, 11, 0, 0)
SendCommand(2901, 0, 1) #cm_VisButtonBar
SendCommand(2901, 0, 1) #cm_VisButtonBar
Sleep(10)
SendMessage(AUTORUN_TCHANDLE, 11, 1, 0)
WinRedraw(2) |
|
|
| Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 601
|
(Separately) Posted: Wed Sep 23, 2026 19:30 Post subject: |
|
|
| Orion9 wrote: | | Ну я понял теперь о чем вы говорите. Это старая проблема. |
Это проблема ТС. Так что до конца нерешаемая. Сейчас более-менее приемлемый вариант. В коде на Авторан я везде так прописал. Но и в командах пользователя ТС, которые никак не связаны с Авторан, работает также с подергиванием. Получается их надо переписывать с использованием Авторан. Чет желания нет. Как и писать Гислеру.
| Orion9 wrote: | | в моем случае будет |
Я уже запутался. Это замена ControlSetMouseAction /L /K:C /K:S 0 "CompareToolShowMenu"? К чему этот код? |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|