Обработка сообщений консольным окном ... это возможно?

Тема в разделе "WASM.WIN32", создана пользователем young_man, 7 апр 2005.

  1. young_man

    young_man New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2005
    Сообщения:
    117
    Адрес:
    Ukraine
    Добрый день ?

    Подскажите пожалуйста можно ли из консольного приложения как-то создать, отослать и обрабатывать сообщения (например: запустить таймер SetTimer(t) и через время t на сообщение WM_TIMER от этого же таймера и отреагировать).

    Если можно, и не сложно Вам это, покажите кусок исх. текста.



    Спасибо.
     
  2. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Теоретически можно так:

    Найти окно FindWindow - возвратит HWND

    Подменить процедуру окна
    Код (Text):
    1.  
    2. invoke GetWindowLong, hWin, GWL_WNDPROC
    3. mov hProc, eax
    4. invoke SetWindowLong, hWin, GWL_WNDPROC, offset NewProc
    5. .....
    6.  
    7. NewProc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
    8. ; Сюда будут приходить все сообщения к этому окну
    9. ......
    10.     push lParam
    11.     push wParam
    12.     push uMsg
    13.     push hWin
    14.     call hProc
    15. NewProc endp
    16.  
     
  3. young_man

    young_man New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2005
    Сообщения:
    117
    Адрес:
    Ukraine
    Спасибо за ответ

    Если я правильно понял аргументом FindWindow() будет строка:

    "C:\temp\console.exe" ;

    или просто

    "console.exe"

    или оба варианта?

    То есть вопрос: что искать ?
     
  4. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    Таймер не обязательно можно ставить на окно.

    Ему можно указать и адрес процедуры.



    Можно создать невидимое окно, и работать с ним. (будет безопасней, чем использовать чужие)
     
  5. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    HWND FindWindow(char* szClass, char* szTitle)

    szClass - Имя класса окна или NULL

    szTitle - Заголовок окна или NULL
     
  6. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    FindWindow нужен загаловок окна который можно назначить любым.





    и проще.
     
  7. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Може не уловил сразу... и вопрос несколько подредактирован...

    Тебе нужно чужие сообщения отлавливать ? Если нужен таймер - то не вопрос, смотри доку... Этот примерчик для отлова чужих оконных сообщений.
     
  8. young_man

    young_man New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2005
    Сообщения:
    117
    Адрес:
    Ukraine
    ... я в консоли работаю с сокетами и иногда приходится долго ждать ответ от сервера. Хотел в консоли создать свой таймер и отловить свое же сообщение от таймера по истичении t секунд.
     
  9. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    У консольного окна нет сообщений, как это принято в виде... У него есть 3 "устройства" ввода-вывода StdIn, StdOut, StdError. Читать с клавы ReadConsole, писАть на экран WriteConsole. А в остольном такое же Win32 приложение :)
     
  10. young_man

    young_man New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2005
    Сообщения:
    117
    Адрес:
    Ukraine
    ... получается, нельзя?
     
  11. vinnie_pooh

    vinnie_pooh New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    98
    У Пирогова есть пример с таймером в консольном приложении. Функции timeSetEvent / timeKillEvent.
     
  12. rst

    rst New Member

    Публикаций:
    0
    Регистрация:
    5 май 2003
    Сообщения:
    165
    если не ошибаюсь - консольки не поддерживают очередь сообщений.

    вариант #1 - ты можешь создать скрытое окно и там работать с сообщениями сколько влезет.

    вариант #2 - если тебе нужны таймеры - зачем тебе окна? окощечные таймеры не точные. Используй Waitable-timers, они работают через APC, и более точные по сравнению с окошенчыми.
     
  13. young_man

    young_man New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2005
    Сообщения:
    117
    Адрес:
    Ukraine
    ... спасибо всем за хорошие советы !
     
  14. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    young_man



    Тогда нужно тред создать и работать с сокетом в треде, а не таймеры использовать!



    yureckor



    Именно, а то, хоть таймеры и поддерживают режим вызова callback вместо окна, но без очереди сообщений этот режим всё равно не работает.
     
  15. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    2 Quantum

    Насчет тредов ты абсалютно прав.





    Ты уверен?
     
  16. rst

    rst New Member

    Публикаций:
    0
    Регистрация:
    5 май 2003
    Сообщения:
    165
    Очередь сообщений создается при создании окна. Тут уже не важно - консоль это или гуя.



    Касательно сокетов можно использовать WSA-функции. И в первую очередь WSAEvents - намного приятнее работать с сокетами будет.
     
  17. parov

    parov New Member

    Публикаций:
    0
    Регистрация:
    12 апр 2005
    Сообщения:
    11
    Вот кидаю пример такой проги, правда она на бейсике.

    Но я думаю перевести будет несложно
     
  18. parov

    parov New Member

    Публикаций:
    0
    Регистрация:
    12 апр 2005
    Сообщения:
    11
  19. parov

    parov New Member

    Публикаций:
    0
    Регистрация:
    12 апр 2005
    Сообщения:
    11
  20. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Гляну, интересно и про пиво скажи! :)))