Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обработка сообщений (WM_SYSCOMMAND) в консольном приложении


Страницы:   1 2

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]

создать окно и цикл обработки сообщений. у консольного приложения нет понятия оконных сообщений. на то оно, понимаишь, и консольное.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо