Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как воспрепятствовать закрытию окна другого прилож 
:(
    Опции темы
NightWishMaster
Дата 28.7.2008, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 14.4.2006

Репутация: нет
Всего: нет



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

Жду ваших размышлений smile

PM MAIL   Вверх
jonie
Дата 29.7.2008, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



так там (в мсдн) черным по белому и написано
Цитата

Windows NT/2000/XP: You cannot change this attribute if the window does not belong to the same process as the calling thread.

ну можно внедриться в чужой процесс.. способов не один, и не два.... хотя мб есть чего поудобчивее...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
NightWishMaster
Дата 29.7.2008, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 14.4.2006

Репутация: нет
Всего: нет



Цитата(jonie @  29.7.2008,  00:23 Найти цитируемый пост)
ну можно внедриться в чужой процесс.. способов не один, и не два.... хотя мб есть чего поудобчивее... 

А поподробнее можно? Насчет того, что функция из другого процесса - мда, это я провтыкал :-\
PM MAIL   Вверх
jonie
Дата 29.7.2008, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



перед тем как лезть в дебри надо подумать о других способах.
http://wasm.ru/article.php?article=window_inject   вот пример инжекта... да и гугл найдет многа.
хотя вроде поставив глобальный хук тоже можно работать на вполне себе нормальных условиях....(как минимум эта длл-ка будет подгружена во все процессы).


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Supersedes
Дата 29.7.2008, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 29.7.2008

Репутация: нет
Всего: нет



Пробуй SetWindowsHookEx(...) на процедуру окна блокнота!! Описание посмотри в API.
PM MAIL ICQ   Вверх
Draeden
Дата 29.7.2008, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 7.7.2008

Репутация: нет
Всего: нет



Автор темы, из режима пользователя это сделать неудастся, хотя бы потому, что при доступе к объектам "процесс" и "окно" подсистема защиты сверит маркер доступа твоего процесса с дескриптором защиты данных объектов. Защиту обойти нельзя.

Другое дело, если у твоего процесса есть ссответсвующие права, например права администратора. Как минимум ты можешь поставить перехват NtOpenProcess из ntdll.dll, запретив доступ к защищаемому процессу.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.2120 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.