Доброго времени суток!
Столкнулся с проблемой: как сворачивать/разворачивать приложение в трей.
Как назначить горячие клавиши для вызова окна приложения из трея?
Модератор: Модераторы
theHook := SetWindowsHookEx(WH_KEYBOARD, @MyHook, hInstance, 0); //установка ловушки
theHook := SetWindowsHookEx(WH_KEYBOARD, @MyHook, hInstance, 0); //установка ловушки
PapaNT писал(а):получаю theHook = 0, что не есть хорошо (хук не устанавливается).
PapaNT писал(а):Является ли данная проблема проблемой среды разработки (использую Lazarus 1.0.10)?
theHook := SetWindowsHookEx(WH_KEYBOARD, @MyHook, hInstance, 0); //установка ловушки
theHook := SetWindowsHookEx(WH_KEYBOARD, @MyHook, hInstance, GetCurrentThreadID); //установка ловушки
theHook := SetWindowsHookEx(WH_KEYBOARD, @MyHook, hInstance, 0); //установка ловушки
PapaNT писал(а):Выдает ошибку GetLastError = 1428.
PapaNT писал(а):Уважаемые коллеги, не посоветуете ли как в Windows 7 обеспечить работоспособность кода:
КОД: ВЫДЕЛИТЬ ВСЁ
theHook := SetWindowsHookEx(WH_KEYBOARD, @MyHook, hInstance, 0); //установка ловушки
???
library hook;
{$mode objfpc}{$H+}
uses
windows, messages, sysutils//, IniFiles
{ you can add units after this };
//модуль Classes удален для экономии размера ДЛЛ
Const
Status_Flag : boolean = False;
var
theHook: THandle; //хэндл ловушки для дальнейшего удаления
VKCode : Word;
//-------------------------------------------------------------------------
Function Status : boolean;
begin
if Status_Flag Then
begin
Status_Flag := False;
Status := True
end
Else
Status := False
end;
//-------------------------------------------------------------------------
function MyHook(nCode, wParam, lParam: integer): Lresult; stdcall;
//var
// X:Integer;
begin
if nCode < 0 then
begin //фигня какая то, передаем дальше
result := CallNextHookEx(theHook, nCode, wParam, lParam);
exit;
end;
//(lParam >$8000) - считаем только нажатие клавиш (GetKeyState(VK_SHIFT)<>0)
if (wParam = VKCode) and (lParam >$8000) then // VKCode - переданный ранее код клавиатуры
begin
// Наши действия по сработке
Status_Flag := True;
end;
result := CallNextHookEx(theHook, nCode, wParam, lParam); //дальше по цепочке
end;
//-------------------------------------------------------------------------
procedure Start(VK_Code : Word);
begin
VKCode := VK_Code; // Установка кода клавиатуры (код кнопки)
theHook := SetWindowsHookEx(WH_KEYBOARD, @MyHook, hInstance, 0); //установка ловушки
if theHook = 0 then // Проверка корректности запуска хука
messageBox(0, PChar(IntToStr(GetLastError)), 'Error!', mb_ok); // Выводим сообщение об ошибке
end;
//-------------------------------------------------------------------------
procedure Remove;
begin
UnhookWindowsHookEx(theHook); //удаление ловушки
end;
//-------------------------------------------------------------------------
//{$R *.res}
Exports
Start index 1 name 'Start',
Remove index 2 name 'Remove',
Status index 3 name 'Status';
begin
end.
PapaNT писал(а):В DLL-ке объявлена функция Status, возвращающая состояние срабатывания хука. Из вызывающей программы я опрашиваю статус по таймеру (10 раз в секунду). Хорош ли примененный стиль или же есть более красивые формы опроса
Попробую немного позднее, но у паскаля жесткая типизация и тут я вижу некоторую проблему с передачей параметров наружу... По крайней мере в общем случае...SeZuka писал(а):Передать в DLL адрес обрабатывающей функции из своей проги, каждый раз при срабатывании хука DLL-ка будет вызывать обработчик из вашей программы и передавать туда параметры.
Вернуться в Обучение Free Pascal
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13