Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать горячие клавиши, если окно не активно, используя THotKey 
V
    Опции темы
Great Cornholio
Дата 8.7.2008, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Окно программы не активно или в трее. Как при нажатии клавиши, определённой через THotKey выполнить какое либо действие? У меня - это вставка текста в активное поле ввода, а также свернуть в трей/восстановить из трея. Могут добавиться новые функции.
PM   Вверх
mrbrooks
Дата 9.7.2008, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Я пологаю хук (Hook) спасет отца русской демократии.
PM MAIL   Вверх
Great Cornholio
Дата 11.7.2008, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А как его можно организовать? smile 
PM   Вверх
Great Cornholio
Дата 15.7.2008, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ужоснах. Я излазил весь форум, я даже гуглил, ничего конкретного не нашёл. Прошу кого-нибудь, сделайте очень доброе дело, напишите мне код с каментами, как отловить сочетания клавиш, описанных в THotKey, когда программа не в фокусе.
PM   Вверх
586
Дата 15.7.2008, 05:24 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



.cpp
Код
#define MY_HOTKEY_ID    1

void __fastcall TForm1::wm_hotkey(TWMHotKey &hk)
{
    if(hk.HotKey == 1) MessageBox(Handle, "CTRL+E pressed", "", 0);
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    Button2->Tag = !Button2->Tag;
    if(Button2->Tag) {
        RegisterHotKey(Handle, MY_HOTKEY_ID, MOD_CONTROL, 'E');
        Caption = "ON";
    } else {
        UnregisterHotKey(Handle, MY_HOTKEY_ID);
        Caption = "OFF";
    }
}

.h
Код
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TButton *Button2;
    void __fastcall Button2Click(TObject *Sender);
private:    // User declarations
    void __fastcall wm_hotkey(TWMHotKey&);
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
    BEGIN_MESSAGE_MAP
      MESSAGE_HANDLER(WM_HOTKEY, TWMHotKey, wm_hotkey);
    END_MESSAGE_MAP(TForm);
};

PM   Вверх
XPyCT
Дата 15.7.2008, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



от меня лично большое мужское спс!
PM MAIL Skype   Вверх
Great Cornholio
Дата 15.7.2008, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да, большое спасибо, наконец-то нашёлся человек, который не поленился сам написать код. 100 постов не имею, так что пишу "+1" в посте. Как данный код прилепить к THotKey подумаю сам. 
PM   Вверх
586
Дата 16.7.2008, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Там не сложно это далается:
VCL
Код
TShiftState st;
WORD key;
DWORD mod = 0;
ShortCutToKey(HotKey1->HotKey, key, st);
if(st.Contains(ssShift)) mod |= MOD_SHIFT;
if(st.Contains(ssCtrl)) mod |= MOD_CONTROL;
if(st.Contains(ssAlt)) mod |= MOD_ALT;

RegisterHotKey(Handle, MY_HOTKEY_ID, mod, key);

WinAPI
Код
LRESULT hk = SendMessage(HotKey1->Handle, HKM_GETHOTKEY, 0, 0);
DWORD mod = 0;
if(HIBYTE(hk) & HOTKEYF_SHIFT) mod |= MOD_SHIFT;
if(HIBYTE(hk) & HOTKEYF_CONTROL) mod |= MOD_CONTROL;
if(HIBYTE(hk) & HOTKEYF_ALT) mod |= MOD_ALT;
//if(HIBYTE(hk) & HOTKEYF_EXT) mod |= MOD_WIN;     // Не поддерживается HotKey контролом

RegisterHotKey(Handle, MY_HOTKEY_ID, mod, LOBYTE(hk));

PM   Вверх
Great Cornholio
Дата 16.7.2008, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Огромное спасибо. А то я уже решил убиццо( smile ) , когда узнал, что хоткей хранится как число
PM   Вверх
Great Cornholio
Дата 21.7.2008, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ещё вопрос: Как можно #define хоть сколько hotkey? количество задаётся в программе.
PM   Вверх
Great Cornholio
Дата 8.8.2008, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну, кто-нибудь, может, поможет?

PM   Вверх
Stavsandro
Дата 9.8.2008, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Для начала нужно зарегистрировать нужное количество атомов для всех хоткеев.

Делаешь массив типа Word, например Atoms[5], и пишешь такой код:

Код
for(int i = 0; i < 5; i++)
{
    Atoms[i] = GlobalAddAtom("Atom" + IntToStr(i));
}


Затем в цикле зарегистрировать хоткеи:

Код
for(int i = 0; i < 5; i++)
{
    RegisterHotKey(Handle, Atoms[i], fsModifiers, vk);
}
 

Только подставь имена переменных свои. Можно сделать один общий цикл, ну это уже кому как нравится...  smile
PM MAIL WWW ICQ   Вверх
586
Дата 9.8.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



GlobalAddAtom для хуков нужен.
А в приложении идентификатор может быть любой от 0 до 0xBFFF.

Это сообщение отредактировал(а) 586 - 9.8.2008, 15:14
PM   Вверх
Stavsandro
Дата 9.8.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(586 @ 9.8.2008,  15:10)
GlobalAddAtom для хуков нужен.
А в приложении идентификатор может быть любой от 0 до 0xBFFF.

В принципе да, но ИМХО, лучше зарегистрировать уникальный идентификатор..
PM MAIL WWW ICQ   Вверх
586
Дата 9.8.2008, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Не лучше. Это пустая трата глобальных ресурсов. Читай MSDN:
Цитата(MSDN)
id
[in] Specifies the identifier of the hot key. No other hot key in the calling thread should have the same identifier. An application must specify a value in the range 0x0000 through 0xBFFF. A shared dynamic-link library (DLL) must specify a value in the range 0xC000 through 0xFFFF (the range returned by the GlobalAddAtom function). To avoid conflicts with hot-key identifiers defined by other shared DLLs, a DLL should use the GlobalAddAtom function to obtain the hot-key identifier. 

В приложении идентификаторы от 0 до 0xBFFF не могут ни с чем конфликтовать, а их уникальность должен обеспечивать программист. С этим проблем не должно быть.

Это сообщение отредактировал(а) 586 - 9.8.2008, 17:36
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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