Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0999 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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