Доброго времени суток!
Столкнулся с проблемой: как сворачивать/разворачивать приложение в трей.
Как назначить горячие клавиши для вызова окна приложения из трея?
			
		Модератор: Модераторы
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
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1