W
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 уже позно – когда оно срабатывает окно уже пропадает с экрана (по крайней мере у меня так было).
Жду ваших размышлений
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 уже позно – когда оно срабатывает окно уже пропадает с экрана (по крайней мере у меня так было).
Жду ваших размышлений