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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2011, 10:40   #1
Diablero
Пользователь
 
Регистрация: 31.01.2011
Сообщений: 42
По умолчанию "Локальные" горячие клавиши

Добрый день! Пытаюсь реализовать стандартные действия на комбинации Ctrl-F и Ctrl-С в своём приложении, для чего поступаю следующим образом:

Код:
__fastcall TFormMain::TFormMain(TComponent* Owner)
        : TForm(Owner)
{
        
        RgHKCtrlF=RegisterHotKey(FormMain->Handle, 0x001, MOD_CONTROL, 'F');
        RgHKCtrlC=RegisterHotKey(FormMain->Handle, 0x002, MOD_CONTROL, 'C');
}
...
void __fastcall TFormMain::ApplicationEventsMessage(tagMSG &Msg,
      bool &Handled)
{
        if(RgHKCtrlF&&Msg.message==WM_HOTKEY&&Msg.wParam==0x001)              
                BtnFind->Click();
        if(RgHKCtrlC&&Msg.message==WM_HOTKEY&&Msg.wParam==0x002)            
                NCopy->Click(); 
}
Комбинации срабатывают, но перехватывают их у всех других приложений, открытых наряду с моим, даже если последнее и не в фокусе. Подскажите, пожалуйста, что я делаю не так и как правильно реализовать "локальное" поведение горячих клавиш.
Diablero вне форума Ответить с цитированием
Старый 25.02.2011, 10:55   #2
MotoArhangel
Пользователь
 
Регистрация: 25.02.2011
Сообщений: 51
По умолчанию

Тоже самое, что и у тебя.
Код:
procedure TForm1.FormCreate(Sender: TObject);
// Ищем клавиши: 
      RegisterHotKey(Handle, 1, MOD_ALT, VK_TAB);
      RegisterHotKey(Handle, 2, MOD_ALT, vk_F4);
      RegisterHotKey(Handle, 3, 0, VK_SNAPSHOT);
Делаем что нужно)
Код:
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
 begin
   if Msg.HotKey = 1 then
     ShowMessage('Ctrl + Tab ушел в гости ;)');
   if Msg.HotKey = 2 then
     ShowMessage('Alt+F4 еще спит');
   if Msg.HotKey = 3 then
     ShowMessage('Скрин шот получился корявым, поэтому не сохранен');
 end;
THotKey = class(TCustomHotKey) тебе в помощь и все будет как задумано.

Последний раз редактировалось Stilet; 25.02.2011 в 12:45.
MotoArhangel вне форума Ответить с цитированием
Старый 25.02.2011, 11:09   #3
Diablero
Пользователь
 
Регистрация: 31.01.2011
Сообщений: 42
По умолчанию

Не совсем понял - WMHotKey(var Msg: TWMHotKey) - это обработчик события формы или пользовательская процедура? Если последнее, то откуда брать параметр TWMHotKey?
Diablero вне форума Ответить с цитированием
Старый 25.02.2011, 11:13   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

это обработчик сообщения
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.02.2011, 11:20   #5
MotoArhangel
Пользователь
 
Регистрация: 25.02.2011
Сообщений: 51
По умолчанию

Вот Пример с возможностью присвоения нового значения.
Вложения
Тип файла: rar Горячая клавиша.RAR (2.3 Кб, 38 просмотров)
MotoArhangel вне форума Ответить с цитированием
Старый 25.02.2011, 12:32   #6
Diablero
Пользователь
 
Регистрация: 31.01.2011
Сообщений: 42
По умолчанию

Цитата:
Сообщение от MotoArhangel Посмотреть сообщение
Вот Пример с возможностью присвоения нового значения.
А в каком файле нужный код? Вы уверены, что все файлы проекта поместили в архив?
Diablero вне форума Ответить с цитированием
Старый 25.02.2011, 12:35   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

F1:

Цитата:
Defines a system-wide hot key.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 25.02.2011, 12:36   #8
MotoArhangel
Пользователь
 
Регистрация: 25.02.2011
Сообщений: 51
По умолчанию

Да уверен в Unit1.pas там почти пусто, но если открыть сам проект Project1.dpr, то увидите нужный компонент.
MotoArhangel вне форума Ответить с цитированием
Старый 25.02.2011, 12:40   #9
Diablero
Пользователь
 
Регистрация: 31.01.2011
Сообщений: 42
По умолчанию

А, понял, просто у меня не Delphi, а С++Builder стоит, а файлы проекта пытаюсь в блокноте открыть
Diablero вне форума Ответить с цитированием
Старый 25.02.2011, 12:53   #10
Diablero
Пользователь
 
Регистрация: 31.01.2011
Сообщений: 42
По умолчанию

А чем логика кода

Код:
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
 begin
   if Msg.HotKey = 1 then
     ShowMessage('Ctrl + Tab ушел в гости ;)');
   if Msg.HotKey = 2 then
     ShowMessage('Alt+F4 еще спит');
   if Msg.HotKey = 3 then
     ShowMessage('Скрин шот получился корявым, поэтому не сохранен');
 end;
отличается от

Код:
void __fastcall TFormMain::ApplicationEventsMessage(tagMSG &Msg,
      bool &Handled)
{
        if(RgHKCtrlF&&Msg.message==WM_HOTKEY&&Msg.wParam==0x001)              
                BtnFind->Click();
        if(RgHKCtrlC&&Msg.message==WM_HOTKEY&&Msg.wParam==0x002)            
                NCopy->Click(); 
}
? И тут и там перехватывается сообщение приложения вроде...
Diablero вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
Как обрубить все "ненужные" клавиши в меню программы. Ветас Паскаль, Turbo Pascal, PascalABC.NET 6 26.10.2009 18:01
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Как назначить "горячие" клавиши ekzobyte Общие вопросы Delphi 16 18.03.2009 21:15