Я создал несколько кнопок (окон) в главном окне, но вкладки и клавиши со стрелками не работают. Мое исследование показало, что для C++ использование IsDialogMessage в пересылке сообщений создает обход TranslateMessage/DispatchMessage следующим образом, чтобы обеспечить эту функциональность:
while(GetMessage(&Msg, NULL, 0, 0))
{
if(!IsDialogMessage(g_hToolbar, &Msg))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
Однако я использую python и модуль win32gui для CreateWindows и не могу понять, как обойти обычный захват сообщений, чтобы обеспечить естественную работу с клавиатурой. Мой код похож на этот:
from win32gui import *
from win32con import *
window_class = WNDCLASS()
hinst = window_class.hInstance = GetModuleHandle(None)
window_class.lpszClassName = 'ClassName'
window_class.style = CS_VREDRAW | CS_HREDRAW
window_class.hCursor = LoadCursor(0, IDC_ARROW)
window_class.hbrBackground = COLOR_WINDOW
window_class.lpfnWndProc = {}
classAtom = RegisterClass(window_class)
hwnd = CreateWindow(classAtom, "", WS_VISIBLE | WS_OVERLAPPED | WS_CAPTION
| WS_SYSMENU | WS_MINIMIZEBOX | WS_EX_TOPMOST | WS_CLIPSIBLINGS,
0, 0, 140, 100, 0, 0, GetModuleHandle(None), None)
btn1_hwnd = CreateWindow("Button", "btn 1", WS_GROUP | WS_TABSTOP | WS_VISIBLE
| WS_CHILD | BS_DEFPUSHBUTTON | WS_CLIPSIBLINGS,
10, 10, 100, 20, hwnd, 0, GetModuleHandle(None), None)
btn2_hwnd = CreateWindow("Button", "btn 2", WS_GROUP | WS_TABSTOP | WS_VISIBLE
| WS_CHILD | BS_DEFPUSHBUTTON | WS_CLIPSIBLINGS,
10, 40, 100, 20, hwnd, 0, GetModuleHandle(None), None)
UpdateWindow(hwnd)
PumpMessages()
EDIT: С помощью этого кода создается окно с двумя кнопками, но невозможно переместить фокус с одной на другую, хотя они обе имеют флаг WS_TABSTOP.
Согласно спецификации MSDN IsDialogMessage приведенный выше фрагмент C++ является решением.
Когда IsDialogMessage обрабатывает сообщение, он проверяет сообщения клавиатуры и преобразует их в выборки для соответствующего диалогового окна. Например, клавиша TAB при нажатии выбирает следующий элемент управления или группу элементов управления, а клавиша СТРЕЛКА ВНИЗ при нажатии выбирает следующий элемент управления в группе.
Поскольку функция IsDialogMessage выполняет весь необходимый перевод и отправку сообщений, сообщение, обработанное IsDialogMessage, не должно передаваться в функцию TranslateMessage или DispatchMessage.
Итак, в основном вопрос: можно ли использовать IsDialogMessage
из Python win2gui или есть какой-то обходной путь?
GetMessage
/TranslateMessage
/DispatchMessage
, ноIsDialogMessage
отсутствует, чтобы заставить его работать. - person zvone   schedule 03.04.2016