[архив - Часть 2] AutoIt скрипты
-
Oldschool
Re: [архив - Часть 2] AutoIt скрипты
Ищу репетитора по AutoIt на пару - тройку уроков в Москве.
предложения в ПМ
предложения в ПМ
-
Creat0R
Re: [архив - Часть 2] AutoIt скрипты
Diamond,
Цитата:
Кто нибудь может объяснить подобное поведение?
Полагаю что это из за того, что фокус на себя берёт созданный элемент, и любое нажатиие клавиш посылается именно этому элементу, хотя WM_KEYDOWN как я понял, принимает события только от самого GUI (т.е только если не сфокусирован ни один элемент).
Я попробовал убрать фокус с элемента, но это не помагает (точнее фокус не убирается, баг?)...
Код:
Diamond,
Очень странно, но если создать элемент после GuiSetState(), то всё работает:
Код:
Цитата:
Кто нибудь может объяснить подобное поведение?
Полагаю что это из за того, что фокус на себя берёт созданный элемент, и любое нажатиие клавиш посылается именно этому элементу, хотя WM_KEYDOWN как я понял, принимает события только от самого GUI (т.е только если не сфокусирован ни один элемент).
Я попробовал убрать фокус с элемента, но это не помагает (точнее фокус не убирается, баг?)...
Код:
Код: Выделить всё
$BUTTON = GUICtrlCreateButton("Button",10,10,50,20)
GUICtrlSetState(-1, $GUI_NOFOCUS)Diamond,
Очень странно, но если создать элемент после GuiSetState(), то всё работает:
Код:
Код: Выделить всё
#include
Global Const $WM_KEYDOWN = 0x0101
$HWnd = GUICreate("KEYDOWN_TEST",400,300)
GUIRegisterMsg($WM_KEYDOWN, "Get_KeyDown")
GUISetState()
$BUTTON = GUICtrlCreateButton("Button",10,10,50,20)
While 1
$msg = GUIGetMsg()
Switch $msg
Case -3
Exit
EndSwitch
WEnd
Func Get_KeyDown($HWnd,$Command,$wParam,$lParam)
MsgBox(262144,"Код нажатой кнопки:", BitAND($wParam,0xFF))
EndFunc-
Diamond
Re: [архив - Часть 2] AutoIt скрипты
Creat0R,
Действительно, должны обрабатываться только те нажатия, которые посылаються в окно гуи.
А насчёт бага, если это даже и не баг, то использование $WM_KEYDOWN полностью теряет смысл... кому оно нужно если GUI будет пустым...
Кстати, я сначала тоже предположил что дело в фокусе или табуляции.
Цитата:
Очень странно, но если создать элемент после GuiSetState(), то всё работает
Действительно странно... а если по каким либо причинам придётся повторно использовать GUISetState() - то событие снова перестанет обрабатываться.
Действительно, должны обрабатываться только те нажатия, которые посылаються в окно гуи.
А насчёт бага, если это даже и не баг, то использование $WM_KEYDOWN полностью теряет смысл... кому оно нужно если GUI будет пустым...
Кстати, я сначала тоже предположил что дело в фокусе или табуляции.
Цитата:
Очень странно, но если создать элемент после GuiSetState(), то всё работает
Действительно странно... а если по каким либо причинам придётся повторно использовать GUISetState() - то событие снова перестанет обрабатываться.
-
Creat0R
Re: [архив - Часть 2] AutoIt скрипты
Diamond,
Цитата:
использование $WM_KEYDOWN полностью теряет смысл... кому оно нужно если GUI будет пустым...
См. пример в моём предыдущем посте, я запостил его почти сразу после первого, но они склеились
P.S
Может пойти попробовать репортануть о баге(?) с фокусом?
Цитата:
использование $WM_KEYDOWN полностью теряет смысл... кому оно нужно если GUI будет пустым...
См. пример в моём предыдущем посте, я запостил его почти сразу после первого, но они склеились

P.S
Может пойти попробовать репортануть о баге(?) с фокусом?

-
Diamond
Re: [архив - Часть 2] AutoIt скрипты
Creat0R,
А может быть дело совсем не в фокусе...?
Добавлено:
...имхо, дело не в фокусе, иначе это не работало бы ни до ни после GUISetState().
Репортануть то можно бы... правда у меня знания английского почти нулевые.
А может быть дело совсем не в фокусе...?
Добавлено:
...имхо, дело не в фокусе, иначе это не работало бы ни до ни после GUISetState().
Репортануть то можно бы... правда у меня знания английского почти нулевые.

-
Creat0R
Re: [архив - Часть 2] AutoIt скрипты
Diamond,
Цитата:
Репортануть то можно бы
Пока
) найдётся более правильное обьяснение, или даже решение.
Diamond,
Видимо не суждено это побороть:
Цитата AutoIt3 Help File:
Some controls consume internally specific Windows Message ID, so registrating them will have no effect, e.g; WM_CHAR, WM_KEYDOWN, WM_KEYUP are consumed by an edit control.

Цитата:
Репортануть то можно бы
Пока
оставил пост
в разделе по GUI, может у разработчиков (или опытных AutoIt-ГУРУ
) найдётся более правильное обьяснение, или даже решение.Diamond,
Видимо не суждено это побороть:
Цитата AutoIt3 Help File:
Some controls consume internally specific Windows Message ID, so registrating them will have no effect, e.g; WM_CHAR, WM_KEYDOWN, WM_KEYUP are consumed by an edit control.

-
Diamond
Re: [архив - Часть 2] AutoIt скрипты
Creat0R,
Цитата:
Пока оставил пост в разделе по GUI
Спасибо!
Вот ещё пример с колёсиком мыши и слайдером - наверное здесь тоже происходит "поглощение":
При изменении позиции слайдера колесом мыши, GUIGetMsg() не срабатывает, а загружать основной цикл постоянными запросами тоже не хочется. Вот как раз здесь-то и пригодилась бы $WM_MOUSEWHEEL - для того чтобы получать значение слайдера при повороте колеса мыши (если он в фокусе). Но увы... именно когда он в фокусе, событие $WM_MOUSEWHEEL перестаёт обрабатываться.
Код:
Цитата:
Пока оставил пост в разделе по GUI
Спасибо!
Вот ещё пример с колёсиком мыши и слайдером - наверное здесь тоже происходит "поглощение":
При изменении позиции слайдера колесом мыши, GUIGetMsg() не срабатывает, а загружать основной цикл постоянными запросами тоже не хочется. Вот как раз здесь-то и пригодилась бы $WM_MOUSEWHEEL - для того чтобы получать значение слайдера при повороте колеса мыши (если он в фокусе). Но увы... именно когда он в фокусе, событие $WM_MOUSEWHEEL перестаёт обрабатываться.
Код:
Код: Выделить всё
#include
$HWnd = GUICreate("MOUSEWHEEL_TEST",400,300)
$BUTTON = GUICtrlCreateButton("Get Value",10,10,70,20)
$SLIDER = GUICtrlCreateSlider(10,70,300,20)
$INPUT = GUICtrlCreateInput("0",10,100,30,18,BitOR($ES_READONLY,$ES_CENTER))
Global Const $WM_MOUSEWHEEL = 0x020A
GUIRegisterMsg($WM_MOUSEWHEEL,"Get_MouseWheel")
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
Case -3
Exit
Case $SLIDER
GUICtrlSetData($INPUT,GUICtrlRead($SLIDER))
Case $BUTTON
MsgBox(0,"Текущее значение слайдера:",GUICtrlRead($SLIDER))
EndSwitch
WEnd
Func Get_MouseWheel($HWnd,$Command,$wParam,$lParam)
Switch $wParam
Case 0x00780000 ; UP
Beep(100,40)
Case 0xFF880000 ; DOWN
Beep(80,40)
EndSwitch
EndFunc-
Creat0R
Re: [архив - Часть 2] AutoIt скрипты
Diamond,
Цитата:
загружать основной цикл постоянными запросами тоже не хочется. Вот как раз здесь-то и пригодилась бы $WM_MOUSEWHEEL
Очень кстати по поводу Slider, как раз сегодня на оф. форуме кто-то
Код:
И колёсико мышки работает, и обновляется в реальном времени
...
Аж самому не верится, я до сих пор сам то циклом пользовался
Цитата:
загружать основной цикл постоянными запросами тоже не хочется. Вот как раз здесь-то и пригодилась бы $WM_MOUSEWHEEL
Очень кстати по поводу Slider, как раз сегодня на оф. форуме кто-то
спросил про эту же функциональность
, я сначала тоже предложил решение с использованием главного цикла, но позже поискал в MSDN и нашёл более практичное решение:Код:
Код: Выделить всё
#include
Global Const $WM_HSCROLL = 0x0114
Global Const $WM_VSCROLL = 0x0115
$Gui = GuiCreate("Slider Update Demo", 250, 200)
GUIRegisterMsg($WM_HSCROLL, "WM_HVSCROLL")
GUIRegisterMsg($WM_VSCROLL, "WM_HVSCROLL")
$Vertical_Label = GUICtrlCreateLabel("Vertical Slider Read: 0", 20, 20, 200)
$Horizontal_Label = GUICtrlCreateLabel("Horizontal Slider Read: 0", 80, 120, 200)
$Vertical_Slider = GUICtrlCreateSlider(20, 50, 30, 120, BitOr($GUI_SS_DEFAULT_SLIDER, $TBS_VERT))
$Horizontal_Slider = GUICtrlCreateSlider(60, 150, 160, 30)
GUISetState()
While 1
$Msg = GUIGetMsg()
Switch $Msg
Case -3
Exit
EndSwitch
WEnd
Func WM_HVSCROLL($hWndGUI, $MsgID, $WParam, $LParam)
Switch $MsgID
Case 277
GUICtrlSetData($Vertical_Label, "Vertical Slider Read: " & GUICtrlRead($Vertical_Slider))
Case 276
GUICtrlSetData($Horizontal_Label, "Horizontal Slider Read: " & GUICtrlRead($Horizontal_Slider))
EndSwitch
EndFuncИ колёсико мышки работает, и обновляется в реальном времени
...Аж самому не верится, я до сих пор сам то циклом пользовался

-
Diamond
Re: [архив - Часть 2] AutoIt скрипты
Creat0R,
Да ты просто фокусник!
Вот так вот запросто взял и нашёл отличное решение. Спасибо!
Я поправил твою функцию, это позволит обрабатывать сколько угодно слайдеров.
Код:
Да ты просто фокусник!
Вот так вот запросто взял и нашёл отличное решение. Спасибо!Я поправил твою функцию, это позволит обрабатывать сколько угодно слайдеров.

Код:
Код: Выделить всё
Func WM_HVSCROLL($hWndGUI, $MsgID, $WParam, $LParam)
Switch $LParam
Case GUICtrlGetHandle($Vertical_Slider)
GUICtrlSetData($Vertical_Label, "Vertical Slider Read: " & GUICtrlRead($Vertical_Slider))
Case GUICtrlGetHandle($Horizontal_Slider)
GUICtrlSetData($Horizontal_Label, "Horizontal Slider Read: " & GUICtrlRead($Horizontal_Slider))
EndSwitch
EndFunc-
Creat0R
Re: [архив - Часть 2] AutoIt скрипты
Diamond,
Цитата:
Я поправил твою функцию, это позволит обрабатывать сколько угодно слайдеров
Класс! Спасибо.
Цитата:
Я поправил твою функцию, это позволит обрабатывать сколько угодно слайдеров
Класс! Спасибо.