Аналог THotKey в lazarus

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Аналог THotKey в lazarus

Сообщение Attid » 31.03.2007 22:34:22

не обнаружил подобного зверя в лазаре или его нет ?
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение SovNarKom » 01.04.2007 20:31:45

Я тож не нашёл, да и вообще с хоткеями большие проблемы в Лазаре.
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение Attid » 02.04.2007 12:02:50

решил проблему очень просто хотя почему не сделали компонент не знаю
использую обычный едит в событие KeyDown:


Код: Выделить всё
procedure TfrmOptions.edHotKeyKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  TEdit(Sender).Text := ShortCutToText(ShortCut(Key,Shift));
  Key := 0;
end;



получается стандартный THotKey
значение ShortCut можно или запоминать отдельно в глобальной переменной или через
Код: Выделить всё
TextToShortCut(edHotKey.Text)
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение SovNarKom » 03.04.2007 01:55:43

Attid
а с использованием проблем нет?
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение Attid » 03.04.2007 12:30:04

пока нет =)

использование то стандарное практически.
все как часики. если будут баги отпишу.
потестить можешь в svn версии DoubleCmd :lol:
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение SovNarKom » 03.04.2007 19:39:22

Хорошо, а то у меня RegisterHotKey ничего не дал, кнопка регистрировалась, а сообжение WM_HOTKEY не приходило...
Ну эт я про глобальный хоткей говорил.
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение Attid » 04.04.2007 12:10:19

не знамо как тут но в дельфе для глобального мне приходилось вручную переделывать TShortCut в другой формат, но там строчек 6 кода.
хотя если ты WM_HOTKEY то тоже надо переделывать =)
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение SovNarKom » 04.04.2007 18:27:40

Attid
Тут проблема, что LCL не передаёт это сообщение форме... На офф. форуме

http://www.lazarus.freepascal.org/index ... ht=hot+key

посоветовали ещё до меня кому-то перекомпилировать с опцией -dPassWin32MessagesToLCL
Не помогло. Но в результате перестал работать TTrackBar...

ps//
Кстати, каким-то образром с полчаса назад он вдруг перестал рботать и в Laz 0.9.22, хотя до этого всё было нормально... Пересборка тож не помогла... весело.
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение Alexx2000 » 09.04.2007 15:48:57

SovNarKom писал(а):Attid
Тут проблема, что LCL не передаёт это сообщение форме...

Можно поставить локальную ловушку и обработать данное сообщение. Хотя это и не большой изврат, но ничего другого для обработки любых сообщений я не придумал.
З.Ы. На официальном форуме как я понял проблему решили аналогичным образом
Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 487
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи

Сообщение SovNarKom » 09.04.2007 19:29:20

Alexx2000
Да... ты прав... извратненько конечно... но что поделаешь...
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение SovNarKom » 15.04.2007 18:24:59

В общем возникла проблема с локальными хуками... Пишу это сообщение для тех, у кого возможно возникнут не же проблемы...

Если использовать SetWindowsHook - всё работает на ура, но так как эта функция "deprecated" решил использовать SetWindowsHookEx

Сначала использовал его вот так (как подсказывает здравый смысл и подавляющее большинсто ресурсов):

Код: Выделить всё
Hook:=SetWindowsHookEx(WH_GETMESSAGE, @HotKey_Callback, hInstance, 0);


Затем

Код: Выделить всё
if nCode<0 then Exit(CallNextHookEx(Hook,nCode,wParam,lParam));
if MSG(Pointer(lParam)^).message<>WM_HOTKEY then Exit(0);
{bla bla}
Exit(CallNextHookEx(Hook,nCode,wParam,lParam));


Всё работало, но появлялся ужасающий побочный эффект - во всех программах, запущенных после данной, пропадает возможность изменить язык ввода, лечится это только отключением и включением дополнительных текстовых служб.

Согласно MSDN нужно делать так:
Код: Выделить всё
Hook:=SetWindowsHookEx(WH_GETMESSAGE, @HotKey_Callback, 0, GetCurrentThread);


Код: Выделить всё
function HotKey_Callback(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
i: Integer;
begin
if nCode<0 then Exit(CallNextHookEx(Hook,nCode,wParam,lParam));
if MSG(Pointer(lParam)^).message=WM_HOTKEY then
begin
  {bla bla}
end;
Exit(CallNextHookEx(Hook,nCode,wParam,lParam));
end;


В этом случае всё вроди работает как надо.
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение GN » 22.09.2007 20:21:13

SovNarKom писал(а):Не помогло. Но в результате перестал работать TTrackBar...

У меня тоже не работает TTrackBar. Хотя может я что-то не так делаю.
Например, вот здесь
Код: Выделить всё
procedure TForm1.Button2Click(Sender: TObject);
var
  i: Byte;

begin

  Randomize;
  i := Random(255);
  TB.Position := i;

end;
При нажатии кнопки, ползунок "скачет" на случайную позицию, а вот здесь
Код: Выделить всё
// При изменеии ползунка
procedure TForm1.TBChange(Sender: TObject);
var
  st: ShortString;

begin

  st := IntToStr(TB.Position);
  Label5.Caption := st;

end; 
При изменении ползунка метка равна нулю :(

=========--=========
Добавление:
http://www.freepascal.org/mantis/view.php?id=8589 - вот этот баг. Скажите, обязательно качать 0.9.23 или можно просто заменить файл отвечающий за TTrackBar?
Аватара пользователя
GN
новенький
 
Сообщения: 67
Зарегистрирован: 29.07.2007 07:35:56
Откуда: Казахстан

Re: Аналог THotKey в lazarus

Сообщение son » 03.06.2014 08:51:34

А какой модуль надо подключить, что бы использовать функцию ShortCutToText?

Добавлено спустя 11 минут 51 секунду:
Модeли нужны LCLProc и menus. Но лучше использовать KeyAndShiftStateToKeyString

Добавлено спустя 36 минут 2 секунды:
но и эта конструкция не дает всех вариантов
son
новенький
 
Сообщения: 39
Зарегистрирован: 22.11.2011 11:50:58

Re: Аналог THotKey в lazarus

Сообщение Alex2013 » 23.06.2014 16:03:15

Если ХотКей нужна в пределах программы то обычно достаточно в основной форме включить KeyPreview:=true; (Включает пред обработку кнопок клавы в форме ДО их обработки в активном компоненте типа TEdit )
И добавить обработчик событий в форме на onKeyDown
------------------------------------------------------------------------------------------------------------
Если глобально в системе ну тогда только глобальный хук(через WinApi) может помочь ...
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27

Рейтинг@Mail.ru