Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > OnKeyDown - невозможно проверить, зажата ли Ctrl


Автор: CyraxZ 31.3.2009, 18:58
Невозможно реализовать элементарную вещь - проверить, зажата ли Ctrl
Код

void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)

В хелпе:
Код

typedef Set<Classes__1, ssShift, ssDouble>  TShiftState;

А что это за хернь такая - Classes__1 - ни слова.
Ну ведь можно было булевскую переменную заделать - никаких проблем. Обязательно нужно множество...

Автор: nworm 31.3.2009, 19:43
В местной drkb есть примерчик про табуляцию. Может поможет
Код

type
TForm1 = class(TForm)
private
   procedure CMDialogKey(var msg: TCMDialogKey);
     message CM_DIALOGKEY;
end;
 

var
Form1: TForm1;

 

implementation

{$R *.DFM}


procedure TForm1.CMDialogKey(var msg: TCMDialogKey);
begin
if msg.Charcode <> VK_TAB then
   inherited;
end;

 

procedure TForm1.FormKeyDown(Sender: TObject; var Key:
Word; Shift: TShiftState);
begin
if Key = VK_TAB then
   Form1.Caption := 'Tab Key Down!';
end;

Автор: Anikmar 31.3.2009, 19:48
Код

void __fastcall TF_Main::Edit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift)

{
    if (Key == VK_F5)
        if (Shift.Contains(ssCtrl))
            Application->MessageBox(L"Ctrl + F5",L"Ctrl+key",0);
        else
            Application->MessageBox(L"F5",L"key",0);
}


Автор: CyraxZ 1.4.2009, 13:12
Цитата

В местной drkb есть примерчик про табуляцию. Может поможет

Нет, мне нужен пример использования именно структуры Shift.

Anikmar, это то, что нужно:
Код

hift.Contains(ssCtrl)

Спасибо.


Автор: Usper 2.4.2009, 08:20
Цитата(CyraxZ @  31.3.2009,  18:58 Найти цитируемый пост)
Ну ведь можно было булевскую переменную заделать - никаких проблем. Обязательно нужно множество...


А если надо отловить несколько одновременно нажатых функциональных клавиш (например ctrl+alt+del), что делать? На каждую кнопку свою булеву переменную вводить?

Автор: mrbrooks 2.4.2009, 08:31
Usper, можно хук повесить.
Однако Task Manager вырубал через реестр (ведь главная цель именно он?  smile )

Автор: CyraxZ 2.4.2009, 12:26
Цитата

А если надо отловить несколько одновременно нажатых функциональных клавиш (например ctrl+alt+del), что делать? На каждую кнопку свою булеву переменную вводить?

Достаточно 3 булевых переменных. Это не так много.

Автор: xvr 2.4.2009, 14:23
Цитата(CyraxZ @ 2.4.2009,  12:26)
Цитата

А если надо отловить несколько одновременно нажатых функциональных клавиш (например ctrl+alt+del), что делать? На каждую кнопку свою булеву переменную вводить?

Достаточно 3 булевых переменных. Это не так много.

А если еще и буквы приплюсовать, то немного более сотни булевых переменных понадобится, наверное это тоже не много   smile 

Автор: CyraxZ 3.4.2009, 16:10
Цитата

А если еще и буквы приплюсовать, то немного более сотни булевых переменных понадобится, наверное это тоже не много

В 99% случаев используются 3-4 управляющих клавиши. Ну а если метод должен позволять проверять и обычные клавиши в качестве управляющих, то в этом случае к 3-4 булевским переменным достаточно добавить одну универсальную "структуру" (множество или ещё что) для всех клавиш. Нельзя не согласиться, что в этом случае будет достигнута золотая середина, которая, как правило, значительно выигрывает у чисто универсальных реализаций.

Автор: xvr 3.4.2009, 17:02
Цитата(CyraxZ @ 3.4.2009,  16:10)
В 99% случаев используются 3-4 управляющих клавиши. 

В 99% управляющие клавиши вообще не используются. И тащить в евент пачку булевых переменных явно излишне. 
Цитата

Ну а если метод должен позволять проверять и обычные клавиши в качестве управляющих, то в этом случае к 3-4 булевским переменным достаточно добавить одну универсальную "структуру" (множество или ещё что) для всех клавиш. Нельзя не согласиться, что в этом случае будет достигнута золотая середина, которая, как правило, значительно выигрывает у чисто универсальных реализаций.
Одно множество (каковое как раз и является компактно представленной 'пачкой булевых переменных') как раз и является золотой серединой

Автор: Usper 6.4.2009, 08:17
Цитата(mrbrooks @  2.4.2009,  08:31 Найти цитируемый пост)
Однако Task Manager вырубал через реестр (ведь главная цель именно он?   )


Да нет, просто дурацкий пример.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)