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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отлов WindowProc до изминения, Фильтрация 
V
    Опции темы
Ak47black
  Дата 22.8.2007, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Здравствуйте.
Как перехватить WindowProc (главную процедуру окна) до изменения.
Дело в том что я хочу обрабатывать например Alt+F4 и не допускать завершения программы и тому подобное.
Делаю например вот так
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    FOldWndProc: TWndMethod;
    procedure MessageFilterWndProc(var Message: TMessage);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MessageFilterWndProc(var Message: TMessage);
var
  i: Integer;
begin
  if Message.Msg = WM_KEYDOWN then
  begin
    Beep;
    if Message.WParam = $73 then
      Exit;
  end;
  FOldWndProc(Message);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  FOldWndProc:= WindowProc;
  WindowProc:= MessageFilterWndProc;
end;

end.

Тоесть делаю процедуру которая фильтрует и не передаёт дальше Alt+F4.
Проблема заключается в том что если добавить например на форму TMemo, то сообщения не будут обрабатываться и при нажатии Alt+F4 форма будет закрываться.
Можно конечно прикрутить и к  TMemo тоже самое что и к форме но так я не могу сделать потому что на форме куча объектов.
Как перехватить реальную процедуру обработки окна?
Тоесть я хочу сделать чтобы все сообщения которые приходят окну сначала я обрабатывал.  smile 
PM MAIL   Вверх
MetalFan
Дата 22.8.2007, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Цитата(Ak47black @  22.8.2007,  20:40 Найти цитируемый пост)
и не допускать завершения программы и тому подобное.

а OnClose/OnCloseQuery не катит? ))

з.ы. попробуй както так:
Код

...
    procedure OnAppMessage(var Msg: TMsg; var Handled: Boolean);
...

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := OnAppMessage;
end;

procedure TForm1.OnAppMessage(var Msg: TMsg; var Handled: Boolean);
begin
  if Msg.message = WM_KEYDOWN then
  begin
    Beep;
    Handled := Msg.wParam = $73;
  end;
end;


Это сообщение отредактировал(а) MetalFan - 22.8.2007, 22:00


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Fedia
Дата 22.8.2007, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

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



Цитата(Ak47black @  22.8.2007,  20:40 Найти цитируемый пост)
Проблема заключается в том что если добавить например на форму TMemo, то сообщения не будут обрабатываться и при нажатии Alt+F4 форма будет закрываться.


Попробуй свойство формы KeyPreview, установить в значение true.


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Ak47black
Дата 22.8.2007, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Не оба предложенные способа не работают.
Я всетаки не добиваюсь именно как недать закрыться окну по нажатию Alt+F4 , хочу сделать сам перехват до обработки.  

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

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



Цитата(Ak47black @  22.8.2007,  23:01 Найти цитируемый пост)
всетаки не добиваюсь именно как недать закрыться окну по нажатию Alt+F4

Вариант №1:
Код

procedure TMForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose:=False;
end;

Вариант №2 
Код

procedure WndProc(var Message: TMessage); override;
...

procedure TForm1.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_CLOSE then
  Message.Msg:=WM_USER ;



--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Sunvas
Дата 23.8.2007, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



Ak47black, если ты хочешь чтобы форма не закрывала ИМЕННО по alt+F4, то тебе следует обрабатывать OnKeyDown! Т.е. после того, как нажаты эти две кнопки, окну посылается сообщение закрытия. И, когда окно его получает - оно не знает откуда оно к нему пришло: либо от крестика справа вверху, либо от этих кнопок.
Сейчас нарисую пример отлавливания именно alt+F4.

Добавлено через 5 минут и 38 секунд
Код

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if ((GetKeyState(VK_MENU) AND 128)=128) and
    ((GetKeyState(VK_F4) AND 128)=128) then
begin
ShowMessage('Íàæàòî alt+f4');
key:=0;
end;
end;



--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
sentry
Дата 23.8.2007, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Code Monkey
*


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

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



Sunvas, вот так лучше смотрится  smile :
Код

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


А вот пример отлова WM_CLOSE оконной процедурой:
Код

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure WndProc(var Message: TMessage); override; // перекрываем исходную процедуру
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

{ это сообщение наступает раньше (если KeyPreview = True), чем передается WndProc, поэтому }
{ после вывода perehvat заголовок формы на WM_CLOSE не меняется                                              }
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key = VK_F4) and (ssAlt in Shift) then
  begin
    ShowMessage('Perehvat');
    Key := 0;
  end;
end;

{ зато меняется, если щелкнуть на кнопке закрыть, а также при нажатии Alt+F4, }
{ если KeyPreview = False } 
procedure TForm1.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_CLOSE then
    Form1.Caption := 'WM_CLOSE'
  else
    inherited; // для обработки других сообщений вызываем оригинальную оконную процедуру
end;

PM MAIL   Вверх
Ak47black
Дата 23.8.2007, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ok. С закрытием тогда понятно как сделать, но всетаки через OnKeyDown всё не перехватываться на ранней стадии.
Например если попробовать перехватить и предотвратить Num Lk вот этим кодом 
Код

  if (Key = VK_NUMLOCK) then
  begin
    ShowMessage('Perehvat');
    Key := 0;
  end;

То он всеровно загорается.
И еше например как Ctrl+Alt+Delete перехватить.

Это сообщение отредактировал(а) Ak47black - 23.8.2007, 09:39
PM MAIL   Вверх
Ak47black
Дата 23.8.2007, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Тут по какой схеме происходит передача :
  • A. Сначала проверяется на наличие Ctr+Alt+Delete, а потом передаётся в приложение
  • B. Сначала в приложение, а потом проверяется.
?
PM MAIL   Вверх
Sunvas
Дата 23.8.2007, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



Цитата(Ak47black @  23.8.2007,  09:35 Найти цитируемый пост)
То он всеровно загорается.И еше например как Ctrl+Alt+Delete перехватить.

Num Luck - надо хучить клаву.
А по трем веселым кнопкам - ищи по форуму, там Yanis очень хороший пример приводил.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Yanis
Дата 23.8.2007, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Sunvas @  23.8.2007,  12:27 Найти цитируемый пост)
А по трем веселым кнопкам - ищи по форуму, там Yanis очень хороший пример приводил. 

CAD.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
MetalFan
Дата 23.8.2007, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Yanis, а ето только под админом наверное будет работать...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ak47black
Дата 23.8.2007, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Всетаки будет-ли работать без прав админа для меня важно.
Пробовал поставить хук в самом приложении (тоесть без Dll), но невышло так как винт первый перехватывает.

Это сообщение отредактировал(а) Ak47black - 23.8.2007, 19:52
PM MAIL   Вверх
MetalFan
Дата 23.8.2007, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Цитата(Ak47black @  23.8.2007,  19:52 Найти цитируемый пост)
невышло так как винт первый перехватывает.

хто перехватывает???




--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ak47black
Дата 23.8.2007, 20:22 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

хто перехватывает???

Windows  smile 
Тоесть Windows первый проверяет вызвать-ли TaskManager.

Это сообщение отредактировал(а) Ak47black - 23.8.2007, 20:28
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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