Аналог THotKey в lazarus

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

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

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

Аналог THotKey в lazarus

Сообщение Attid »

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

Сообщение SovNarKom »

Я тож не нашёл, да и вообще с хоткеями большие проблемы в Лазаре.
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

решил проблему очень просто хотя почему не сделали компонент не знаю
использую обычный едит в событие 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)
SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

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

Сообщение Attid »

пока нет =)

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

Сообщение SovNarKom »

Хорошо, а то у меня RegisterHotKey ничего не дал, кнопка регистрировалась, а сообжение WM_HOTKEY не приходило...
Ну эт я про глобальный хоткей говорил.
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

не знамо как тут но в дельфе для глобального мне приходилось вручную переделывать TShortCut в другой формат, но там строчек 6 кода.
хотя если ты WM_HOTKEY то тоже надо переделывать =)
SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

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

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

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

ps//
Кстати, каким-то образром с полчаса назад он вдруг перестал рботать и в Laz 0.9.22, хотя до этого всё было нормально... Пересборка тож не помогла... весело.
Аватара пользователя
Alexx2000
постоялец
Сообщения: 490
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи
Контактная информация:

Сообщение Alexx2000 »

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

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

Сообщение SovNarKom »

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

Сообщение SovNarKom »

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

Если использовать 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;


В этом случае всё вроди работает как надо.
Аватара пользователя
GN
новенький
Сообщения: 67
Зарегистрирован: 29.07.2007 07:35:56
Откуда: Казахстан
Контактная информация:

Сообщение GN »

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?
son
новенький
Сообщения: 39
Зарегистрирован: 22.11.2011 11:50:58

Re: Аналог THotKey в lazarus

Сообщение son »

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

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

Добавлено спустя 36 минут 2 секунды:
но и эта конструкция не дает всех вариантов
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Re: Аналог THotKey в lazarus

Сообщение Alex2013 »

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