Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.07.2013, 15:24   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию Назначение и обработка комбинаций клавиш

Здравствуйте.
Первое:
Мне нужно, чтобы мое окно реагировало на некие комбинации клавиш. Например: CTRL+J, ALT+K и т.п. Как это сделать?
Через WM_KEYDOWN обрабатываются одиночные клавиши, но не сочетания.
Второе:
планирую использовать контрол HotKey для смены сочетаний.
По замыслу, таких сочетаний будет много, так что если делать для каждого из них отдельный HotKey, это займет очень много места в окне.
Отсюда вопрос: Как примерно это сделано в плеере Light Alloy?
вот скриншот его окна:

Это похоже на ListView с ручной отрисовкой.
Но как он принимает сочетания клавиш? В него как-то встроена куча HotKey'ев?
Натолкните на умные мысли, как сделать нечто подобное? Готовый код НЕ прошу!
BLACK_RAIN вне форума Ответить с цитированием
Старый 19.07.2013, 15:39   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Через WM_KEYDOWN обрабатываются одиночные клавиши, но не сочетания.
а если доку почитать?
Цитата:
Отсюда вопрос: Как примерно это сделано в плеере Light Alloy?
там редактироватся в момент времени может лишь одна ячейка, в момент редактирования ставим HotKey контрол и все.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.07.2013, 16:34   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а если доку почитать?
В смысле это?
Цитата:
Сообщение от msdn
24 Indicates whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0.
Вы про это? Это вроде показывает, является ли нажатая клавиша "расширенной" или нет. Т.е, одной из ctrl/alt/shift/win. Там больше нет ничего про CTRL/ALT.
Про какую доку вы говорите?
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
в момент редактирования ставим HotKey контрол и все.
Самую малость поподробнее, пожалуйста. Момент редактирования это обработка WM_KEYDOWN на ListView? В каком смысле "ставим" HotKey?

Последний раз редактировалось BLACK_RAIN; 19.07.2013 в 17:27.
BLACK_RAIN вне форума Ответить с цитированием
Старый 19.07.2013, 20:51   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Зачем заморачиваться с WM_KEYDOWN? Для этого есть TranslateAccelerator()
waleri вне форума Ответить с цитированием
Старый 20.07.2013, 09:17   #5
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Зачем заморачиваться с WM_KEYDOWN? Для этого есть TranslateAccelerator()
ok. Что я делаю не так?
Код:
const
VK_M = 77;
VK_L = 76;
id_1 = wm_user+666;
ID_2 = WM_USER+667;

var
  arraccel : array [0..1] of ACCEL;
  myaccel : hACCEL = 0;

begin
  arraccel[0].fVirt := FCONTROL;
  arraccel[0].key := VK_M;
  arraccel[0].cmd := id_1;
  arraccel[1].fVirt := FCONTROL;
  arraccel[1].key := VK_L;
  arraccel[1].cmd := id_2;
  myaccel := createacceleratortable(arraccel,2);
  if myaccel>0 then
  MessageBox(form1,'','',MB_OK);

While GetMessage(Mesg,form1,0,0) do
  begin
     if TranslateAccelerator(form1,myaccel,mesg)=0 then
     begin
       TranslateMessage(Mesg);
       DispatchMessage(Mesg);
     end;
  end;

    WM_COMMAND:
    if (loword(Wpar)=id_1) or (loword(Wpar)=id_2) then
    MessageBox(wnd,PChar('ctrl+m'),PChar(':)'),0);
WM_COMMAND не приходит.

Последний раз редактировалось BLACK_RAIN; 20.07.2013 в 10:16.
BLACK_RAIN вне форума Ответить с цитированием
Старый 20.07.2013, 10:17   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
ok. Что я делаю не так?
Не читаете документацию.
Если сработал TranslateAccelartor, тогда НЕ надо TranslateMessage + DispatchMessage.
waleri вне форума Ответить с цитированием
Старый 20.07.2013, 11:12   #7
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Не читаете документацию.
Если сработал TranslateAccelartor, тогда НЕ надо TranslateMessage + DispatchMessage.
Я еще раз спрашиваю - под "документацией" имеется ввиду MSDN или что-то еще?
Я читаю MSDN про функцию TranslateAccelerator() и там чёрным по белому написано:
Цитата:
Сообщение от msdn
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero.
что в переводе означает: "Если функция успешна, то возвращаемое значение - не ноль. Если функция сфэйлила, то возвращаемое значение - ноль.".
Я делаю, как написано:
Код:
    if TranslateAccelerator(form1,myaccel,mesg)=0 then // если фэйл
    begin  // тогда
      TranslateMessage(Mesg);
      DispatchMessage(Mesg);
    end;
Что не так-то?

Последний раз редактировалось BLACK_RAIN; 20.07.2013 в 11:21.
BLACK_RAIN вне форума Ответить с цитированием
Старый 20.07.2013, 11:27   #8
Stertor
Заблокирован
 
Регистрация: 17.07.2013
Сообщений: 104
По умолчанию

BLACK_RAIN, не обижайтесь на этих бармалеев, они и сами ничего толком не знают. В вашем случае надо хук ставить на клавиатуру и ловить эти две клавиши. Хук устанавливают с помощью API SetWindowsHookEx. Поищите исходники в сети.
Stertor вне форума Ответить с цитированием
Старый 20.07.2013, 11:38   #9
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Stertor Посмотреть сообщение
Хук устанавливают с помощью API SetWindowsHookEx.
Хук на клаву я ставить умею, но хотелось бы обойтись без этого. Хук - это уж слишком.
BLACK_RAIN вне форума Ответить с цитированием
Старый 20.07.2013, 11:42   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Не знаю - вы изменили код.
В первоначальном варианте были безусловно два Translate и Dispatch()

Почитайте про FVIRTKEY, если не поможет вон нелюбитель бармалеев вам поможет...
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обработка клавиш из dll AntyDES C# (си шарп) 5 23.10.2012 12:42
Возможно ли в Турбо Паскале изменить назначение клавиш? bonjovi Паскаль, Turbo Pascal, PascalABC.NET 4 12.02.2012 20:43
Обработка клавиш на TListBox Melanholly Общие вопросы Delphi 2 31.10.2011 14:06
Блокирование системных клавиш и их комбинаций DannerDOS Win Api 15 05.05.2010 14:12
Изменение и назначение сочетания клавиш uha58 Общие вопросы Delphi 1 29.12.2009 12:54