Как воспрепятствовать закрытию окна другого приложения?

Тема в разделе "WASM.WIN32", создана пользователем WishMaster, 29 июл 2008.

  1. WishMaster

    WishMaster New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    54
    Адрес:
    Ukraine
    Кстати, а как из функции в dll'ке ссылаться при вызове функций WinAPI на функции из этой же dll'ки? Например, в обработчике хука при закрытии главного окна процесса я хочу создать новый Ворд и с помощью SetWindowsHookEx() задать новый хук на этот процесс. Раньше я открывал библиотеку и получал адресс функции с помощью GetProcAddress(). А что делать, если я вызываю эту функцию из самой же библиотеки?
     
  2. zhindos

    zhindos New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    142
    Вообще для ворда с кнопками на титле и пунктом менюшки Exit лучше обработать WM_SYSCOMMAND с wParam == SC_CLOSE и WM_COMMAND с LOWORD(wParam) == id Exit... юзверь наверняка не сможет закрыть, а тот кто захочет целенаправленно это сделать - сделает (объяснения выше ... и не мои :) )
     
  3. zhindos

    zhindos New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    142
    WishMaster

    Ты не уловил идеи...
    В обработчике хука ты всего лишь меняешь WndProc на новый, причем делаешь это один раз, и больше тебе этот обработчик нафиг не нужен. Но зато у тебя в адресном простр-ве (бедного worda :) ) лежит Dll-ка(твоя), а в ней измененный WndProc. А вот из него подумай какие месаги нужно и как обработать, чтобы юзверь не смог закрыть word.
    (лучше не допускать вызова DestroyWindow, чем заново пересоздавать окно)
     
  4. WishMaster

    WishMaster New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    54
    Адрес:
    Ukraine
    К сожалению не все так просто. Задача следующая - при нажатии на кнопку на форме в панельку загружается Ворд. Мне нужно: 1) чтобы Ворд мог исчезунть с панельки только при закрытии приложения; 2) чтобы пользователь мог открывать существующие документы в этом Ворде или создавать новые.
    Как вы знаете, в Ворде начиная с 2000 каждый документ открывается в отдельном окне. Если я загрузил Ворд и пользователь прежде чем открывать новый документ каждый раз будет закрывать старый и при этом не будет открывать никаких других документов Ворд вне моей программы (идеальный случай), то никаких проблем не будет. Если же при открытом документе он откроет еще один (не важно, из моего Ворда, либо клацнет на каком-либо другом Вордовском документе), то в моем экземпляре Ворда вне моей программы откроется окно нового документа. После этого открыть новый документ в Ворде в моей программе будет возможно, если предварительно закрыть все открытые документы вне программы, что неприемлемо. Если же закрыть документ в моей программе, то там закроется все окно Ворда и больше туда не попадет :)
    Возможные варианты:
    1) сделать так, чтобы в данном экземпляре Ворда не могло быть одновременно открыто более одного документа. Пытался реализовать и через шаблоны документа, и через события объекта TApplication с помощью команд VBA. Выходит криво, т.к. у Ворда нет события BeforeOpen. Приходится закрывать второй открытый документ, закрывать первый и снова открывать второй. Ворд это долго не выдерживает и часто выдает ошибки, поэтому этот вариант я отклонил;
    2) сделать так, чтобы открытое в моей программе окно ворда нельзя было закрыть. Тут двоякая ситуация - если запретить его вообще закрывать, то открыв однажды в ЭТОМ окне документ пользователь больше не сможет запхать в него другой документ, т.к. перед этим нужно закрыть первый документ, что сделать не удастся. Не знаю, на сколько понятно выразился :)
    3) отлавливать для этого окна Ворда сообщение WM_DESTROY и тут же создавать новый экземпляр Ворда, который прямо в обработчике Хука запихивать в мое приложение и ставить хук уже на это окно. Это я и пытаюсь сделать :)

    Надеюсь, что не очень сумбурно описал, но ситуация примерно такая.