Как сделать, чтобы прога не получала сооб-я, посланные др. процессом?

Тема в разделе "WASM.WIN32", создана пользователем AndreyMust19, 12 май 2009.

  1. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Таки перл.
     
  2. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    leo
    Да, поможет SetMessageExtraInfo/GetMessageExtraInfo. Но только тогда, если мы в процессе обработки сообщения мы посылаем сообщения другим контролам. Например, клик на листбоксе? Тогда если добавляем строку в этот листбокс. В результате листбокс получает еще одно сообщение и его обрабатывает тот же поток, который его послал. И вот тут, узнав о добавлении строки он может проверить - если GetMessageExtraInfo равен магическому числу, значит мы же послали это сообщение.
    Но вот беда. Сообщение WM_COMMAND говорит диалогу, что одному из его элементов интерфейса послали сообщение:

    Процедура обработки сообщений диалога:
    Как вот это сообщение получить?
    завешивает поток и ничего не происходит.
    Я еще повожусь и выложу реальные исходники.

    Вот еще что. Если в начале main сделать
    то при обработке сообщения GetMessageExtraInfo возвращает ноль. Получается, что при появлении сообщения система создает новый поток, направленный на процедуру обработки, вместо того, чтобы направлять уже имеющийся поток, который остановился на вызове DialogBox.
    Из-за этого приходится делать SetMessageExtraInfo(3333) во время инициализации диалога. А надо бы в начале main

    Короче SetMessageExtraInfo/GetMessageExtraInfo работает, но не защищает от вражеских WM_MINIMIZE и WM_CLOSE.
    Вот что. После обработки сообщения можно вернуть или FALSE или TRUE. Может что-то здесь можно нахимичить?

    leo
    Пусть от моей кнопки, но как узнаем, кто эту кнопку нажал - пользователь или другая программа? Не подходит!
     
  3. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Можно использовать исключительно саморисованные контролы и написать полностью свою обработку сообщений WM_MOUSE... и прочая, не используя традиционные WM_CLOSE, WM_COMMAND и т.п. Но это будет очень трудоёмко, т.к. по сути - полное переписывание интерфейса винды.
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    AndreyMust19
    Во-первых, если у тебя всего один поток, то действие Set/GetMessageExtraInfo эквивалентно установке некоторой глобальной переменной - с таким же успехом можно объявить MySuperVar dd 3333 и также ее изменять и контролировать при посылке сообщения. Это даже будет лучше, т.к. будет действовать на все потоки твоей проги, а SetMessageExtraInfo влияет только на текущий поток, поэтому если захочешь послать сообщение окну другого потока, то твоя задумка не сработает - установишь значение 3333 в одном потоке, а в другом потоке прочитается свое значение 2222

    Читай внимательнее описание - ExtraInfo привязывается к очереди потока, а до первого вызова Get\PeekMessage еще никакой очереди нет

    Это уже похоже на параною ;) Много ты встречал зловредных программ, которые для закрытия окна используют имитацию мышиного клика со снайперским прицелом на крестике закрытия окна ?!! Если встречал, тогда еще не забудь окутать цепями своей суперзащиты сообщения мыши, меню, шорткаты и т.д. и т.п. Ну и есно про WriteProcessMemory и т.п. не забудь :lol: