2016-01-31 5 views
5

Добавление нового ShortCut в среду разработки Delphi не слишком сложно, потому что API открытых инструментов предоставляет для этого сервис. Я что-то по-видимому более сложным попробовать: Добавить Wordstar как дополнительный Shortcut:Как добавить привязку клавиш Shift + Ctrl + H X к среде Delphi с помощью ToolsApi?

Я хочу что-то произойдет, когда пользователь нажимает

Shift + Ctrl + H, а затем с помощью одной клавиши X

где X должен независимо от состояния клавиши Shift.

Это мой код:

procedure TGxKeyboardBinding.BindKeyboard(const BindingServices: IOTAKeyBindingServices); 
const 
    DefaultKeyBindingsFlag = kfImplicitShift + kfImplicitModifier + kfImplicitKeypad; 
var 
    GExpertsShortcut: Byte; 
    ShiftState: TShiftState; 
    FirstShortCut: TShortCut; 
    SecondShortCut: TShortCut; 
begin 
    GExpertsShortcut := Ord('H'); 
    ShiftState := [ssShift, ssCtrl]; 
    FirstShortCut := ShortCut(GExpertsShortcut, ShiftState); 
    SecondShortCut := ShortCut(Ord('X'), []); 
    BindingServices.AddKeyBinding([FirstShortCut, SecondShortCut], 
    TwoKeyBindingHandler, nil, 
    DefaultKeyBindingsFlag, '', ''); 
end; 

Итак, если я изложу ShiftState: = [ssCtrl] нажав

Ctrl + H X

называет свой метод TwoKeyBindingHandler.

Но с ShiftState: = [ssShift, ssCtrl] нажатием

Shift + Ctrl + H X

ничего не делает.

Как ни странно, при указании ShiftState: = [ssShift, ssCtrl] (который должен влиять только на первый ключ) нажатием

Shift + Ctrl + H Shift + X

называет свой метод TwoKeyBindingHandler, несмотря на то, второй ShortCut добавляется без ключа-модификатора.

Любая идея? Возможно, это известное ограничение/ошибка API-интерфейсов Delphi IDE/Open Tools? Известно ли обходное решение?

Я попробовал его в Delphi 2007 и Delphi 10 Seattle, без разницы.

ответ

3

Вы должны быть в состоянии сделать это, используя функцию GetKeyState.

Программа имеет две операции. Подумайте об этом, открыв выпадающий пункт меню. Когда нажата ctr-shift-h, ваша программа должна будет указать, что «Меню» теперь открыто, и что последующие нажатия клавиш либо активируют опцию, либо закрывают «меню», если нажата недействительная клавиша.

function IsKeyDown(const VK: integer): boolean; 
begin 
    IsKeyDown := GetKeyState(VK) and $8000 <> 0; 
end; 

procedure Form1.OnkeyDown(...) 
begin 
if Not H_MenuOpen then 
if IsKeyDown(vk_Control) and IskeyDown(vk_Shift) and IsKeyDown(vk_H) then 
begin 
     //Some Boolean in the form 
     H_MenuOpen:=True; 
     //Will probably need to invalidate some parameters here so that 
     //no control tries to process the key 
     exit; 
end; 

if H_MenuOpen then 
begin 
     if key=vk_X then 
     begin 
      //x has been pressed 
      *Your code here* 
      //possibly invalidate some of the params again 
      exit; 
     end; 
    //Nothing valid 
    H_MenuOpen:=False; 
end; 

конец;

+0

Спасибо, это решение для общей проверки горячих клавиш, но оно не распространяется на мой конкретный случай, когда у меня нет формы для обработки OnKeyDown. (Помимо этого: вызывать IsKeyDown несколько раз, кажется, не очень хорошая производительность, я бы, вероятно, позвонил GetKeyState только один раз и проверил бы комбинацию клавиш.) – dummzeuch

+0

Вы все равно можете обработать сообщение wm_keydown для приложения. –

+1

Да, я мог. И я, вероятно, сделаю именно это, если не найду решение с помощью API открытых инструментов. К сожалению, мне также придется помешать IDE даже увидеть этот ключ, который может потребовать дополнительного кода. Но я перейду через этот мост, когда доберусь туда. – dummzeuch

1

ОК, так как, видимо, никто не нашел ответа, вот что я в конечном итоге делает:

я уже планировал показать окно подсказки со списком всех возможных символов для второго ключа (на самом деле, что код уже работал штраф, используя подход, предложенный Хелен Фэргривит в ее ответе на этот вопрос). Вместо этого, я теперь зарегистрировать только один-комбинации клавиш:

BindingServices.AddKeyBinding([FirstShortCut], 
    TwoKeyBindingHandler, nil, 
    DefaultKeyBindingsFlag, '', ''); 

И в методе TwoKeyBindingHandler, я показываю всплывающее меню, которое содержит эти символы как ярлыки. Затем IDE/VCL/Windows обрабатывает остальное для меня.

Это то, что он выглядит следующим образом: animated GIF with the result

Это не ответ на актуальный вопрос, но он решает мою проблему. Извините, если вы здесь ожидаете чего-то большего.

 Смежные вопросы

  • Нет связанных вопросов^_^