![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как зациклить приложение без окна
Хинт © (2005-10-26 20:23:00)В проекте только один файл DPR (отсутствуют формы). Делаю SetWindowsHookEx на WH_KEYBOARD_LL, а потом необходимо зациклить приложение (проверять одно единственное условие и если true - exit).
Делал просто:
while true do
begin
if ... then exit;
sleep(100);
end;
И таким образом ввод с клавиатуры стал довольно сильно тормозить (задержка около 300мс). В чем дело? Как можно избежать подобного?
Хинт (2005-10-26 22:17:00) [1]2Джо
Спасибо большое. Так все работает как надо.
Джо (2005-10-26 21:51:00) [2]Ну, тогда может рациональнее сделать вручную костяк 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 21:03:00) [3]И sleep(10) тоже делал - не помогает. И вообще без слипов - тоже самое.
Anatoly Podgoretsky (2005-10-26 20:57:00) [4]sleep(10);
Хинт (2005-10-26 20:56:00) [5]Где ты тут видишь Application?
Боян Георгиев (2005-10-26 20:28:00) [6]Попробуй с Application.ProcessMessages