Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка сообщений Windows. В не GUI программе. Как? 
:(
    Опции темы
Delphins
Дата 14.8.2005, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 10.8.2005
Где: Россия, Краснодар

Репутация: нет
Всего: нет



Так как приложение без формы то незнаю как обрабатывать сообщения о том что пришли данные. Оповещение приходит ввиде сообщений Windows.
WSAAsyncSelect( Sock, Handle, WM_SOCKET, FD_ACCEPT + FD_READ + FD_CLOSE );
Так задаю что сообщение WM_SOCKET при приеме данных, соеденении и отключении.
А как потом их обработать? И что писать в Handle? Как его узнать?
Вопрос в теме WinApi т.к. впорос не по сокету а потому как обработать сообщения и как получить хэндл программы. Юнит forms подключать нельзя!
PM MAIL ICQ Skype MSN   Вверх
rsm
Дата 14.8.2005, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 1
Всего: 62



Попробуй так:
Код

var
    msg: TMSG;
begin
    while GetMessage(msg, 0, 0, 0) do
        begin
            // тут обрабатываешь сообщение
        end;    

PM MAIL   Вверх
Snowy
Дата 15.8.2005, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Сообщения посылаются именно окну. Без окна ты их не получишь.
Создай элементарное окно, но не показывай его, а только используй для ловли событий.
PM MAIL   Вверх
Akella
Дата 15.8.2005, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



а application.handle не подойдёт, application как окно получает сообщения или нет?
PM MAIL   Вверх
Snowy
Дата 15.8.2005, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Цитата(dsergey @ 15.8.2005, 09:47)
а application.handle не подойдёт, application как окно получает сообщения или нет?

Написано же - без формы.
Цитата(Delphins @ 14.8.2005, 20:23)
Юнит forms подключать нельзя!

TApplication живет именно в нем.
PM MAIL   Вверх
rsm
Дата 15.8.2005, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 1
Всего: 62



Цитата(Snowy @ 15.8.2005, 11:26)
Сообщения посылаются именно окну. Без окна ты их не получишь.

Получит, но далеко не все. Например, можно получить общесистемные сообщения типа WM_HOTKEY или WM_ENDSESSION.
PM MAIL   Вверх
Song
Дата 16.8.2005, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: нет
Всего: 4



smile
Сказано ж: получать сообщения могут только окна!


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
rsm
Дата 16.8.2005, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 1
Всего: 62



Цитата(Song @ 16.8.2005, 09:50)
Сказано ж: получать сообщения могут только окна!

Да ну? smile Попробуй-ка сперва скомпилить и запустить на выполнение вот этот код.
Код

program hokeyx;

uses
   Windows, Messages;

const
   MY_HOT_KEY = 7077;

var
   msg: TMSG;

begin
   RegisterHotKey(0, MY_HOT_KEY, MOD_WIN + MOD_ALT, VK_F11);
   while GetMessage(msg, 0, 0, 0) do
      if msg.message = WM_HOTKEY then
         if msg.wParam = MY_HOT_KEY then
            begin
               if MessageBox(0, 'Нажаты клавиши Win+Alt+F11.' + #13 +
                  'Продолжить контроль клавиш?',
                  'Внимание',
                  MB_TOPMOST + MB_ICONINFORMATION + MB_YESNO) = ID_YES then
                     continue;
               UnregisterHotKey(0, MY_HOT_KEY);
               exit;
            end;
end.

Если лень компилировать, в аттаче есть готовый ЕХЕшник.

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  hotkeyx.zip 4,54 Kb
PM MAIL   Вверх
Delphins
Дата 16.8.2005, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 10.8.2005
Где: Россия, Краснодар

Репутация: нет
Всего: нет



Спасиба. smile
PM MAIL ICQ Skype MSN   Вверх
Song
Дата 23.8.2005, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: нет
Всего: 4



ок, отредактировал smile

RegisterHotKey(0, MY_HOT_KEY, MOD_WIN + MOD_ALT, VK_F11);

Обрати внимание на жирный участок строчки из твоего примера.
Это ничто иное как HWND_DESKTOP !

Т.е. сообщения у тебя получает окно эксплорера!
От этого суть не меняется: сообщения получают только окна.

Это сообщение отредактировал(а) Girder - 23.8.2005, 12:45


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Song
Дата 23.8.2005, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: нет
Всего: 4



А окно, получив твоё сообщение, перенаправляет его в оконную процедуру, где ты его и забираешь своим кустарным методом.


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
rsm
Дата 23.8.2005, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 1
Всего: 62



Цитата(Song @ 23.8.2005, 12:29)
Это ничто иное как HWND_DESKTOP

Ну эт я знаю. Просто использую сразу значение, а не именованную константу.

Цитата(Song @ 23.8.2005, 12:29)
сообщения у тебя получает окно эксплорера

Сообщения получают не только окна, но еще и треды запущенных в системе процессов. Хотите доказательств? Их есть у меня!

Цитата

Код

BOOL RegisterHotKey(

    HWND hWnd,    // window to receive hot-key notification
    int id,    // identifier of hot key
    UINT fsModifiers,    // key-modifier flags
    UINT vk    // virtual-key code
   );

Parameters

hWnd

Identifies the window that will receive WM_HOTKEY messages generated by the hot key. If this parameter is NULL, WM_HOTKEY messages are posted to the message queue of the calling thread and must be processed in the message loop.


Перевод выделенного курсивом предложения:
Если этот параметр равен нулю, сообщение WM_HOTKEY посылается в тред, вызвавший функцию RegisterHotKey, и должно быть обработано в цикле обработки сообщений.
PM MAIL   Вверх
Snowy
Дата 23.8.2005, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Цитата

int WSAAsyncSelect (
    SOCKET s,
    HWND hWnd,
    unsigned int wMsg,
    long lEvent
  );
Parameters:
hWnd - A handle identifying the window which should receive a message when a network event occurs.

Окно! Без окна тут не обойтись.
PM MAIL   Вверх
maxim1000
Дата 23.8.2005, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



внесу-ка я разнообразие
окна вообще не получают сообщений smile
сообщения всегда посылаются в очередь потока
если используются функции Send(Post)Message, сначала происходит определение потока, создавшего окно, а потом сообщение кидается в его (потока) очередь сообщений
и оттуда с помощью DispatchMessage вызывается оконная процедура, а окно ничего никуда не перенаправляет...
сообщение вообще можно отослать напрямую потоку с помощью функции PostThreadMessage (как, впрочем, и происходит в большинстве программ с сообщение WM_QUIT при закрытии главного окна)


--------------------
qqq
PM WWW   Вверх
rsm
Дата 23.8.2005, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 1
Всего: 62



maxim1000
Спасибо, наконец кто-то прояснил ситуацию! smile
PM MAIL   Вверх
Snowy
Дата 23.8.2005, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Цитата(Song @ 23.8.2005, 10:29)
Это ничто иное как HWND_DESKTOP !

Цитата(rsm @ 23.8.2005, 15:12)
Ну эт я знаю. Просто использую сразу значение, а не именованную константу.

В данном случае это GetCurrentTreadId()
Сообщение потоку будет отправлено через PostThreadMessage.
С оконными сообщениями такой вариант не подходит.
SendMessage потоку не сделаешь...

Цитата(Snowy @ 23.8.2005, 15:48)
Окно! Без окна тут не обойтись.

В принципе, если использовать WSAEventSelect, то можно и без окна, через WSAWaitForMultipleEvents.
Для однопоточных оконных приложений не годится, но т.к. у тебя окна нет, то с таймаутом должно подойти.
В крайнем случае можно сделать в несколько потоков.

Добавлено @ 16:42
Во, пока писал, уже сообщений набралось...
Цитата(maxim1000 @ 23.8.2005, 15:55)
DispatchMessage вызывается оконная процедура, а окно ничего никуда не перенаправляет...
сообщение вообще можно отослать напрямую потоку с помощью функции PostThreadMessage

Только для Post сообщений. Иначе кто нам ответ даст?...
Цитата(maxim1000 @ 23.8.2005, 15:55)
PostThreadMessage (как, впрочем, и происходит в большинстве программ с сообщение WM_QUIT при закрытии главного окна)

WM_QUIT это отдельная песня. Это вообще не сообщение, а установка флага выхода.
PM MAIL   Вверх
Snowy
Дата 23.8.2005, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Цитата(maxim1000 @ 23.8.2005, 15:55)
окна вообще не получают сообщений

Ну это уж слишком радикально.
К тому же дело не в том, кто их получает, а кому они отправляются. А отправляются сообщения окнам.
Цитата(maxim1000 @ 23.8.2005, 15:55)
сообщения всегда посылаются в очередь потока

А он их пересылает оконным процедурам, согласно хэндла окна.
Не делает этого только при обработке PostTreadMessage, поскольку такие сообщения не адресованы окну и не содержат (точнее содержат нулевой) хэнд окна. Соответственно Dispatc не вызывается, т.к. нет у нас такого окна.
Цитата(maxim1000 @ 23.8.2005, 15:55)
сообщение вообще можно отослать напрямую потоку с помощью функции PostThreadMessage

Именно Post. В случае с Send мы ждем ответа. А Send потоку не делается - только окну.
Цитата(maxim1000 @ 23.8.2005, 15:55)
сообщение вообще можно отослать напрямую потоку с помощью функции PostThreadMessage

Можно, но зачем? Этот вариант достаточно редкий и мало используемый. Исключая разве что PostQuitMessage, которая используется в основном именно в этом виде. И в данном случае о сообщении вообще говорить можно только поверхностно, т.к. по сути реализации PostQuitMessage даже не явлется сообщением в полном смысле этого слова.
Цитата
В действительности PostQuitMessage не помещает сообщение ни в одну из очередей структуры THREADINFO. Эта функция просто устанавливает флаг пробуждения QS_QUIT  и элемент nExitCode структуры THREADINFO.

Говоря же об оконных сообщениях, без окна обойтись не получится.
Бывают конечно извращения, но только для отправки.
В данном же случае мы рассматриваем получение сообщения, которое нам отправляют банальным SendMessage. А он требует хэндл окна, который мы должны ему предоставить.
"иначе ничего не получится" (с) "Утомленные солнцем"
PM MAIL   Вверх
maxim1000
Дата 23.8.2005, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



<почти оффтопик>кстати, специально для тех случаев, когда хочется поработать с окном или когда используемые средства требуют окна, можно использовать message-window - появилось, по-моему, то ли в 2000, то ли в XP
Цитата
SendMessage потоку не сделаешь...

Цитата
Только для Post сообщений. Иначе кто нам ответ даст?...

что правда, то правда
Цитата
если используются функции Send(Post)Message

это я, похоже сгоряча написал...
механизм SendMessage, судя по всему, отличается от PostMessage
вполне возможно, он даже не проходит через цикл сообщений
иначе пришлось бы городить слишком сложную схему для получения результата оконной процедуры...
Цитата
В принципе, если использовать WSAEventSelect, то можно и без окна, через WSAWaitForMultipleEvents.
Для однопоточных оконных приложений не годится, но т.к. у тебя окна нет, то с таймаутом должно подойти.

с WSAWaitForMultipleEvents не работал, но увидел в MSDN такую фразу:
Цитата
In 32-bit environments, event object–related functions, including WSACreateEvent, WSACloseEvent, WSASetEvent, WSAResetEvent, and WSAWaitForMultipleEvents are directly mapped to the corresponding native Windows functions, using the same function name, but without the WSA prefix.

как мне кажется, это значит, что эти события можно ждать так же, как и обычные события Windows, а значит, можно ждать одновременно их и сообщения для окон в одном цикле с помощью MsgWaitForMultipleObjectsEx...



--------------------
qqq
PM WWW   Вверх
Dimannn
Дата 23.8.2005, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 14.4.2005
Где: Владимир

Репутация: нет
Всего: 1



А что лень окно создать?
Код

handle:=CreateWindow('BUTTON','',0,0,0,0,0,0,0,HInstance,nil);


Вот вам и окно, и формс не использовали.
И посылейте чё хотете и куда хотите smile


--------------------
Хотите быстро и без проблем опубликовать вашу программу в сети за 5 минут?
Тогда потратьте пару минут чтобы посмотреть, что предлагает OpenProject.org.ru
PM MAIL ICQ   Вверх
rsm
Дата 23.8.2005, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 1
Всего: 62



В общем пришли к тому, с чего начали - сообщение получают и окна, и безоконные треды.
"Так я и думал! Именно так я и полагал!" © проф. Преображенский smile
PM MAIL   Вверх
Snowy
Дата 24.8.2005, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Цитата(maxim1000 @ 23.8.2005, 17:55)
механизм SendMessage, судя по всему, отличается от PostMessage
вполне возможно, он даже не проходит через цикл сообщений
иначе пришлось бы городить слишком сложную схему для получения результата оконной процедуры...

Как это не проходят? Очень даже проходят. Просто ответ, который мы выстреливаем на запрос оконного сообщения игнорируется, как не запрошенный.
В остальном все так же. Но обычно Post не применяют к оконным сообщениям. Он нужен только для уведомления, а для взаимодействия нужен SendMessage.

Цитата(Dimannn @ 23.8.2005, 18:08)
А что лень окно создать?

Это решение и было высказано в первую очередь.

Цитата(rsm @ 23.8.2005, 19:18)
В общем пришли к тому, с чего начали - сообщение получают и окна, и безоконные треды.

Нет, пришли мы к тому, что нужно создавать окно.
Обсуждение получения сообщений тредами пошло оффтопом.
Никакого отношения к теме оно тут не имеет - просто неприменимо никак. Либо окно, либо ждать евенты.
PM MAIL   Вверх
Демо
Дата 9.3.2006, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Цитата(maxim1000 @ 23.8.2005, 17:55 Найти цитируемый пост)
механизм SendMessage, судя по всему, отличается от PostMessage


Так точно. SendMessage посылает сообщение напрямую оконной процедуре, PostMessage помещает сообщение в очередь сообщений.


--------------------
    
PM MAIL ICQ Skype   Вверх
Snowy
Дата 10.3.2006, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Цитата(Демо @ 9.3.2006, 22:00 Найти цитируемый пост)
Так точно. SendMessage посылает сообщение напрямую оконной процедуре, PostMessage помещает сообщение в очередь сообщений.
Нет. Немного не так.
SendMessage тоже ставит в очередь.
Отличие в том, что Post не ожидает ответа. Просто ставит в очередь.
А SendMessage ставит в очередь и ждет окончания обработки.
Поэтому через Post не шлют сообщения, требующие возврата результата.
PM MAIL   Вверх
Демо
Дата 10.3.2006, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Цитата(Snowy @ 10.3.2006, 11:42 Найти цитируемый пост)
SendMessage тоже ставит в очередь.


Вряд ли.

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.


--------------------
    
PM MAIL ICQ Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.2775 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.