Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

Как зациклить приложение без окна   Найти похожие ветки 

 
Хинт ©   (2005-10-26 20:23) [0]

В проекте только один файл DPR (отсутствуют формы). Делаю SetWindowsHookEx на WH_KEYBOARD_LL, а потом необходимо зациклить приложение (проверять одно единственное условие и если true - exit).
Делал просто:
while true do
begin
if ... then exit;
sleep(100);
end;

И таким образом ввод с клавиатуры стал довольно сильно тормозить (задержка около 300мс). В чем дело? Как можно избежать подобного?


 
Боян Георгиев   (2005-10-26 20:28) [1]

Попробуй с Application.ProcessMessages


 
Хинт ©   (2005-10-26 20:56) [2]

Где ты тут видишь Application?


 
Anatoly Podgoretsky ©   (2005-10-26 20:57) [3]

sleep(10);


 
Хинт ©   (2005-10-26 21:03) [4]

И sleep(10) тоже делал - не помогает. И вообще без слипов - тоже самое.


 
Джо ©   (2005-10-26 21:51) [5]

Ну, тогда может рациональнее сделать вручную костяк windows-приложения с невидимым окном и обрабатывать все сообщения явно? В таком роде:

program Project1;

uses
 Windows, Messages;

function WndProc(Wnd : HWND; message : UINT; wParam : Integer; lParam: Integer) : Integer; stdcall;
var
 Handle: HDC;
 ps: PAINTSTRUCT;
begin
 case message of
   WM_PAINT:
     begin
       Handle := BeginPaint(Wnd, ps);
       EndPaint(Wnd, ps);
       result := 0;
     end;

   WM_DESTROY:
     begin
       PostQuitMessage(0);
       result := 0;
     end;

  else
    result := DefWindowProc(Wnd, message, wParam, lParam);
  end;
end;

var
 hWnd     : THandle;
 Msg      : TMsg;
 wndClass : TWndClass;

begin

  wndClass.style          := CS_HREDRAW or CS_VREDRAW;
  wndClass.lpfnWndProc    := @WndProc;
  wndClass.cbClsExtra     := 0;
  wndClass.cbWndExtra     := 0;
  wndClass.hInstance      := hInstance;
  wndClass.hIcon          := LoadIcon(0, IDI_APPLICATION);
  wndClass.hCursor        := LoadCursor(0, IDC_ARROW);
  wndClass.hbrBackground  := HBRUSH(GetStockObject(WHITE_BRUSH));
  wndClass.lpszMenuName   := nil;
  wndClass.lpszClassName  := "Invisible_Window";

  RegisterClass(wndClass);

  hWnd := CreateWindow(
     "Invisible_Window",
     "Invisible Window",
     WS_OVERLAPPEDWINDOW,
     Integer(CW_USEDEFAULT),
     Integer(CW_USEDEFAULT),
     Integer(CW_USEDEFAULT),
     Integer(CW_USEDEFAULT),
     0,
     0,
     hInstance,
     nil);

  //ShowWindow(hWnd, SW_SHOW);
  UpdateWindow(hWnd);

  while(GetMessage(msg, 0, 0, 0)) do
  begin
     TranslateMessage(msg);
     DispatchMessage(msg);
  end;
end.

Или я не так понял задачу?


 
Хинт ©   (2005-10-26 22:17) [6]

2Джо
Спасибо большое. Так все работает как надо.



Страницы: 1 вся ветка

Текущий архив: 2005.11.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.028 c
3-1128229447
Alexx2004
2005-10-02 09:04
2005.11.13
Сортировка в Dbgrid


14-1129747692
ArtemESC
2005-10-19 22:48
2005.11.13
Delphi environment


14-1129976618
alexsis
2005-10-22 14:23
2005.11.13
Siemens M65


14-1130069324
Nikolay M.
2005-10-23 16:08
2005.11.13
Питьевые качества 5-летнего коньяка в алюминиевой фляжке - ?


9-1119733128
Green_Templar
2005-06-26 00:58
2005.11.13
текст в ддроу