Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RegisterHotKey 
:(
    Опции темы
_8989
  Дата 14.11.2003, 21:01 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Здравствуйте!

Помогите зарегистрировать комбинацию клавишь или одну горячую клавишу.

Программа записывает в реестр комбинацию клавишь или одну горячую клавишу (в зависимости от выбора юзера) в виде DWORD-параметра. Позже считывает и заносит в переменную wHotKey (word). Вопрос, как теперь зарегистрировать с помощью функции RegisterHotKey комбинацию клавишь или одну горячую клавишу? Я думал MAKEWORD мне поможет, но не вышло:

Код
RegisterHotKey(0, ID_HOTKEY, MAKEWORD(0, wHotKey), MAKEWORD(wHotKey, 0));


Помогите!!!
  Вверх
Gloomy
Дата 14.11.2003, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 7.10.2003
Где: England

Репутация: 1
Всего: 1



Я писал небольшую статейку тут.
З.Ы. Это не реклама! Просто не хочу переписывать одно и то же еще раз.
PM MAIL   Вверх
_8989
Дата 15.11.2003, 09:00 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Статью прочитал. Это всё понятно, но вопрос-то в другом...
  Вверх
<Spawn>
Дата 15.11.2003, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



_8989 Вот тебе примерчик:

Код
 scShiftA:= TextToShortCut('Shift+A');
 dwAtom:= GlobalAddAtom(PAnsiChar('MyHotKey'));
 RegisterHotKey(Handle, dwAtom, MOD_SHIFT, WordRec(scShiftA).Lo);


Видимо ты не то значение передавал в 3-ий параметр функции - MAKEWORD(0, wHotKey)


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
_8989
Дата 15.11.2003, 11:34 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Последний параметр (WordRec(scShiftA).Lo) распознаеться легко, а нужно распознать и первый (MOD_SHIFT). А в твоем примере прямо подставляеться первый параметр. А если пользователь ввёл не SHIFT, а SHIFT+ALT? Мне нужно распознать оба параметра!
  Вверх
<Spawn>
Дата 15.11.2003, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Тогда можешь поступить одним из следующих способов:

Код
 Modifiers:=0;
 case scMyHotKey shr 11 of
   MOD_SHIFT: Modifiers:= MOD_SHIFT;
   MOD_ALT: Modifiers:= MOD_ALT;
   MOD_CONTROL: Modifiers:= MOD_CONTROL;
  end;
 RegisterHotKey(Handle, dwAtom, Modifiers, WordRec(scMyHotKey).Lo);


или

Код
if (scMyHotKey and scShift) <> 0 then
    Modifiers:= MOD_SHIFT
  else
  if (scMyHotKey and scAlt) <> 0 then
    Modifiers:= MOD_ALT
  else
  if (scMyHotKey and scCtrl ) <> 0 then
    Modifiers:= MOD_CONTROL;
 RegisterHotKey(Handle, dwAtom, Modifiers, WordRec(scMyHotKey).Lo);


Это сообщение отредактировал(а) <Spawn> - 15.11.2003, 13:20


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
<Spawn>
Дата 15.11.2003, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Если же ты будешь использовать комбинации типа Shift + Ctrl, то маленько переделать этот код нужно будет, например так:

Код
  if (scMyHotKey and scShift) <> 0 then
    Modifiers:=Modifiers or MOD_SHIFT;
  if (scMyHotKey and scAlt) <> 0 then
    Modifiers:=Modifiers or MOD_ALT;
  if (scMyHotKey and scCtrl ) <> 0 then
    Modifiers:=Modifiers or MOD_CONTROL;


А потом в WM_HOTKEY сравнивать с этим Modifier:
Код

...
if (Msg.LParamLo = Modifiers)  and ....
...


Это сообщение отредактировал(а) <Spawn> - 15.11.2003, 13:24


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
_8989
Дата 15.11.2003, 13:29 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Дело в том, что не я буду устанавливать комбинацию клавишь, а пользователь. А что он поставит - не знает и Бог.
  Вверх
<Spawn>
Дата 15.11.2003, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



_8989 ну я же показал тебе как нужна сделать. Вот более полный пример:

Код
var
 Form1: TForm1;
 dwAtom:DWORD = 0;
 Modifiers:Cardinal = 0;
implementation

{$R *.dfm}

procedure TForm1.HotKey(var Msg:TMessage);
begin
if (Msg.LParamHi = WordRec(hkUserKey.HotKey).Lo)and
  (Msg.LParamLo = Modifiers) then
    Showmessage('Hot key pressed');
end;

procedure TForm1.Button1Click(Sender: TObject);

begin
if dwAtom = 0 then
begin
 dwAtom:= GlobalAddAtom(PAnsiChar('MyHotKey'));
 Modifiers:=0;

 if (hkUserKey.HotKey and scShift) <> 0 then
   Modifiers:=Modifiers or MOD_SHIFT;
 if (hkUserKey.HotKey and scAlt) <> 0 then
   Modifiers:=Modifiers or MOD_ALT;
 if (hkUserKey.HotKey and scCtrl ) <> 0 then
   Modifiers:=Modifiers or MOD_CONTROL;

 RegisterHotKey(Handle, dwAtom, Modifiers, WordRec(hkUserKey.HotKey).Lo);
end
else ShowMessage('Hotkey already registred');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 dwAtom:= 0;
 GlobalDeleteAtom(dwAtom);
 UnRegisterHotKey(Handle, dwAtom);
end;


Клик на Button1 решистрирут новый Хоткей, клик на Button2 делает обратное действие. HotKey вводится в hkUserKey(компонент THotKey)

Это сообщение отредактировал(а) <Spawn> - 15.11.2003, 13:46


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Vex
Дата 15.11.2003, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


кацапосрачмученiкъ
****


Профиль
Группа: Экс. модератор
Сообщений: 3103
Регистрация: 28.3.2002
Где: strawberry fields

Репутация: 1
Всего: 88



8989, я писал для себя подобную программку для открывагния папок по горячим клавишам, если хочешь, я тебе дам исходники. У меня там правда сочетания запоминаются в текстовый файл. И код написан коряво. smile.gif


--------------------
Слава Україні.
PM   Вверх
_8989
Дата 17.11.2003, 15:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код
var
wHotKey: Word
begin
//Считываю значение из компонента msctls_hotkey32 (ID - 303)
wHotKey := SendMessage(GetDlgItem(hwnd, 303), HKM_GETHOTKEY, 0, 0);

if (wHotKey and scShift) <> 0 then Modifiers := Modifiers or MOD_SHIFT;
if (wHotKey and scAlt) <> 0 then Modifiers := Modifiers or MOD_ALT;
if (wHotKey and scCtrl ) <> 0 then Modifiers := Modifiers or MOD_CONTROL;

//Пытаюсь зарегистрировать
RegisterHotKey(0, ID_HOTKEY1, Modifiers, WordRec(wHotKey).Lo);

//Вывожу результат
MessageBox(hwnd,PChar(ShortCutToText(Modifiers)),'',MB_OK);



Здесь WordRec(wHotKey).Lo считывается нормально, а Modifiers не распознаёться. Что не так?

P.S. Программа пишеться без использования VCL.
  Вверх
<Spawn>
Дата 17.11.2003, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



_8989 Попробуй сделать Modifiers: = 0;


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
_8989
Дата 17.11.2003, 16:29 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Бесполезно!
  Вверх
<Spawn>
Дата 17.11.2003, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Тогда, скорее всего, в wHotKey используются другие биты для идентификации нажатия Ctrl, Alt и т.д.

Это сообщение отредактировал(а) <Spawn> - 17.11.2003, 16:36


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
_8989
Дата 17.11.2003, 20:42 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











2Vex

Представь свой код здесь, пожалуйста.
  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0585 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.