Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Alt+F4 
:(
    Опции темы
Kirgston
Дата 23.2.2009, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем доброго времени суток! Пользовался поиском... да и в ДРКБ лазил но увы ответа не нашел :( у меня такой вопросик... как я могу на время работы моей программы отключить Alt+F4 ? Мне не надо сделать процесс не убиваем и т.д. просто отключить на время работы Alt+F4. Заранее большое спасибо!
PM MAIL   Вверх
Данкинг
Дата 24.2.2009, 00:00 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



Задаёшь глобальную булевую переменную PER... Делаешь её false... Отлавливаешь CloseQuery формы, где делаешь
Код

if per=false then canclose:=false;

Соответственно, когда можно будет прекращать работу, делаешь per:=true.

Это сообщение отредактировал(а) Данкинг - 24.2.2009, 00:01


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
THandle
Дата 24.2.2009, 00:09 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

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



Код

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if ssAlt in Shift then
    if Key = VK_F4 then
      Key := 0;
end;

PM   Вверх
Poseidon
Дата 24.2.2009, 00:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Данкинг, тогда и на "крестик" будет не закрыть, что не соответствует заданию smile


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Kirgston
Дата 24.2.2009, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ребят спасибо большое =) но вы не поняли )))) мне надо сделать так... чтобы глобальный Alt+F4 отключить. Скажем есть программа к которой я не имею доступа. А моя бы программа блокировала её закрытие через Alt+F4 в свое время работы. Думал сделать как ... ну... просто глобальную горячу клавишу Alt+F4 ... но потом подумал... что это вряд ли сойдет т.к. система начнет просто выполнять 2 команды. 
Вообщем что то похоже на это

Код

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if ssAlt in Shift then
    if Key = VK_F4 then
      Key := 0;
end;



Только для чужого окна  smile 
PM MAIL   Вверх
Poseidon
Дата 24.2.2009, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Читай про хуки. Отлавливай Alt+F4 и посылай окну не WM_Close, а что-нить свое (или ничего).  По другому тут никак.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Kirgston
Дата 24.2.2009, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ем... мне надо отослать "ничего" ))))) 
А если зарегистрировать хот кей на Alt+F4 и в обработчике просто указать 
begin
end; 
?
Или винда всё же закроет? Можете мне чуток помочь?  smile 
PM MAIL   Вверх
Poseidon
Дата 24.2.2009, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



При нажатии Alt+F4 винда посылает активному окну WM_Close. Твоя задача отловить Alt+F4 до того, когда винда поймет что нажал пользователь и выполнить свои действия (т.е. ничего не выполнять), запретив при этом винде выполнять свои (т.е. посылать WM_Close). Реализуется это все с помощью глобальных хуков. В DRKB есть пример.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Kirgston
Дата 24.2.2009, 12:47 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ребята вот смотрите переделал кусочек кода. Мне как бы... ну надо обойтись одной дллкой. Она привязана к приложеню, но чтобы длл сама создавала и удаляла хук. Автоматизма я добился =) осталось только создание =) . Так вот взял хук блока правой кнопки мышки... не знаю или подойдет ну чуток переделал. Подскажите если что-то не так  smile 




Код


Uses Windows,Messages;

Var SysHook:HHook=0;

 

Function SysMsgProc(Code:Integer; WParam:LongInt; LParam:LongInt):LongInt; stdcall;
Var Msg:TMessage;
Begin
IF Code=HC_ACTION then
Case TMsg(Pointer(LParam)^).Message OF
  WM_DESTROY,WM_CLOSE: TMsg(Pointer(LParam)^).Message:=WM_NULL
  else Result:=CallNextHookEx(SysHook,Code,WParam,LParam);
End;
end;


procedure Hook(Flag:Boolean); export; stdcall;
Begin
SysHook:=SetWindowsHookEx(WH_GETMESSAGE,@SysMsgProc,HInstance,0) ;
End;


PM MAIL   Вверх
Kirgston
Дата 24.2.2009, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Почитал ДРКБ... да я понял как работают хуки, конкретно зачем они нужны и как лучше писать... но не более.. к сожалению примеров катастрофически мало...ребята я не прошу вас за меня написать код, мне бы только подсказать как...  smile 


Код


function GlobalKeyBoardHook(code: integer; wParam: integer; lParam:integer): longword; stdcall;
var
i:integer;
begin
if code< 0 then
  begin
    result:=CallNextHookEx(CurrentHook,code,wParam,lparam);//Тут как бы мы разрешаем другим хукам работу
    Exit;
  end
else
//вот тут должна идти подмена... как её сделать я ума не приложу...
end;   
CallNextHookEx(CurrentHook,code,wParam,lparam);
   result:=0;
end;



Ребята я вас понимаю вы скажете что в ДРКБ есть что в гугле есть... но то что я хочу не стандартное. Мне не надо сделать так чтобы процесс нельзя было убить. Это я делал бы совсем по иному, мне надо заблокировать Alt+F4. Поверьте искал... и поверьте нету нигде хотя бы намека как это сделать... да написано мол надо глобальный хук на Alt+F4 а как это сделать... smile  Заранее большое спасибо!

PM MAIL   Вверх
SneG0K
Дата 24.2.2009, 20:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

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



Цитата(Kirgston @  24.2.2009,  18:45 Найти цитируемый пост)
if code< 0 then

вот тут надо проверять не WM_CLOSE ли это! А если это не так, то делать 
Код

result:=CallNextHookEx(CurrentHook,code,wParam,lparam);

ну а если так, то 
Код

begin
end;

Хотя лучше ничего не писать)

Добавлено через 2 минуты и 2 секунды
Цитата(Kirgston @  24.2.2009,  18:45 Найти цитируемый пост)
else
//вот тут должна идти подмена... как её сделать я ума не приложу...
end; 

А как вы говорите "вот тут", компилятор вообще выкинет ошибку, потому, что там вместо begin уже запасливо стоит end
PM WWW Skype   Вверх
Kirgston
Дата 24.2.2009, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Большое вам спасибо что откликнулись! =)

Если я вас правильно понял то код должен быть таким

Код

function GlobalKeyBoardHook(code: integer; wParam: integer; lParam:integer): longword; stdcall;
var
i:integer;
begin
if not WM_CLOSE then
    result:=CallNextHookEx(CurrentHook,code,wParam,lparam); 
CallNextHookEx(CurrentHook,code,wParam,lparam);
end;


Вот так?.. правда что то мне кажется что я где то что-то не так сделал :(
PM MAIL   Вверх
SneG0K
Дата 24.2.2009, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

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



Цитата(Kirgston @  24.2.2009,  19:25 Найти цитируемый пост)
что-то не так сделал 

Да... Зачем два раза подряд вызывать CallNextHookEx()?
PM WWW Skype   Вверх
Kirgston
Дата 24.2.2009, 20:50 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну... думал как бы ... я пропускаю хук  и вызываю сл. хук, а если нет то дальше вызываю сл. хук... да наверно я тут не прав =)

Кстати забыл. Кто не знает тому будет полезно =) WM_CLOSE только сворачивает окно )))) 
Код


function GlobalKeyBoardHook(code: integer; wParam: integer; lParam:integer): longword; stdcall;
begin
if not WM_CLOSE OR WM_DESTROY then
CallNextHookEx(CurrentHook,code,wParam,lparam);
end;


Ув. Снежок вы даете добро на это? Просто функция что то очень маленькая получилась... мне кажется почему-то что работать она не будет... 
PM MAIL   Вверх
Christoph
Дата 24.2.2009, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

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



Цитата(Kirgston @  24.2.2009,  20:50 Найти цитируемый пост)
if not WM_CLOSE OR WM_DESTROY then

Что это такое написано? smile Как оно может работать? Выражение должно быть логического типа

Я в Хуках не шарю,но проверка на сообщения должна происходит примерно так

Код

procedure wmClose (var M:TMessage);   message wm_close;
.....
TForm1.wmClose(var M:TMessage);
begin
  if M.Msg=WM_CLOSE then ...........
end;



Это сообщение отредактировал(а) Christoph - 24.2.2009, 22:41


--------------------
user posted image
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




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


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

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