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

Вниз

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

 
SMART_n   (2004-05-19 18:31) [0]

Долго искал информацию по этому поводу в интернете, но так и не нашёл ответа на мой вопрос... Дело вот в чём:
Есть консольное приложение, которое должно постоянно висеть в памяти, принимать нужные мне виндовые сообщения(например WM_COPYDATA), и в зависимости от сообщения выполнять какие-либо операции. Возникли проблемы с реализацией приёма сообщений. Подозреваю, что должно быть что-то типа:

{$APPTYPE CONSOLE}

...

begin
 while GetMessage(...)  do
 begin
   ...    
 end;
end.


Но GetMessage() требует handle, а как получить handle консольной программы, я не знаю...


 
Digitman ©   (2004-05-19 18:35) [1]


> как получить handle консольной программы


нет у нее никаких handle, тех что ты подразумеваешь

сам создавай окно вызовом CreateWindow[Ex], результат вызова этой ф-ции и есть тот самый handle, что тебе нужен


 
WebErr ©   (2004-05-19 18:56) [2]


> Digitman ©   (19.05.04 18:35) [1]
> нет у нее никаких handle, тех что ты подразумеваешь

Полный бред! :))))

По сабжу:
Чтобы получить handle консольной программы, нужно создать её с помощью AllocConsole и получить при этом её HCONSOLE. Получить HCONSOLE у уже запущенной консоли тоже можно, см. help - сам не помню. Вот! И не забудьте перед AllocConsole сделать FreeConsole!


 
WebErr ©   (2004-05-19 18:59) [3]

Потом получаем её STDIN/OUT и впрёд! :))))


 
nikkie ©   (2004-05-19 21:38) [4]

Удалено модератором


 
begin...end ©   (2004-05-19 21:40) [5]

Удалено модератором


 
nikkie ©   (2004-05-19 21:57) [6]

>begin...end
ты хотел спросить кто такой L, видимо? :)
выбор не так богат... вроде бы все сходятся, что основная отличительная черта L - воинственность.


 
begin...end ©   (2004-05-19 22:00) [7]

Нет, я хотел спросить, кто им является в этой ветке.


 
SMART_n   (2004-05-19 23:56) [8]

Пробовал использовать функцию GetConsoleWindow() для получения handle, но сообщения всё равно не принимаются.


 
nikkie ©   (2004-05-20 00:08) [9]

>Пробовал использовать функцию GetConsoleWindow() для получения handle
на всякий случай:
Requirements
 Windows NT/2000/XP: Included in Windows 2000 and later.
 Windows 95/98/Me: Unsupported.

>но сообщения всё равно не принимаются.
зря ты проигнорировал [1]


 
SMART_n   (2004-05-20 00:19) [10]

Если уж создавать окно, то для создания невидимого окна наверное стоит использовать AllocateHWnd(). Но есть ли вообще смысл делать приложение консольным? Выигрыш в размере не очень большой, а дополнительных трудностей - достаточно...


 
nikkie ©   (2004-05-20 00:51) [11]

>для создания невидимого окна наверное стоит использовать AllocateHWnd().
можно
>Но есть ли вообще смысл ...
тебе видней
>делать приложение консольным? Выигрыш в размере не очень большой
ошибку терминологическую допускаешь. консольное приложение от не консольного отличается одной строчкой
{$APPTYPE CONSOLE}
то, что ты имеешь в виду обычно называют "без использования VCL" или "на WinAPI".


 
GanibalLector ©   (2004-05-20 00:59) [12]

2 SMART_n   (19.05.04 18:31)  
Ну,во первых у меня теже траблы...
Читать здесь http://delphimaster.net/view/4-1084913143/

По поводу хендла.Все просто :GetForegroundWindow!!!

А вот ты лучше расскажи что ты будешь писать здесь
begin
while GetMessage(...)  do
begin
  ...    
end;


 
nikkie ©   (2004-05-20 01:10) [13]

еще один советчик...
>По поводу хендла.Все просто :GetForegroundWindow!!!
предлагаю не менее простой, а главное дающий более стабильные результаты метод: GetDesktopWindow!
>А вот ты лучше расскажи что ты будешь писать здесь
в самом деле... осталось решить чего с ним дальше делать.


 
Digitman ©   (2004-05-20 08:24) [14]

Удалено модератором


 
Digitman ©   (2004-05-20 08:42) [15]


> SMART_n   (20.05.04 00:19) [10]
> Если уж создавать окно, то для создания невидимого окна
> наверное стоит использовать AllocateHWnd(). Но есть ли вообще
> смысл делать приложение консольным? Выигрыш в размере не
> очень большой, а дополнительных трудностей - достаточно...


AllocateHWnd() "тянет" за собой в проект кучу модулей, начиная с самого монстрообразного - FORMS.PAS .. не возьмусь говорить за Д7, но в Д5 эта ф-ция определена и реализована именно в FORMS.PAS

не имеет смысла использовать AllocateHWnd() в консольном приложении, отвечающем требованиям минимизации исп.ресурсов - все преимущества такого подхода в этом случае будут сведены на нет

если же тебе нужно просто приложение с невидимым окном, то создай обычное GUI-приложение и либо выкинь из него все формы :

Application.Initialize;
Application.OnMessage := ...;
while not Application.Terminated and WaitMessage do
  Application.ProcessMessages;
Application.Run;

либо перед созданием главной формы установи св-во

Application.Initialize;
Application.ShowMainForm := False;
Application.CreateForm(..);
Application.Run;


 
Digitman ©   (2004-05-20 08:47) [16]


> SMART_n


кр.того, если даже в конс.процессе создать окно и закрутить цикл ожидания/выборки сообщений, то такой процесс не сможет реагировать на интерактивные события польз.конс.ввода, ибо осн.код.поток занят циклом и из-за этого не может вызывать блокирующие ф-ции конс.ввода .. т.о., при таком подходе придется организовывать доп.код.поток, в котором, собственно, и создавать окно и закручивать цикл .. осн. же поток после создания дополнительного,  волен "висеть" сколь угодно долго на блок.ф-циях ввода, с тем чтобы по интерактивной команде юзера можно было терминировав доп.код.поток корректно завершить процесс в требуемый юзеру момент времени


 
SMART_n   (2004-05-20 10:15) [17]


> AllocateHWnd() "тянет" за собой в проект кучу модулей, начиная
> с самого монстрообразного - FORMS.PAS .. не возьмусь говорить
> за Д7, но в Д5 эта ф-ция определена и реализована именно
> в FORMS.PAS

В D7 эта функция определена в classes.pas, но в итоге вызывает CreateWindowEx().

Вообще я решил отказаться от идей использования консольного приложения, сама по себе консоль мне не особо нужна, попробую воспользоваться советом Digitman и использовать GUI приложение без форм...


 
GLFox   (2004-05-20 10:21) [18]

Кстати, выдержка из хелпа:
hWnd
Identifies the window whose messages are to be retrieved. One value has a special meaning:

Value Meaning
NULL GetMessage retrieves messages for any window that belongs to the calling thread and thread messages posted to the calling thread



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

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

Наверх




Память: 0.51 MB
Время: 0.029 c
7-1082457244
FREEMAN82
2004-04-20 14:34
2004.05.30
передача параметров в поток


6-1081799593
DED_MustDie
2004-04-12 23:53
2004.05.30
non-blocking


1-1085047782
PHENIX physicist
2004-05-20 14:09
2004.05.30
выплывающая форма


11-1072086191
Tenac
2003-12-22 12:43
2004.05.30
Что будет после KOL? И как сново сделать все как было


8-1080216881
nomshar
2004-03-25 15:14
2004.05.30
Апросксимация функций кривых