Сообщение 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, но имхо это не решение. Надо в происходящем разбираться, ну и далее в причинах. Ибо какое-то странное поведение.
Не должно так быть. А то как-то получается, что "пищит-мигает, куда известно не попападает"... А должно
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, но имхо это не решение. Надо в происходящем разбираться, ну и далее в причинах. Ибо какое-то странное поведение.
Не должно так быть. А то как-то получается, что "пищит-мигает, куда известно не попападает"... А должно
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, но имхо это не решение. Надо в происходящем разбираться, ну и далее в причинах. Ибо какое-то странное поведение.
Не должно так быть. А то как-то получается, что "пищит-мигает, куда известно не попападает"... А должно