Аналог THotKey в lazarus
Модератор: Модераторы
- Attid
- долгожитель
- Сообщения: 2588
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
Аналог THotKey в lazarus
не обнаружил подобного зверя в лазаре или его нет ?
- Attid
- долгожитель
- Сообщения: 2588
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
решил проблему очень просто хотя почему не сделали компонент не знаю
использую обычный едит в событие KeyDown:
получается стандартный THotKey
значение ShortCut можно или запоминать отдельно в глобальной переменной или через
использую обычный едит в событие 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]
- Контактная информация:
Attid
Тут проблема, что LCL не передаёт это сообщение форме... На офф. форуме
http://www.lazarus.freepascal.org/index ... ht=hot+key
посоветовали ещё до меня кому-то перекомпилировать с опцией -dPassWin32MessagesToLCL
Не помогло. Но в результате перестал работать TTrackBar...
ps//
Кстати, каким-то образром с полчаса назад он вдруг перестал рботать и в Laz 0.9.22, хотя до этого всё было нормально... Пересборка тож не помогла... весело.
Тут проблема, что 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
- Откуда: Мытищи
- Контактная информация:
SovNarKom писал(а):Attid
Тут проблема, что LCL не передаёт это сообщение форме...
Можно поставить локальную ловушку и обработать данное сообщение. Хотя это и не большой изврат, но ничего другого для обработки любых сообщений я не придумал.
З.Ы. На официальном форуме как я понял проблему решили аналогичным образом
-
SovNarKom
- постоялец
- Сообщения: 389
- Зарегистрирован: 28.05.2005 10:37:39
- Откуда: Воронеж [vrn] [36]
- Контактная информация:
В общем возникла проблема с локальными хуками... Пишу это сообщение для тех, у кого возможно возникнут не же проблемы...
Если использовать SetWindowsHook - всё работает на ура, но так как эта функция "deprecated" решил использовать SetWindowsHookEx
Сначала использовал его вот так (как подсказывает здравый смысл и подавляющее большинсто ресурсов):
Затем
Всё работало, но появлялся ужасающий побочный эффект - во всех программах, запущенных после данной, пропадает возможность изменить язык ввода, лечится это только отключением и включением дополнительных текстовых служб.
Согласно MSDN нужно делать так:
В этом случае всё вроди работает как надо.
Если использовать 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
- Откуда: Казахстан
- Контактная информация:
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?
Re: Аналог THotKey в lazarus
А какой модуль надо подключить, что бы использовать функцию ShortCutToText?
Добавлено спустя 11 минут 51 секунду:
Модeли нужны LCLProc и menus. Но лучше использовать KeyAndShiftStateToKeyString
Добавлено спустя 36 минут 2 секунды:
но и эта конструкция не дает всех вариантов
Добавлено спустя 11 минут 51 секунду:
Модeли нужны LCLProc и menus. Но лучше использовать KeyAndShiftStateToKeyString
Добавлено спустя 36 минут 2 секунды:
но и эта конструкция не дает всех вариантов
Re: Аналог THotKey в lazarus
Если ХотКей нужна в пределах программы то обычно достаточно в основной форме включить KeyPreview:=true; (Включает пред обработку кнопок клавы в форме ДО их обработки в активном компоненте типа TEdit )
И добавить обработчик событий в форме на onKeyDown
------------------------------------------------------------------------------------------------------------
Если глобально в системе ну тогда только глобальный хук(через WinApi) может помочь ...
И добавить обработчик событий в форме на onKeyDown
------------------------------------------------------------------------------------------------------------
Если глобально в системе ну тогда только глобальный хук(через WinApi) может помочь ...
