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

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем WishMaster, 29 июл 2008.

Статус темы:
Закрыта.
  1. WishMaster

    WishMaster Гость

    Скажем, у меня открыт стандартный Notepad и я хочу воспрепятствовать его закрытию пользователем. Первая идея – это пробовать отлавливать сообщения, посылаемые окну Блокнота и если это WM_CLOSE, то не пересылать их дальше. Вот код (Блокнот должен был блокироваться при нажатии на кнопку ButtonLock):

    WNDPROC OldWindowProc;
    HWND NotepadHandle;

    LRESULT CALLBACK NewWindowProc(HWND hWnd, UINT msg, WPARAM w, LPARAM l)
    {
    if (msg == 0x0010) {MessageBox(NULL, "Нельзя закрывать!", "", MB_OK); return(0);}
    else return CallWindowProc((FARPROC)OldWindowProc, hWnd, msg, w, l);
    }

    void __fastcall TForm1::ButtonLockClick(TObject *Sender)
    {
    NotepadHandle = FindWindow(NULL, "Безымянный - Блокнот");
    OldWindowProc = (WNDPROC)SetWindowLong(NotepadHandle, GWL_WNDPROC, (long)NewWindowProc);
    RaiseLastWin32Error();
    }

    Функция SetWindowLong() выдает ошибку: “System Error. Code: 5. Отказано в доступе.” Это запрещено с точки зрения безопасности? Потому как для окна моей программы этот код работает нормально (не дает ей закрыться). Как можно это обойти?

    Как воспрепятствовать закрытию Блокнота? Блокировать кнопку закрытия окна не предлагать – в любой программе есть либо своя кнопка закрытия, либо меню Файл-Выход. Кроме того, я обратил также внимание на то, что событие WM_CLOSE вызывается не всегда. Например, при вызове функции Form->Close() оно почему-то не срабатывает. А обрабатывать WM_DESTROY уже позно – когда оно срабатывает окно уже пропадает с экрана (по крайней мере у меня так было).

    Жду ваших размышлений ;)
     
  2. Silver Wind

    Silver Wind Гость

    WishMaster
    Что такое адресное пространство процесса в курсе?
    Естественно попытка установить оконную процедуру, находящуюся в адресном пространстве твоего процесса другому процессу ни к чему хорошему не приведет, даже еслибы не возникло ошибки доступа, то адрес твоей оконной процедуры в чужом процессе указывает непонятно куда.

    Попробуй решить этот вопрос используя глобальные ловушки. Примеров в инете полно, на этом форуме тоже вопрос не однократно поднимался.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей