API функция PeekMessage

Тема в разделе "WASM.BEGINNERS", создана пользователем WantButCant, 11 дек 2008.

  1. WantButCant

    WantButCant New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2008
    Сообщения:
    16
    Доброго времени суток, не пинайте за расспросы про апи функции, но в справочниках не понимаю описания:

    что должна делать функция PeekMessage из USER32.dll? для чего можно её применять?

    из того, что я читал в инете: функция долна возвращать строку после какого-то восстановления (примерно так)
     
  2. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    msdn?
    она делает то же что и GetMessage только не убирает сообщение из очереди собщений
    нужна чтобы несколько раз прочитать сообщение перед тем как его прочитает GetMessage
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    GoldFinch
    > только не убирает сообщение из очереди собщений
    Зависит от ее последнего параметра.

    WantButCant
    > для чего можно её применять?
    Цикл выборки сообщений может выглядеть так
    Код (Text):
    1. while (GetMessage(&msg, (HWND) NULL, 0, 0))
    2. {
    3.   TranslateMessage(&msg);
    4.   DispatchMessage(&msg);
    5. }
    если сообщений нет, то программа "висит" внутри GetMessage, если построить этот цикл так
    Код (Text):
    1. while ( !bQuit )
    2. {
    3.   if (PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ))
    4.   {
    5.     if ( msg.message == WM_QUIT )
    6.     {
    7.       bQuit = TRUE;
    8.     }
    9.     else
    10.     {
    11.       TranslateMessage( &msg );
    12.       DispatchMessage( &msg );
    13.     }
    14.   }
    15.   else
    16.   {
    17.     // тут можно заняться чем-нибудь еще
    18.   }
    19. }
     
  4. WantButCant

    WantButCant New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2008
    Сообщения:
    16
    извиняюсь за свою тупость:

    что подразумевается под "сообщением"?, если это просто текст, то зачем какой-то функции его читать, перед тем, как его прочитает другая функция?

    и попутно: что делает GetMessage и для чего применяется?
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    WantButCant
    > что подразумевается под "сообщением"?
    Информация о каком-нибудь событии.

    > и попутно: ...
    Так не пойдет. Для начала почитай, например, Charles Petzold. Programming Windows.
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    msdn | google: WM_CREATE, WM_PAINT и пр. WM_xxx
     
  7. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    WantButCant
    Сообщение это не текст а скорее номер. Например сообщение под номером 1 приходит к окну, когда окно создано, но перед его первым отображением на экране. Сообщение под номером 2 приходит когда окно закрывается, но перед тем как оно полностью разрушено. И так далее.

    У Petzold-а хорошо написано про такой вид программирования.
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.317
  9. WantButCant

    WantButCant New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2008
    Сообщения:
    16
    хм, интересные ссылки... но боюсь без знаний программирования под windows я действительно их не сомгу использовать на все 100%...

    посему ещё один вопрос:

    чем отследить (или как) входящие данные и возвращаемые значения API-шной функции?

    P.S. что-то поиск пока не очень итересные результаты по форуму выдаёт, продолжаю искать, но надеюсь на ответ
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.317
    чего сделать? я чет не понял вопроса... %)
     
  11. WantButCant

    WantButCant New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2008
    Сообщения:
    16
    сейчас опишу подробней:

    имеется число, вычисляемое по неизвестному алгоритму

    реверс программы показал, что число приходит из PeekMessage, причём каждый раз число разное...

    и разумеется я пытаюсь узнать, что за данные приходят в PeekMessage и как они там изменяются

    проблема реверса PeekMessage в том, что бряки ставить там не получается - эта функция выполняется в бесконечном цикле...
     
  12. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    WantButCant
    это прикол, я угадал ?
     
  13. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    Эта функция служит для того, чтобы программа не зависала, когда она перерабатывает большой поток данных. Некоторые программы, не использующие контроль очереди сообщений, просто не уступают очередь сообщений. В результате программа может просто-напросто зависнуть, а бедный пользлватель даже не сможет выключить своё "творение".

    Ну например программа выполняет некоторые действия циклически с большим буфером. Вот поссле каждого обновления буфера новой "порцией" данных неплохо использовать эту функцию. она смотрит - а нет ли в очереди ещё чего нибудь? Если нету - продолжаем действие. А если есть - уступим очередь.

    Как правило её суют перед очередным шагом прогрессбара.
     
  14. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    PeekMessage не изменят никаких данных. Она просто извлекает сообщение из очереди сообщений. Сообщение - это просто числовое значение с возможными дополнительными параметрами.
    Какждую секудну в очередь сообщений могут помещаться сотни сообщений из разных источников.
     
  15. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    Эта функция возвращает Ненулевое значение. если в очереди есть сообщение.
    PM_NOREMOVE - сообщение остаётся в очереди
    PM_REMOVE - удаляем из очереди

    Предотвращение зависания программы:
    if (PeekMessage (&message , hwnd , 0,0,PM_REMOVE)
    TranslateMessage (message)
    Dispatchmessage (message)

    .......... Выполняем нужное действие...
    (Если функция видит, что в очереди есть сообщение, оно обрабатывается также, как будто оно в основном цикле обработки сообщений)
     
  16. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    Messages and Message Queues
    в частности "About Messages and Message Queues","Using Messages and Message Queues" ну и "PeekMessage"
     
  17. WantButCant

    WantButCant New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2008
    Сообщения:
    16
    o_O... я просто в панике...

    точно проверял, что именно после выполнения этой функции, в стэке по адресу 12F4C8 появляется число - при том, каждый раз разное и всегда после определённой последовательности других действий

    и самое странное, что число из стэка по адресу 12F4C8 потом ещё и используется xD

    и PeekMessage вызывается из стандартных библиотек, т.е. это не самопальный вариант




    если говорить совсем полно и ясно, ты выходит следующее:

    на одном из серверов (всем уже так надоевшей) Lineage II, стоит, ну просто, элементарная защита от ботов, в определённый пакет вместо "мусорных" байт (integer) дописывается число, при каждом конекте разное

    я решил отследить, откуда оно берётся, нашёл пакет, нашёл адрес, по которому появляется число - отреверсил и пришёл к PeekMessage - именно оттуда в 12F4C8 приходит число, которое в последствии переписывается в другой адрес
     
  18. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Ну как же не изменяет - заполняет переданную ей структуру MSG :)
     
  19. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.317
    это видимо спец службы постарались)))))