Что нового

Видимое содержимое невидимого окна

Автор
M

mathem

Новичок
Сообщения
68
Репутация
0
Давайте вернемся к операции BitAND. Вот здесь мне подсказали решение одной из моих проблем. Да, это мне помогло, все нормально, спасибо. Но для меня осталось полной загадкой, как, почему, например, BitAND от тех операндов, которые там используются, возвращает координату х, насколько я понимаю, окна. Не могли бы вы мне прояснить этот момент?
 

InnI

AutoIT Гуру
Сообщения
4,982
Репутация
1,460
WM_MOVE — сообщение, которое отправляется после перемещения окна в новое положение.
Вместе с этим сообщением функция окна получает новые координаты внутренней области окна:
LOWORD(lParam) — новая X-координата верхнего левого угла внутренней области окна.
HIWORD(lParam) — новая Y-координата верхнего левого угла внутренней области окна.


Таким образом, из lParam нужно выделить младшее слово для X и старшее слово для Y.
Код:
$lParam = 0x01B2032B ; HiWord 01B2, LoWord 032B

; =============================================

; HiWord           LoWord
; 0000000110110010 0000001100101011 (0x01B2032B)
; 0000000000000000 1111111111111111 (0xFFFF)
; --------------------------------- (BitAND)
; 0000000000000000 0000001100101011 (0x032B)

$LoWord = BitAND($lParam, 0xFFFF)
ConsoleWrite(Hex($LoWord, 4) & @CRLF) ; 032B

; =============================================

; HiWord           LoWord
; 0000000110110010 0000001100101011 (0x01B2032B)
; --------------------------------- (BitShift 16)
; 0000000000000000 0000000110110010 (0x01B2)

$HiWord = BitShift($lParam, 16)
ConsoleWrite(Hex($HiWord, 4) & @CRLF) ; 01B2
 
Автор
M

mathem

Новичок
Сообщения
68
Репутация
0
Код:
$lParam = 0x01B2032B
Да, но в том-то коде переменная $lParam не определена. А так в части применения битовых операций,по крайней мере, в автоите все стало ясно.
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
640
Репутация
80
Но для меня осталось полной загадкой, как, почему, например, BitAND от тех операндов, которые там используются, возвращает координату х, насколько я понимаю, окна.
Нужно читать документацию чтобы не было загадкой https://learn.microsoft.com/ru-ru/windows/win32/winmsg/wm-move
lParam

Координаты x и y верхнего левого угла клиентской области окна. Слово с низким порядком содержит координату x, а слово высокого порядка содержит координату y.
Слово в данном случае означает 2 байта.
Нужно из переменной выделить 2 первых байта и следующих за ними 2 байта. В коде это сделано функциями BitAND и BitShift.

Да, но в том-то коде переменная $lParam не определена.
14 строка
Код:
func MOVE($hWnd, $Msg, $wParam, $lParam)
Видите переменную $lParam?
 

InnI

AutoIT Гуру
Сообщения
4,982
Репутация
1,460
переменная $lParam не определена
Значение этой переменной передаёт сама Windows когда отправляет окну сообщение. Посмотрите справку по функции
Код:
GUIRegisterMsg()

Отправка окну сообщения
Код:
_SendMessage()
 
Автор
M

mathem

Новичок
Сообщения
68
Репутация
0
Нужно читать документацию чтобы не было загадкой https://learn.microsoft.com/ru-ru/windows/win32/winmsg/wm-move
Видите переменную $lParam?
Значение этой переменной передаёт сама Windows когда отправляет окну сообщение.
А, так wParam и lParam - это параметры, определенные в самой винде, а $wParam и $lParam - это обращение к этим параметрам системы из автоита. Так?
Сообщение автоматически объединено:

Хотя вот тут первые 2 аргумента функции, регистрируемой на движение окна, называются $hWnd, и $Msg, а вот здесь - уже $hWndGUI и $MsgID. Или во второй ссылки опечатка. Или смысл параметров пользовательской функции для известных кодов (ID) сообщений Windows (WM_MSG) определяется их местом в перечислении аргументов при определении этой функции?
Сообщение автоматически объединено:

А существует ли сообщение Windows (WM_MSG) на изменение языка ввода в системе вообще? Не в активном окне, а в системе вообще?
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
640
Репутация
80
А, так wParam и lParam - это параметры, определенные в самой винде, а $wParam и $lParam - это обращение к этим параметрам системы из автоита. Так?
Нужно начать изучение с самых основ https://autoit-script.ru/docs/intro/lang_variables.htm
Хотя вот тут первые 2 аргумента функции, регистрируемой на движение окна, называются $hWnd, и $Msg, а вот здесь - уже $hWndGUI и $MsgID. Или во второй ссылки опечатка.
Переменные можно назвать как захочется. Их имена нужны для нас. Интерпретатору autoit все равно.
Или смысл параметров пользовательской функции для известных кодов (ID) сообщений Windows (WM_MSG) определяется их местом в перечислении аргументов при определении этой функции?
Да, важна последовательность аргументов, а имена могут быть любыми.
А существует ли сообщение Windows (WM_MSG) на изменение языка ввода в системе вообще? Не в активном окне, а в системе вообще?
Язык ввода запоминается для каждого процесса.
 
Автор
M

mathem

Новичок
Сообщения
68
Репутация
0
Это я знаю. Но знание этого не дает ответ на процитированный вами мой вопрос.
Сообщение автоматически объединено:

Да, важна последовательность аргументов, а имена могут быть любыми.
Спасибо, вы очень помогли, устранив еще одну возникшую развилку в моем понимании.
Сообщение автоматически объединено:

Вам нужно экспериментировать
Да, важна последовательность аргументов, а имена могут быть любыми.
Я, ради интереса, запустил следующий код;
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

GUICreate("", 300, 200)
GUIRegisterMsg($WM_MOVE, "MOVE")
GUISetState()

While 1
    if GUIGetMsg() = $GUI_EVENT_CLOSE Then
        ExitLoop
    Endif
WEnd

func MOVE($prosto_parametr_1, $prosto_parametr_2, $prosto_parametr_3, $prosto_parametr_4)
    Local $x = BitAND($prosto_parametr_4, 0xFFFF)
    Local $y = BitShift($prosto_parametr_4, 16)
    ToolTip($x & ", " & $y & @LF & $prosto_parametr_4, $x+100, $y+100)
EndFunc

и переводил с помощью виндовского калькулятора в режиме "Программист" последние и первые 4 цифры шестнадцатиричного (для опускания промежуточного перевода в двоичную систему исчисления) числа, выводимого в тултипе на последней строке, в десятичную систему при различных положениях созданного окна. Да, действительно, эти переводы совпадали соответственно с первым и вторым числом, выводимыми в первой строке тултипа.
Язык ввода запоминается для каждого процесса.
Смотрите. Висит окно, созданное автоитом, в этом окне создана надпись. Вместе с тем открыт блокнот. В блокноте время от времени меняется язык ввода. Можно ли сделать так, чтобы текст в надписи в окне автоита менялся именно с изменением языка ввода в блокноте, а не конструкций, наподобие
Код:
...............................
Const $LANG_RUS = 0x0419 ;Русский
Const $LANG_ENG = 0x0409 ;Англиский

AdlibRegister("tekushij_jazyk", 1000)
................................................
Func tekushij_jazyk()
$GetLang = '0x' & Hex(BitAND(_WinAPI_GetKeyboardLayout(WinGetHandle('[ACTIVE]')), 0xFFFF), 4)
Select
Case  $GetLang = $LANG_RUS
GUICtrlSetData($Label_1, 'Рус')
Case $GetLang = $LANG_ENG
GUICtrlSetData($Label_1, 'Eng')
EndSelect
EndFunc
....................................................

? Извините, если выразился коряво.
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
640
Репутация
80
Можно ли сделать так, чтобы текст в надписи в окне автоита менялся именно с изменением языка ввода в блокноте
Следите за окном блокнота и определяйте язык ввода.
В WinGetHandle вместо "[ACTIVE]" напишите "блокнот".
 
Автор
M

mathem

Новичок
Сообщения
68
Репутация
0
Следите за окном блокнота
Вот про это- то я и хочу узнать. Я знаю, что следить можно в бесконечном цикле, следить можно так:
, но мне кажется, что все эти способы неоправданно грузят процессор. Пусть несильно, но неоправданно. Мне кажется, нагрузку можно еще уменьшить. Прав ли я?
 
Верх