2016-01-31 13 views
5

Delphi IDE'ye yeni bir ShortCut eklemek, Open Tools API'si bunun için bir hizmet sağladığından çok zor değildir. Görünüşe göre daha karmaşık bir şey çalışıyorum: Ek kısayol gibi WordStar ekleyin: kullanıcı tek tuş X izlediToolsApi kullanarak Shift + Ctrl + H X tuşlarını Delphi IDE'ye nasıl eklerim?

Shift + Ctrl + H tuşuna bastığında

ben ne bir şey istiyorum

buradaki X gerektiği Shift tuşunun durumuna bakmaksızın çalışın. Ben ShiftState ayarlarsanız

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; 

Yani,: = [ssCtrl]

benim TwoKeyBindingHandler yöntemini çağıran

Ctrl + H X tuşuna basarak

Bu benim kodudur.

Ancak ShiftState ile

: = [ssShift, ssCtrl] tuşuna

Shift + Ctrl + H x

hiçbir şey yapmaz. ShiftState belirtirken Garip

: = [ssShift, ssCtrl]

Shift + Ctrl + H Shift tuşuna (ki sadece birinci anahtar etkilemelidir) + X

bile, benim TwoKeyBindingHandler yöntemini çağırdığında ikinci ShortCut bir değiştirici anahtarı olmadan eklenir.

Herhangi bir fikrin var mı? Bu, Delphi IDE/Open Tools API'sinin bilinen bir sınırlaması/hatası mı? Bilinen bir çözüm var mı?

Delphi 2007 ve Delphi 10 Seattle'da denedim, fark yok.

cevap

3

GetKeyState işlevini kullanarak bunu yapabilmeniz gerekir.

Programda iki işlem vardır - Açılır menü öğesi açmak olarak düşünün. Ctr-shift-h tuşuna basıldığında, programınızın 'Menu' (Menü) 'nin şimdi açıldığını ve sonraki bir tuşa basmanın ya bir seçeneği aktif hale getireceğini ya da geçersiz bir tuşa basarsanız' menüyü 'kapatacağını belirtmesi gerekecektir.

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; 

end;

+0

Teşekkürler, bu, Hotkey'leri genel olarak denetlemek için bir çözümdür, ancak OnKeyDown ile başa çıkmak için bir formum bulunmayan özel durumum için geçerli değildir. (Bunun dışında: IsKeyDown'ı birden çok kez çağırmak iyi bir performans değildir, muhtemelen GetKeyState'i yalnızca bir kez çağırır ve tuş birleşimini kontrol ederim.) – dummzeuch

+0

Yine de uygulama için wm_keydown mesajını işleyebilirsiniz. –

+1

Evet, yapabilirim. Ve muhtemelen Açık Araçlar API'sini kullanarak bir çözüm bulamazsam tam olarak yapacağım. Ne yazık ki, IDE'nin bazı ek kodlar gerektirebilecek anahtarı bile görmesini engellemek zorunda kalacağım. Ama oraya vardığımda o köprüyü geçeceğim. – dummzeuch

1

görünüşte kimse bir cevap bulmuş beri, burada yaptığım sona erdi budur, tamam:

Zaten aslında kodu zaten çalışıyordu ikinci anahtarın (tüm olası karakterleri listeleyen bir ipucu penceresini göstermek planlıyordu

Helen Fairgrieve'in bu soruna verdiği cevapta önerilen yaklaşımı kullanarak iyi.) Bunun yerine, şimdi sadece tek tuş kısayol kayıt:

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

Ve TwoKeyBindingHandler yönteminde

ben kısayol olarak bu karakterleri içeren bir açılır menü gösterilsin. IDE/VCL/Windows, geri kalanını benim için halleder.

Göründüğü gibi şudur: animated GIF with the result

Fiili soruya bir cevap değil ama benim sorunu çözer. Üzgünüm, bir şey daha bekliyorsun.

İlgili konular