Имя: Пароль:
1C
1C 7.7
v7: Чем прочитать статус клавиш Shift, Ctrl, Alt (Нажата/не нажата)?
0 trdm
 
30.08.11
11:09
Чем прочитать статус клавишь Shift, Ctrl, Alt (Нажата/не нажата)?
Есть приблуда?
Что-то вроде этого:
http://doc.qt.nokia.com/latest/qapplication.html#keyboardModifiers
Qt::KeyboardModifiers  kbrdMod = qApp->keyboardModifiers();
if (kbrdMod & Qt::ControlModifier)return false;
1 trdm
 
30.08.11
11:42
,kby/
2 Ёпрст
 
гуру
30.08.11
11:44
(0)формекс не катит, или тебе не в 1с ?
3 Андрюха
 
30.08.11
11:48
(0) в 1С-ке надо ?
4 trdm
 
30.08.11
11:51
в 1Cсv77
5 АЛьФ
 
30.08.11
11:53
6 romix
 
30.08.11
12:03
http://msdn.microsoft.com/en-us/library/ms646267(v=vs.85).aspx#_win32_Keystroke_Message_Flags About Keyboard Input

RepeatCount:=KeyStroke and $FFFF; //Обычно 1. Больше 1, если система не успевает обработать быстрые повторные нажатия клавиш
ScanCode:=(KeyStroke shr 16) and $FF; //Скан-код клавиши
ExtendedKeyFlag:=(KeyStroke shr 24) and 1; //Признак расширенной клавиатуры (правый alt и т.п.)
ContextCodeFlag:=(KeyStroke shr 29) and 1;  //1 если клавиша alt нажата
PreviousFlag:=(KeyStroke shr 30) and 1; // Предыдущее состояние (1-нажата, 0-отпущена)
TransitionFlag:=(KeyStroke shr 31) and 1; //Текущее состояние (0-нажата, 1-отпущена)

Применяется в SetWindowsHookEx/CallNextHookEx  (есть образчик на Дельфи).
7 trdm
 
30.08.11
12:04
У меня 1с++ старая. Там нет "приОтжатииКнопки" т.е. фиксировать статус не получится нормально.
(5) Сенк.

Пока ответа ждал уже векашку набросал О_о.
8 trdm
 
30.08.11
12:05
+(7) не особо сложная вещь оказалась.
// KeyState.kstate
STDMETHODIMP Ckstate::keyboardModifiers(long *key, long *state)
{
   // TODO: Add your implementation code here
   *state = (long) 0;
   if (((GetKeyState( VK_SHIFT ) & 0x80) > 0) && *key == 1) {
       *state = (long) 1;
   }
   if (((GetKeyState( VK_CONTROL ) & 0x80) > 0) && *key == 2) {
       *state = (long) 1;
   }
   if (((GetKeyState( VK_MENU ) & 0x80) > 0) && *key == 3) {
       *state = (long) 1;
   }    
   return S_OK;
}
9 trdm
 
30.08.11
12:10
Я что собственно хотел, у меня есть такая процедурина глПросмотрРеквизитаОбъекта(псКонтекст, псОбъект, псИдОбъекта = "") для кнопок типа [0] в формах, там форма открывается модально. Хочу модифициировать поведение в зависимости от статуса нажатой клавиши.
10 Mikeware
 
30.08.11
12:10
(8) на Qt ВК сделал?
11 trdm
 
30.08.11
12:12
(10) Mikeware >> на Qt ВК сделал?

Не. Помнится в нете валялся пример "делаем внешнюю компоненту". По его инструкциям. разумеется на VC++ 6.0
12 Mikeware
 
30.08.11
12:21
(11) Жаль. Я уж заготовку поклянчить хотел...
13 skunk
 
30.08.11
12:23
а можно вопрос ... накуя это в именно в 1С ловить
14 trdm
 
30.08.11
12:24
(13) skunk >> а можно вопрос ... накуя это в именно в 1С ловить

см. (9)
15 FN
 
30.08.11
12:52
(9) использую такую же методу. только переключатель не шифт, а скрол-лок
статус ловится формексом
16 trdm
 
30.08.11
12:59
(15) FN >> использую такую же методу. только переключатель не шифт, а скрол-лок

но он же фиксируется. возможны ошибки.
17 FN
 
30.08.11
13:03
(16) кому что удобней
18 trdm
 
07.09.11
16:29
Прикольно, модифицировал
Процедуру ОбработкаЯчейкиТаблицы(Расшифровка,СтандартнаяОбработка,Таблица) Экспорт

Если нажать на документ с нажатым шифтом, то докум откроется в журнале.
Этой фиче можно найти кучу применений.
19 FN
 
07.09.11
16:36
(18) чем шифт ловишь?
20 trdm
 
07.09.11
16:46
http://unnstudioreport.googlecode.com/files/KeyState.rar
//==============================================================================
// глНажатаКлавишаШифтКонтролАльт( псКакаяКлавиша, псНажШифт = 0, псНажАльт = 0, псНажатКонтрол = 0 ) © trdm 2011
Функция глНажатаКлавишаШифтКонтролАльт( псКакаяКлавиша = 1, псНажШифт = 0, псНажАльт = 0, псНажатКтрл = 0 ) Экспорт
   ЗначВозврата = 0;
   псНажШифт = 0;
   псНажАльт = 0;
   псНажатКонтрол = 0;
   Попытка
       вОбъект = СоздатьОбъект("KeyState.kstate");
       псНажШифт = вОбъект.keyboardModifiers(1);
       псНажатКтрл = вОбъект.keyboardModifiers(2);
       псНажАльт = вОбъект.keyboardModifiers(3);
       Если (псКакаяКлавиша = 1) ИЛИ (псКакаяКлавиша = 2) ИЛИ (псКакаяКлавиша = 3)  Тогда
           ЗначВозврата = вОбъект.keyboardModifiers(псКакаяКлавиша)
       КонецЕсли;
   Исключение
   КонецПопытки;    
   Возврат ЗначВозврата;
КонецФункции // глНажатаКлавишаШифтКонтролАльт()
--------------------------------------------
Либа нуждается в регистрации:

regsvr32 "Путь\KeyState.dll"
21 trdm
 
07.09.11
16:47
22 FN
 
07.09.11
16:49
(21) спасибо
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший