![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Delphins |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 10.8.2005 Где: Россия, Краснодар Репутация: нет Всего: нет |
Так как приложение без формы то незнаю как обрабатывать сообщения о том что пришли данные. Оповещение приходит ввиде сообщений Windows.
WSAAsyncSelect( Sock, Handle, WM_SOCKET, FD_ACCEPT + FD_READ + FD_CLOSE ); Так задаю что сообщение WM_SOCKET при приеме данных, соеденении и отключении. А как потом их обработать? И что писать в Handle? Как его узнать? Вопрос в теме WinApi т.к. впорос не по сокету а потому как обработать сообщения и как получить хэндл программы. Юнит forms подключать нельзя! |
|||
|
||||
| rsm |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 999 Регистрация: 16.3.2005 Репутация: 1 Всего: 62 |
Попробуй так:
|
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Сообщения посылаются именно окну. Без окна ты их не получишь.
Создай элементарное окно, но не показывай его, а только используй для ловли событий. |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: нет Всего: 329 |
а application.handle не подойдёт, application как окно получает сообщения или нет?
|
|||
|
||||
| Snowy |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Написано же - без формы.
TApplication живет именно в нем. |
||||
|
|||||
| rsm |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 999 Регистрация: 16.3.2005 Репутация: 1 Всего: 62 |
Получит, но далеко не все. Например, можно получить общесистемные сообщения типа WM_HOTKEY или WM_ENDSESSION. |
|||
|
||||
| Song |
|
|||
![]() Sysman.ru ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1095 Регистрация: 2.6.2002 Репутация: нет Всего: 4 |
Сказано ж: получать сообщения могут только окна! -------------------- Прежде чем сказать "Невозможно", подумай, прав ли ты |
|||
|
||||
| rsm |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 999 Регистрация: 16.3.2005 Репутация: 1 Всего: 62 |
Да ну?
Если лень компилировать, в аттаче есть готовый ЕХЕшник. Присоединённый файл ( Кол-во скачиваний: 9 )
hotkeyx.zip 4,54 Kb |
||||
|
|||||
| Delphins |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 10.8.2005 Где: Россия, Краснодар Репутация: нет Всего: нет |
Спасиба.
|
|||
|
||||
| Song |
|
|||
![]() Sysman.ru ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1095 Регистрация: 2.6.2002 Репутация: нет Всего: 4 |
ок, отредактировал
RegisterHotKey(0, MY_HOT_KEY, MOD_WIN + MOD_ALT, VK_F11); Обрати внимание на жирный участок строчки из твоего примера. Это ничто иное как HWND_DESKTOP ! Т.е. сообщения у тебя получает окно эксплорера! От этого суть не меняется: сообщения получают только окна. Это сообщение отредактировал(а) Girder - 23.8.2005, 12:45 -------------------- Прежде чем сказать "Невозможно", подумай, прав ли ты |
|||
|
||||
| Song |
|
|||
![]() Sysman.ru ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1095 Регистрация: 2.6.2002 Репутация: нет Всего: 4 |
А окно, получив твоё сообщение, перенаправляет его в оконную процедуру, где ты его и забираешь своим кустарным методом.
-------------------- Прежде чем сказать "Невозможно", подумай, прав ли ты |
|||
|
||||
| rsm |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 999 Регистрация: 16.3.2005 Репутация: 1 Всего: 62 |
Ну эт я знаю. Просто использую сразу значение, а не именованную константу.
Сообщения получают не только окна, но еще и треды запущенных в системе процессов. Хотите доказательств? Их есть у меня!
Перевод выделенного курсивом предложения: Если этот параметр равен нулю, сообщение WM_HOTKEY посылается в тред, вызвавший функцию RegisterHotKey, и должно быть обработано в цикле обработки сообщений. |
||||||||
|
|||||||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Окно! Без окна тут не обойтись. |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: нет Всего: 110 |
внесу-ка я разнообразие
окна вообще не получают сообщений сообщения всегда посылаются в очередь потока если используются функции Send(Post)Message, сначала происходит определение потока, создавшего окно, а потом сообщение кидается в его (потока) очередь сообщений и оттуда с помощью DispatchMessage вызывается оконная процедура, а окно ничего никуда не перенаправляет... сообщение вообще можно отослать напрямую потоку с помощью функции PostThreadMessage (как, впрочем, и происходит в большинстве программ с сообщение WM_QUIT при закрытии главного окна) -------------------- qqq |
|||
|
||||
| rsm |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 999 Регистрация: 16.3.2005 Репутация: 1 Всего: 62 |
maxim1000
Спасибо, наконец кто-то прояснил ситуацию! |
|||
|
||||
| Snowy |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
В данном случае это GetCurrentTreadId() Сообщение потоку будет отправлено через PostThreadMessage. С оконными сообщениями такой вариант не подходит. SendMessage потоку не сделаешь...
В принципе, если использовать WSAEventSelect, то можно и без окна, через WSAWaitForMultipleEvents. Для однопоточных оконных приложений не годится, но т.к. у тебя окна нет, то с таймаутом должно подойти. В крайнем случае можно сделать в несколько потоков. Добавлено @ 16:42 Во, пока писал, уже сообщений набралось...
Только для Post сообщений. Иначе кто нам ответ даст?...
WM_QUIT это отдельная песня. Это вообще не сообщение, а установка флага выхода. |
||||||||||
|
|||||||||||
| Snowy |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Ну это уж слишком радикально. К тому же дело не в том, кто их получает, а кому они отправляются. А отправляются сообщения окнам.
А он их пересылает оконным процедурам, согласно хэндла окна. Не делает этого только при обработке PostTreadMessage, поскольку такие сообщения не адресованы окну и не содержат (точнее содержат нулевой) хэнд окна. Соответственно Dispatc не вызывается, т.к. нет у нас такого окна.
Именно Post. В случае с Send мы ждем ответа. А Send потоку не делается - только окну.
Можно, но зачем? Этот вариант достаточно редкий и мало используемый. Исключая разве что PostQuitMessage, которая используется в основном именно в этом виде. И в данном случае о сообщении вообще говорить можно только поверхностно, т.к. по сути реализации PostQuitMessage даже не явлется сообщением в полном смысле этого слова.
Говоря же об оконных сообщениях, без окна обойтись не получится. Бывают конечно извращения, но только для отправки. В данном же случае мы рассматриваем получение сообщения, которое нам отправляют банальным SendMessage. А он требует хэндл окна, который мы должны ему предоставить. "иначе ничего не получится" (с) "Утомленные солнцем" |
||||||||||
|
|||||||||||
| maxim1000 |
|
||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: нет Всего: 110 |
<почти оффтопик>кстати, специально для тех случаев, когда хочется поработать с окном или когда используемые средства требуют окна, можно использовать message-window - появилось, по-моему, то ли в 2000, то ли в XP
что правда, то правда
это я, похоже сгоряча написал... механизм SendMessage, судя по всему, отличается от PostMessage вполне возможно, он даже не проходит через цикл сообщений иначе пришлось бы городить слишком сложную схему для получения результата оконной процедуры...
с WSAWaitForMultipleEvents не работал, но увидел в MSDN такую фразу:
как мне кажется, это значит, что эти события можно ждать так же, как и обычные события Windows, а значит, можно ждать одновременно их и сообщения для окон в одном цикле с помощью MsgWaitForMultipleObjectsEx... -------------------- qqq |
||||||||||
|
|||||||||||
| Dimannn |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 318 Регистрация: 14.4.2005 Где: Владимир Репутация: нет Всего: 1 |
А что лень окно создать?
Вот вам и окно, и формс не использовали. И посылейте чё хотете и куда хотите -------------------- Хотите быстро и без проблем опубликовать вашу программу в сети за 5 минут? Тогда потратьте пару минут чтобы посмотреть, что предлагает OpenProject.org.ru |
|||
|
||||
| rsm |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 999 Регистрация: 16.3.2005 Репутация: 1 Всего: 62 |
В общем пришли к тому, с чего начали - сообщение получают и окна, и безоконные треды.
"Так я и думал! Именно так я и полагал!" © проф. Преображенский |
|||
|
||||
| Snowy |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Как это не проходят? Очень даже проходят. Просто ответ, который мы выстреливаем на запрос оконного сообщения игнорируется, как не запрошенный. В остальном все так же. Но обычно Post не применяют к оконным сообщениям. Он нужен только для уведомления, а для взаимодействия нужен SendMessage.
Это решение и было высказано в первую очередь.
Нет, пришли мы к тому, что нужно создавать окно. Обсуждение получения сообщений тредами пошло оффтопом. Никакого отношения к теме оно тут не имеет - просто неприменимо никак. Либо окно, либо ждать евенты. |
||||||
|
|||||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
Так точно. SendMessage посылает сообщение напрямую оконной процедуре, PostMessage помещает сообщение в очередь сообщений. -------------------- |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
SendMessage тоже ставит в очередь. Отличие в том, что Post не ожидает ответа. Просто ставит в очередь. А SendMessage ставит в очередь и ждет окончания обработки. Поэтому через Post не шлют сообщения, требующие возврата результата. |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
Вряд ли. The SendMessage function sends the specified message to a window or windows. It calls the window procedure for the specified window and does not return until the window procedure has processed the message. Remarks If the specified window was created by the calling thread, the window procedure is called immediately as a subroutine. If the specified window was created by a different thread, the system switches to that thread and calls the appropriate window procedure. Messages sent between threads are processed only when the receiving thread executes message retrieval code. The sending thread is blocked until the receiving thread processes the message. However, the sending thread will process incoming nonqueued messages while waiting for its message to be processed. -------------------- |
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |