Форум: "Основная";
Текущий архив: 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