Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.031 c
14-1084394919
Vasya.ru
2004-05-13 00:48
2004.05.30
А в каких крупных проектах ,мастера, участвовали?


4-1082300345
Privet10
2004-04-18 18:59
2004.05.30
Как управлять PGP


1-1084558995
ИМХО
2004-05-14 22:23
2004.05.30
OLE-автоматизация Outlook а


4-1081938230
Tommy
2004-04-14 14:23
2004.05.30
NTQuerySystemInformation and Threads


3-1084339328
student__
2004-05-12 09:22
2004.05.30
срочно нужен обзор ADO





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский