Главная страница
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.047 c
14-1129896563
Prohodil Mimo
2005-10-21 16:09
2005.11.13
Где скачать сервис паки и апдейты на Delphi 2005?


1-1129537731
Delphir
2005-10-17 12:28
2005.11.13
JPEG с поддержкой Unicode


4-1126463830
Still Swamp
2005-09-11 22:37
2005.11.13
Разгородить парралельное исполненийе


4-1126766341
Новый
2005-09-15 10:39
2005.11.13
Прогрес процесса и независимые процессы


2-1130341177
Dudee
2005-10-26 19:39
2005.11.13
Ещё одна беда со StringGrid ом