![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработка сообщений (WM_SYSCOMMAND) в консольном приложении
kernel © (2008-04-08 19:12:00)Обычно все это делается циклом с TranslateMessage, DispatchMessage. Но в данном случае, программа не стоит на месте, а все время выполняет какие-то действия, следуя пользовательским требованиям, т.е. никаких циклов нет. Собстно вопрос: как еще можно задействовать обработку WM_SYSCOMMAND в консольке?
Palladin (2008-04-10 22:26:00) [21]
> kernel © (10.04.08 20:02) [10]
ты издеваешься?
kernel (2008-04-10 20:02:00) [22]Вообще я думал перехватить WM_SYSCOMMAND для предотвращения запуска ScreenSaver. Но видимо у меня это не получится без окна :/
Игорь Шевченко (2008-04-08 22:51:00) [23]
> Собстно вопрос: как еще можно задействовать обработку WM_SYSCOMMAND
> в консольке?
Собстна, встречный вопрос - а кто их, сообщения, посылать-та будет ?
palva (2008-04-08 22:37:00) [24]palva © (08.04.08 20:26) [7]
Например, так:
{$APPTYPE CONSOLE}
uses Windows, Messages;
var
th, tid: DWORD;
w: Integer;
function treadfun(p: Pointer): DWORD; stdcall;
var
Msg: TMsg;
begin
PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE);
while True do begin // Этот цикл будет висеть и ждать сообщений
GetMessage(Msg, 0, 0, 0);
WriteLn('Echo wParam: ', Msg.wParam);
if Msg.wParam = 999 then break;
end;
Result := 0
end;
begin // основной поток посылает сообщения
th := CreateThread(Nil, 0, @treadfun, Nil, 0, tid);
Sleep(500);
WriteLn('Input wParam (999 for ending)');
while True do begin
ReadLn(w);
PostThreadMessage(tid, WM_SYSCOMMAND, w, 0);
if w = 999 then break;
end;
WriteLn('Press "Enter" for ending');
ReadLn
end.
palva (2008-04-08 20:26:00) [25]Окно можно не создавать. Но нужно периодически опрашивать очередь сообщений. Проще всего это сделать в отдельном потоке.
Palladin (2008-04-08 20:02:00) [26]:) а по этому поводу смотри SetConsoleCtrlHandler
Семеныч (2008-04-08 19:57:00) [27]kernel © (08.04.08 19:31) [2]
> В приложении используются SysUtils, Windows. Возможно ли создать
> невидимое окно без подключения других юнитов?
Еще Messages - и создавайте на здоровье. Размер программы это не увеличит.
kernel (2008-04-08 19:53:00) [28]В ыключать \ Включать заставку? Но ведь неизвестно каким способом пользователь выйдет из программы, т.е. если я отключу заставку, мне нужно будет при выходе из программы вернуть все на место - а этого может и не произойти.
Palladin (2008-04-08 19:42:00) [29]А для этого достаточно почитать про SystemParametersInfo
kernel (2008-04-08 19:31:00) [30]В приложении используются SysUtils, Windows. Возможно ли создать невидимое окно без подключения других юнитов? Вообще мне это нужно, чтобы во время работы консольки не появился screensaver :)
Palladin (2008-04-08 19:19:00) [31]создать окно и цикл обработки сообщений. у консольного приложения нет понятия оконных сообщений. на то оно, понимаишь, и консольное.