Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Hot Keys


Автор: Kirgston 21.2.2009, 10:23
Всем доброго времени суток! Вот собственно возник такой вопросик... я хочу написать программу так чтобы пользователь мог изменять горячие клавиши во время программы. Как поменять на конкретную клавишу я знаю... а вот как сделать чтобы пользователь сам мог выбрать что его душе угодно? Например есть окошко Едит. Он нажал контрол + О и в окошке вывелось Ctr + O и оно сразу зарегистрировало клавишу... вопросик в том как? =) Как мне узнать что щас ввел юзер? И как я смогу узнать мол... что он щас зажал Контрол и О ? Были идеи с перебором ... мол записать все коды клавиш в скажем AnsiString s[20] а потом сделать перебор... через цыкл фор... ребята я на правильном пути? Заранее очень благодарен!

Автор: THandle 21.2.2009, 16:08
Kirgston, может тебе лучше THotKey использовать?

Автор: Kirgston 21.2.2009, 23:00
Блин  smile я просто даже не знаю как с ним работать... смотрел через поиск ... мне ничего толкового не выдало... разве что примеры работы... смотрел по книгам тоже ничего :( вообще нету этого :( мне бы просто азы узнать... что это такое и с чем его надо кушать smile

Автор: THandle 22.2.2009, 11:37
Да хотя бы вот:
http://articles.org.ru/cn/showdetail.php?cid=7059

И вообще гугл. Можно найти. Да и в справке ж все есть. И исходников у THotKey не много... Можно посмотреть smile

Автор: Kirgston 22.2.2009, 11:46
Что то я очень сильно туплю... извините но...


Код

    UnregisterHotKey(Handle, 0xA000);
    ShortCutToKey(HotKey1->HotKey, key1, st);
    if(st.Contains(ssShift)) mod1 |= MOD_SHIFT;
    if(st.Contains(ssCtrl)) mod1 |= MOD_CONTROL;
    if(st.Contains(ssAlt)) mod1 |= MOD_ALT;
    RegisterHotKey(Handle, 0xA000, mod1, key1);


это я написал в Он Чендж Хоткея... 

Ну и само собой...
unsigned short key1;
TShiftState st;

Также на форме у меня висит ApplicationEvents там в Месаджах есть обработчик. Мол что надо делать когда нажали... Вроде разницы то нету на сколько я понимаю. 
Делать через
void __fastcall wm_hotkey(TWMHotKey&);

Или АпликейшенЭвентс. Т.к. регистрация кнопок идет одна... значит и вызов тот же =)

Но вот ... при нажатии ничего... тоисть вообще ничего...  никакой реакции... также я бы хотел осуществить "запоминание" данных кнопок... но я не знаю как я могу (в каком как бы классе отобразить... интежер или стринг...) отобразить TShiftState ... также я не знаю как можно отобразить ееее данную зарегистрированную кнопку в как бы текст окна ХотКея... просто у меня какая то не совместимость Борланда с виндой... ну он просто не отображает все возможности... то есть подсказки... в ХотКее он отображает всего 3 вида... Align , AutoSize, Anchors ... а бывает такое что вообще ничего не видно...  smile 

Автор: THandle 22.2.2009, 11:54
Цитата(Kirgston @  22.2.2009,  11:46 Найти цитируемый пост)
mod1


Как объявлено? Начальное значение присваиваешь? А то там может мусор оказаться. Выложи тестовый проект что ли...

Автор: Djinn 22.2.2009, 13:16
http://forum.vingrad.ru/index.php?showtopic=219900&view=findpost&p=1612976 тема подобная и пример программы по работе с Thotkey smile мне помогло... может и вам поможет...

Автор: Kirgston 22.2.2009, 13:19
Вот сделал...ну обявлено как unsigned short так требует ShortCutToKey я так и сделал =) 
Нет я не присваивал. Читал в книге мол это за меня делает компилятор в честь того что мол может быть мусор и потому если ничего не задать то компилятор присвоит переменной 0

Автор: THandle 22.2.2009, 13:58
Kirgston, посмотри пример по ссылке которую дал Djinn. Ты не правильно обрабатываешь сообщение. Точнее ты объявляешь просто функцию. Она ничего не ловит.

Цитата(Kirgston @  22.2.2009,  13:19 Найти цитируемый пост)
Читал в книге мол это за меня делает компилятор в честь того что мол может быть мусор и потому если ничего не задать то компилятор присвоит переменной 0 


Локальные переменные нулем никто не инициализирует, это придется делать тебе smile

Автор: Kirgston 22.2.2009, 14:07
Извините ребята просто страничка ... криво обновляется... бывает такое что посты просто не вижу =)

уже разобрался и добил.... =) остается вопрос =) а нету там ничего на подобии текста окна? Просто я если ставлю разрешение на все модификаторы то оно мне выдает такое.... уууу Ctr+Shift+Alt + key а когда я снимаю это оно уже перестает работать... 

Автор: THandle 22.2.2009, 14:32
Kirgston, ничего не понял... но попробую угадать...

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    UnregisterHotKey(Handle, hot);
        mod1 = 0; //обнуляем флаги..
    ShortCutToKey(HotKey1->HotKey, key1, st);
    if(st.Contains(ssShift)) mod1 |= MOD_SHIFT;
    if(st.Contains(ssCtrl)) mod1 |= MOD_CONTROL;
    if(st.Contains(ssAlt)) mod1 |= MOD_ALT;
    if (RegisterHotKey(Handle, hot, mod1, key1))
    MessageBox(Handle, "Good", NULL,NULL);
    else
    MessageBox(Handle, "Bed", NULL,NULL);
}


Кстати, что разрегистрировать будешь при первом нажатии на кнопку?

Автор: Kirgston 22.2.2009, 15:14
Ладненько щас буду пробовать исправить ;) а разрегистрировать надо ;) ибо может быть ошибка когда я зарегистрирую кнопку а она уже там была до этого. Потому в целях безопасности лучше удалить старую кнопку и поставить новую =)

Автор: Kirgston 22.2.2009, 16:31
Ребята большое спасибо =) а есть какая нибудь возможность сохранения кнопок? Чтобы я например перезашел в программу и параметры и кнопки остались? Пробовал с реестром... что то не выходит...

Автор: THandle 22.2.2009, 16:57
Цитата(Kirgston @  22.2.2009,  15:14 Найти цитируемый пост)
а разрегистрировать надо ;) 


Это то понятно, что разрегистрировать надо. Но что при первом нажатии на конопку будет, когда еще ничекго не зарегистрировано?

Kirgston, почему с реестром ничего не вышло? Можно сделать флаг по типу mod1, только or'ом добавлять туда еще последнюю кнопку(с буквой которая) и писать все это как REG_DWORD.

Автор: Kirgston 22.2.2009, 21:24
Ну... что это за программа в которой надо во время работы регистрировать кнопки =) само собой что они с самого старта регистрируются =) так что там проблем нету ;)

Дело в том... что возникло 2 проблемы 1) это в том что я не знаю как записывать переменную TShiftState ... как Строка или как число... ну да ладно это можно и "угадать" хотя предполагаю что лучше будет писать\читать как строку. 2) дело в том что я не знаю как отобразить сие чудо. То есть я не знаю как сделать так чтобы при чтении из реестра программно изменять по получены данным HotKey1->HotKey . Извините что столько тупых вопросов ставлю... просто у меня С++ не совместим с виндой... при работе я не вижу "помощи" при скажем набирании Form1-> . У меня ничего не всплывает, а если появится что то то там будет 1-2 функции. И иследовать С++ я не могу :( и чтобы что то сделать мне просто надо знать конкретно что надо писать :(

Автор: THandle 22.2.2009, 22:56
Ну я тупой... smile 

Код

#include "Registry.hpp"


Запись:

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TRegistry *Reg = new TRegistry;
    TShortCut hk = HotKey1->HotKey;
    Reg->RootKey = HKEY_CURRENT_USER;
    if (Reg->OpenKey("Software\\MyProg", true)) {
        Reg->WriteBinaryData("HotKey", &hk, sizeof(TShortCut));
    }
    delete Reg;
}


Чтение:

Код

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    TRegistry *Reg = new TRegistry;
    TShortCut hk;
    Reg->RootKey = HKEY_CURRENT_USER;
    if (Reg->OpenKey("Software\\MyProg", true)) {
        Reg->ReadBinaryData("HotKey", &hk, sizeof(TShortCut));
        HotKey1->HotKey = hk;
    }
    delete Reg;
}


Хотя можно писать и WriteInteger'ом - TShortCut двухбайтовое число.

Автор: Kirgston 23.2.2009, 14:28
Спасибо вам большое! Всё работает как надо! =) Но вот наверное последний вопросик... ещё с Делфи помню что читал книгу Фленова... там он сказал что при работе с реестром надо в конце ставить Reg.Free; В С++ Reg->Free(); Это якобы закроет реестр и удалит с памяти переменную. Щас я у вас увидел delete Reg . А что она делает? Какие различия между Free & Delete?

Автор: THandle 23.2.2009, 14:52
Kirgston, товарища Фленова фтопку вместе с его книжками... Что Free, что Delete освобождают память за объектом.

Автор: Kirgston 23.2.2009, 15:35
Спасибо! Учту =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)