Информация об изменениях

Сообщение Re[5]: Сменна фокуса ввода в новигационном сообщении TVN_SEL от 01.05.2023 13:53

Изменено 01.05.2023 13:55 Carc

Re[5]: Сменна фокуса ввода в новигационном сообщении TVN_SEL
Здравствуйте, Melamed, Вы писали:

M>Здравствуйте, Carc, Вы писали:


C>>В TVN_SELCHANGED как получается? С клавиатуры или мышом? (NMTREEVIEW::action ?) Вообще говоря SetFocus должна работать, если m_hwndImageTable для SetFocus работает в том же потоке, что и TreeView.


M>Сooбщение TVN_SELCHANGED получается с клавиатуры или мышью без разницы.

В общем случае должно быть без разницы...

M>Есть подозрение, так часть сообщения ITM_FILLFILEBYMASK выполняется в фоновом потоке и во время ее выполнения выводится диалоговое окно, показывающее ход ее выполнения, то не исключено, что из-за этого.

1) Ну а GetWindowThreadProcessId(HWND обработчика TVN_SELCHANGED) == GetWindowThreadProcessId(hwnd куда бросаем фокус)?
В одном потоке или нет?

2) Что возвращает SetFocus()? Что говорит ::IsWindow(Hwnd куда фокус)?

3) В оконной процедуре (HWND куда фокус) приходят всякие WM_ACTIVATE? WM_KILLFOCUS в оконную процедуру дерева приходит?

Проще говоря:
а) окна дерева и куда_фокус (прости меня за русский, хаспади ) в одном потоке или нет?
б) Фокус с дерева уходит ли? И если да, то доходит ли он таргет-окна?
Я б «раскопки» начинал в таком направлении.

Можно, конечно, еще попробовать ReleaseCapture позвать перед SetFocus, но имхо это не решение. Надо в происходящем разбираться, ну и далее в причинах. Ибо какое-то странное поведение.
Не должно так быть. А то как-то получается, что "пищит-мигает, куда известно не попападает"... А должно
Re[5]: Сменна фокуса ввода в новигационном сообщении TVN_SEL
Здравствуйте, Melamed, Вы писали:

M>Здравствуйте, Carc, Вы писали:


C>>В TVN_SELCHANGED как получается? С клавиатуры или мышом? (NMTREEVIEW::action ?) Вообще говоря SetFocus должна работать, если m_hwndImageTable для SetFocus работает в том же потоке, что и TreeView.


M>Сooбщение TVN_SELCHANGED получается с клавиатуры или мышью без разницы.

В общем случае должно быть без разницы...

M>Есть подозрение, так часть сообщения ITM_FILLFILEBYMASK выполняется в фоновом потоке и во время ее выполнения выводится диалоговое окно, показывающее ход ее выполнения, то не исключено, что из-за этого.

1) Ну а GetWindowThreadProcessId(HWND обработчика TVN_SELCHANGED) == GetWindowThreadProcessId(hwnd куда бросаем фокус)?
В одном потоке или нет?

2) Что возвращает SetFocus()? Что говорит ::IsWindow(Hwnd куда фокус)?

3) В оконной процедуре (HWND куда фокус) приходят всякие WM_ACTIVATE? WM_KILLFOCUS в оконную процедуру дерева приходит?

Проще говоря:
а) окна дерева и куда_фокус (прости меня за русский, хаспади ) в одном потоке или нет?
б) Фокус с дерева уходит ли? И если да, то доходит ли он до таргет-окна?
Я б «раскопки» начинал в таком направлении.

Можно, конечно, еще попробовать ReleaseCapture позвать перед SetFocus, но имхо это не решение. Надо в происходящем разбираться, ну и далее в причинах. Ибо какое-то странное поведение.
Не должно так быть. А то как-то получается, что "пищит-мигает, куда известно не попападает"... А должно