История:
Я работаю над элементом управления, полученным из класса TCustomControl
, который может получить фокус и который имеет некоторые внутренние элементы внутри. Эти внутренние элементы выделяются, если пользователь наводит их курсором, вы можете выбрать их, переместить их и так далее. Теперь к проблеме...
Проблема:
Я делаю разные действия с (если скажем) сфокусированным элементом, если пользователь держит модификаторы CTRL, ALT или SHIFT. Я хотел бы изменить курсор мыши, если пользователь наведет элемент и удерживает, например, клавишу CTRL. Довольно просто вы переопределите методы KeyDown
и KeyUp
и проверьте, равен ли их параметр Key
VK_CONTROL
. В коде, подобном этому:
procedure TMyCustomControl.KeyDown(var Key: Word; Shift: TShiftState);
begin
inherited;
if Key = VK_CONTROL then
Screen.Cursor := crSizeAll;
end;
procedure TMyCustomControl.KeyUp(var Key: Word; Shift: TShiftState);
begin
inherited;
if Key = VK_CONTROL then
Screen.Cursor := crDefault;
end;
Даже если это не лучший способ проверить, была ли нажата и отпущена клавиша CTRL (например, из-за существующего параметра состояния Shift
), она работает так, как ожидается, управление имеет фокус, что может даже получить, но...
Моя цель - изменить курсор мыши, когда пользователь наводит элемент управления (или, точнее, определенный элемент внутри него) и удерживает, например. что клавиша CTRL, даже если мой элемент управления не имеет фокуса. Можно сказать, поэтому просто переопределите метод MouseMove
и попросите указать там состояния модификатора. И это будет так, но...
Что делать, если пользователь остается с курсором мыши над моим элементом управления и нажмите и отпустите клавишу CTRL? Это не вызовет какого-либо движения мыши или нажатия клавиши для моего контроля, или я ошибаюсь? Ну, так мой вопрос совершенно очевиден...
Вопрос:
Как я могу определить изменения ключа-модификатора, если элемент управления не имеет фокуса, и пользователь не перемещается с помощью мыши? Я думал об этих двух вариантах, но, надеюсь, что-то я пропустил:
- клавиатурный крючок - надежный, но выглядит довольно переполняющим для меня.
- периодическая проверка состояния модификатора с помощью таймера - я не мог жить с задержкой
Итак, как бы вы обнаружили изменения ключа-модификатора элемента управления, который в настоящее время не сфокусирован?