Сообщение Re[6]: Сменна фокуса ввода в новигационном сообщении TVN_SEL от 03.05.2023 11:16
Изменено 03.05.2023 11:34 Melamed
Re[6]: Сменна фокуса ввода в новигационном сообщении TVN_SEL
Здравствуйте, Carc, Вы писали:
C>Здравствуйте, Melamed, Вы писали:
C>1) Ну а GetWindowThreadProcessId(HWND обработчика TVN_SELCHANGED) == GetWindowThreadProcessId(hwnd куда бросаем фокус)?
C>В одном потоке или нет?
Окна сделаны в одном потоке. Проверено в Spy++.
C>2) Что возвращает SetFocus()? Что говорит ::IsWindow(Hwnd куда фокус)?
SetFocus возвращает не нулевое значения.
После вызова SetFocus() вставил следующую строку
Исключения нет. Значит фокус получает окно, которое мне нужно.
C>3) В оконной процедуре (HWND куда фокус) приходят всякие WM_ACTIVATE? WM_KILLFOCUS в оконную процедуру дерева приходит?
Поставил обработчик сообщения WM_KILLFOKUS окно, куда передаю фокус (Благо этот контроль я сам разрабатываю). Он вызывается. Значит окно получает фокус, и почему-то его тут же отдает. По кадру стека понял, что это происходит не в моем коде, а в системном.
C>Проще говоря:
C>а) окна дерева и куда_фокус (прости меня за русский, хаспади
) в одном потоке или нет?
C>б) Фокус с дерева уходит ли? И если да, то доходит ли он до таргет-окна?
C>Я б «раскопки» начинал в таком направлении.
C>Можно, конечно, еще попробовать ReleaseCapture позвать перед SetFocus, но имхо это не решение. Надо в происходящем разбираться, ну и далее в причинах. Ибо какое-то странное поведение.
C>Не должно так быть. А то как-то получается, что "пищит-мигает, куда известно не попападает"... А должно
C>Здравствуйте, Melamed, Вы писали:
C>1) Ну а GetWindowThreadProcessId(HWND обработчика TVN_SELCHANGED) == GetWindowThreadProcessId(hwnd куда бросаем фокус)?
C>В одном потоке или нет?
Окна сделаны в одном потоке. Проверено в Spy++.
C>2) Что возвращает SetFocus()? Что говорит ::IsWindow(Hwnd куда фокус)?
SetFocus возвращает не нулевое значения.
После вызова SetFocus() вставил следующую строку
Check_Win(SetFocus(m_hwndImageTable));
assert(GetFocus() == m_hwndImageTable);Исключения нет. Значит фокус получает окно, которое мне нужно.
C>3) В оконной процедуре (HWND куда фокус) приходят всякие WM_ACTIVATE? WM_KILLFOCUS в оконную процедуру дерева приходит?
Поставил обработчик сообщения WM_KILLFOKUS окно, куда передаю фокус (Благо этот контроль я сам разрабатываю). Он вызывается. Значит окно получает фокус, и почему-то его тут же отдает. По кадру стека понял, что это происходит не в моем коде, а в системном.
C>Проще говоря:
C>а) окна дерева и куда_фокус (прости меня за русский, хаспади
C>б) Фокус с дерева уходит ли? И если да, то доходит ли он до таргет-окна?
C>Я б «раскопки» начинал в таком направлении.
C>Можно, конечно, еще попробовать ReleaseCapture позвать перед SetFocus, но имхо это не решение. Надо в происходящем разбираться, ну и далее в причинах. Ибо какое-то странное поведение.
C>Не должно так быть. А то как-то получается, что "пищит-мигает, куда известно не попападает"... А должно
Re[6]: Сменна фокуса ввода в новигационном сообщении TVN_SEL
Здравствуйте, Carc, Вы писали:
C>Здравствуйте, Melamed, Вы писали:
C>1) Ну а GetWindowThreadProcessId(HWND обработчика TVN_SELCHANGED) == GetWindowThreadProcessId(hwnd куда бросаем фокус)?
C>В одном потоке или нет?
Окна сделаны в одном потоке. Проверено в Spy++.
C>2) Что возвращает SetFocus()? Что говорит ::IsWindow(Hwnd куда фокус)?
SetFocus возвращает не нулевое значения.
После вызова SetFocus() вставил следующую строку
Исключения нет. Значит фокус получает окно, которое мне нужно.
C>3) В оконной процедуре (HWND куда фокус) приходят всякие WM_ACTIVATE? WM_KILLFOCUS в оконную процедуру дерева приходит?
Поставил обработчик сообщения WM_KILLFOKUS окно, куда передаю фокус (Благо этот контроль я сам разрабатываю). Он вызывается. Значит окно получает фокус, и почему-то его тут же отдает. По кадру стека понял, что это происходит не в моем коде, а в системном.
Самое интересное в сообщении WM_LButtonDown окна, которому передается фокус, функция SetFocus() работает безупречно.
C>Проще говоря:
C>а) окна дерева и куда_фокус (прости меня за русский, хаспади
) в одном потоке или нет?
C>б) Фокус с дерева уходит ли? И если да, то доходит ли он до таргет-окна?
C>Я б «раскопки» начинал в таком направлении.
C>Можно, конечно, еще попробовать ReleaseCapture позвать перед SetFocus, но имхо это не решение. Надо в происходящем разбираться, ну и далее в причинах. Ибо какое-то странное поведение.
C>Не должно так быть. А то как-то получается, что "пищит-мигает, куда известно не попападает"... А должно
C>Здравствуйте, Melamed, Вы писали:
C>1) Ну а GetWindowThreadProcessId(HWND обработчика TVN_SELCHANGED) == GetWindowThreadProcessId(hwnd куда бросаем фокус)?
C>В одном потоке или нет?
Окна сделаны в одном потоке. Проверено в Spy++.
C>2) Что возвращает SetFocus()? Что говорит ::IsWindow(Hwnd куда фокус)?
SetFocus возвращает не нулевое значения.
После вызова SetFocus() вставил следующую строку
Check_Win(SetFocus(m_hwndImageTable));
assert(GetFocus() == m_hwndImageTable);Исключения нет. Значит фокус получает окно, которое мне нужно.
C>3) В оконной процедуре (HWND куда фокус) приходят всякие WM_ACTIVATE? WM_KILLFOCUS в оконную процедуру дерева приходит?
Поставил обработчик сообщения WM_KILLFOKUS окно, куда передаю фокус (Благо этот контроль я сам разрабатываю). Он вызывается. Значит окно получает фокус, и почему-то его тут же отдает. По кадру стека понял, что это происходит не в моем коде, а в системном.
Самое интересное в сообщении WM_LButtonDown окна, которому передается фокус, функция SetFocus() работает безупречно.
C>Проще говоря:
C>а) окна дерева и куда_фокус (прости меня за русский, хаспади
C>б) Фокус с дерева уходит ли? И если да, то доходит ли он до таргет-окна?
C>Я б «раскопки» начинал в таком направлении.
C>Можно, конечно, еще попробовать ReleaseCapture позвать перед SetFocus, но имхо это не решение. Надо в происходящем разбираться, ну и далее в причинах. Ибо какое-то странное поведение.
C>Не должно так быть. А то как-то получается, что "пищит-мигает, куда известно не попападает"... А должно