Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Перехват закрытия приложения

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

Shura09

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, кто знает как перехватить закрытия Access кагда пользователь нажимает на значке Х.
Просьба Вопросов типа "а зачем?" и прочих советов не давать.
Только скажите возможно ли это и как, если да.
СПАСИБО БОЛЬШОЕ.

Всего записей: 10 | Зарегистр. 15-07-2003 | Отправлено: 12:06 15-09-2003
MetroidZ



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Может не в тему но:
 
Можно ли отключить кнопку закрытия любого окна?  
Ответ:
Да, приведенный пример отключает кнопку закрытия и пункт "закрыть" ситсемного меню заданного окна.             procedure TForm1.Button1Click(Sender: TObject);  
             var  
               hwndHandle : THANDLE;  
               hMenuHandle : HMENU;  
             begin  
               hwndHandle := FindWindow(nil, 'Untitled - Notepad');  
               if (hwndHandle <> 0) then begin  
                 hMenuHandle := GetSystemMenu(hwndHandle, FALSE);  
                 if (hMenuHandle <> 0) then  
                   DeleteMenu(hMenuHandle, SC_CLOSE, MF_BYCOMMAND);  
               end;  
             end;

Всего записей: 1795 | Зарегистр. 12-07-2003 | Отправлено: 20:23 16-09-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Shura09
Да можно перехватить нажатия кнопки Х в любом приложении. Для этого ставится системный хук, который фильтрует мессаги ( в отличии от случая когда требуется перехватить нажатия клавиш). В процедуре хука ты смотришь заголовыок приложения по Хэндлу, который передается в хук и если там есть слово Access то по своему переопределяешь событие WM_CLOSE или WM_CLOSEQUERY. Извини пример проги давать не буду, так как примеров по работе с хуками в инете пруд пруди. А еще лучше почитай MSDN. На твой вопрос вроде бы ответил.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:12 17-09-2003
BugFixer

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сильно похоже на http://www.forum.ru-board.com/topic.cgi?forum=33&bm=1&topic=2118#1  

Всего записей: 482 | Зарегистр. 02-08-2003 | Отправлено: 05:57 17-09-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Сильно похоже на http://www.forum.ru-board.com/topic.cgi?forum=33&bm=1&topic=2118#1    

Не совсем так. Тут надо перехватить в чужом окне.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 06:29 17-09-2003
BugFixer

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
Тут надо перехватить в чужом окне.  

Это да... Сложнее.

Всего записей: 482 | Зарегистр. 02-08-2003 | Отправлено: 12:19 17-09-2003
Shura09

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хотя бы заблокиновать кнопку закрытия пока пользователь на что-нить не нажмет.
Только я что-то не пойму с какого бока подойти к этому примеру:
 
          procedure TForm1.Button1Click(Sender: TObject);  
             var  
               hwndHandle : THANDLE;  
               hMenuHandle : HMENU;  
             begin  
               hwndHandle := FindWindow(nil, 'Untitled - Notepad');  
               if (hwndHandle <> 0) then begin  
                 hMenuHandle := GetSystemMenu(hwndHandle, FALSE);  
                 if (hMenuHandle <> 0) then  
                   DeleteMenu(hMenuHandle, SC_CLOSE, MF_BYCOMMAND);  
               end;  
             end;
 
Спасибо за советы.

Всего записей: 10 | Зарегистр. 15-07-2003 | Отправлено: 17:41 17-09-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Shura09
Тут же все просто.  

Цитата:
hwndHandle := FindWindow(nil, 'Untitled - Notepad');    
только вместо Untitled - notepad пишешь Access - тру ля ля. Только учти, что лучше всего использовать функцию перечисления всех окон в ней находишь окно в котором есть надпись Access вот пример, его надо подправить под себя. Он просто возвращает хэндл первого окна в котором есть напись Access а ты уже для этого хэндла  делаешт это. Вобщем дальше дело техники.
 

Цитата:
  hMenuHandle := GetSystemMenu(hwndHandle, FALSE);    
                 if (hMenuHandle <> 0) then    
                   DeleteMenu(hMenuHandle, SC_CLOSE, MF_BYCOMMAND);    
               end;    
             end;  

 
 
type
  PFindWindowStruct = ^TFindWindowStruct;
  TFindWindowStruct = record
    Caption : string;
    ClassName : string;
    WindowHandle : THandle;
  end;
 
function EnumWindowsProc(hWindow:hWnd; lParam:LongInt):Bool;{$IFDEF Win32} stdcall; {$ELSE} ; export; {$ENDIF}
var
  lpBuffer:PChar;
  WindowCaptionFound:bool;
begin
  GetMem(lpBuffer,MAX_PATH+30);
  Result := True;
  WindowCaptionFound := False;
  try
    if GetWindowText(hWindow, lpBuffer, MAX_PATH+30) > 0 then
      if Pos(AnsiUpperCase(PFindWindowStruct(lParam).Caption),AnsiUpperCase('Access')) > 0
       then WindowCaptionFound := true;
    if WindowCaptionFound then begin
      PFindWindowStruct(lParam).WindowHandle := hWindow;
      Result := False;
    end;
  finally
    FreeMem(lpBuffer, sizeof(lpBuffer^));
  end;
end;
 
function FindFWindow(FCaption:string):THandle;
var
  WindowInfo : TFindWindowStruct;
begin
  with WindowInfo do begin
    Caption:=FCaption;
    ClassName:='';
    WindowHandle:=0;
    EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));
    FindFWindow:=WindowHandle;
  end;
end;
 
 


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 00:49 18-09-2003
MetroidZ



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это кусок программы на Delphi.
 
В этом примере отключается кнопка X у приложения с заголовком "Untitled - Notepad" (хотя хэндл можно и другими путями находить).
Для того чтобы его включить та же процедура, но вместо GetSystemMenu(hwndHandle, FALSE) надо GetSystemMenu(hwndHandle, TRUE).

Всего записей: 1795 | Зарегистр. 12-07-2003 | Отправлено: 01:07 18-09-2003
Shura09

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Интересно, как я буду использовать программу на Delphi в VBA? Может я допустил неопределенность, но программирование ведется на VBA.

Всего записей: 10 | Зарегистр. 15-07-2003 | Отправлено: 14:36 18-09-2003
BugFixer

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Shura09

Цитата:
Может я допустил неопределенность, но программирование ведется на VBA.

"Работайте только исправным инструментом!" (с) не знаю чьё  

Всего записей: 482 | Зарегистр. 02-08-2003 | Отправлено: 15:42 18-09-2003
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BugFixer

Цитата:
"Работайте только исправным инструментом!" (с) не знаю чьё  

Ну и? Опять будет разборка, что лучше?
Shura09

Цитата:
как я буду использовать программу на Delphi в VBA

Delphi программу использовать не удасться. Но можно использовать аналогичные API функции. Ну и, соответственно, ту же логику.

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 20:48 18-09-2003
woffer

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dneprcomp

Цитата:
можно использовать аналогичные API функции.

Что значит аналогичные ? Те же самые функции

Всего записей: 935 | Зарегистр. 11-10-2002 | Отправлено: 00:22 19-09-2003
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
woffer
Ну, так тем лучше для Shura09
Я же названия API-ек не проверял
 

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 00:58 19-09-2003
Shura09

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот это да!!!
Оказалось все не так то просто.
А задача -  заблокировать кнопку закрытия
Нужно знать объект и свойство или параметр. Но какой??

Всего записей: 10 | Зарегистр. 15-07-2003 | Отправлено: 11:56 19-09-2003
woffer

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Нужно знать объект и свойство или параметр. Но какой??

В смысле ? Нужно знать хендл окна, и скормить его функции GetSystemMenu
см код ShIvADeSt

Код:
hMenuHandle := GetSystemMenu(hwndHandle, FALSE);    
                 if (hMenuHandle <> 0) then    
                   DeleteMenu(hMenuHandle, SC_CLOSE, MF_BYCOMMAND);    
               end;    
             end;  
 

Она вернет хэндл меню, а потом DeleteMenu(.. (см опять же пример)
 
Или я вопроса не понял -)

Всего записей: 935 | Зарегистр. 11-10-2002 | Отправлено: 00:43 20-09-2003
Shura09

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужен Basic.

Всего записей: 10 | Зарегистр. 15-07-2003 | Отправлено: 15:29 23-09-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Нужен Basic.

В смысле тебе нужен компилятор Васика или же код на нем. Если первое то ищи не здесь это программирование, если второе то извини но переводить на Ваську меня ломает. Мне было достаточно когда я тот код из С в Дельфи лопатил. Сам смотри функции как они описаны в твоем хелпе и делай соответсвующий перевод. Хотя может кто другой переведет для тебя.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 03:10 24-09-2003
dad1969

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Поднимаю эту тему снова. С блокнотом все работает. А вот с outlook 2007 оказалось немного хуже. В systemmenu все прекрасно отрубается, а вот сама кнопка с крестиком там видимо по другому реализована. Короче она не отрубается. А очень надо. Ибо юзвери постоянно гасят outlook, а потом жалуются что у них почта не работает.

Всего записей: 571 | Зарегистр. 18-03-2003 | Отправлено: 15:48 15-08-2007
rain87



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
dad1969
хм, мне вариант в голову интересный пришёл
узнать hwnd главного окна аутлука, а затем с помощью SetWindowLong(GWL_WNDPROC) поменять этому окну WNDPROC, старую ессно запомнить. и после всего этого в своей WNDPROC ловить сообщения, если WM_CLOSE - то забивать, а если другое - то вызывать старую WNDPROC
гипотетически должно работать
 
ну или как вариант - стоять за спиной юзира с топором

----------
матрица - это система. она и есть наш враг
everyone's first vi session. ^C^C^X^X^X^XquitqQ!qdammit[esc]qwertyuiopasdfghjkl;:xwhat

Всего записей: 1744 | Зарегистр. 21-06-2006 | Отправлено: 16:28 15-08-2007
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Перехват закрытия приложения


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru