Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 249

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Как можно перехватывать сообщения, посылаемые форме или панеле зная их handle. Желателно это сделать с помощью WinApi.
Спасибо.

Евгений Eklmn Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Евгений Eklmn (статус: Посетитель)
Вопрос отправлен: 31 мая 2010, 09:11
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: bugmenot

в Windows существуют две техники общего перехвата сообщений:
* сабклассинг - http://msdn.microsoft.com/en-us/library/ms633570(VS.85).aspx#subclassing_window
* ловушки - http://msdn.microsoft.com/en-us/library/ms632589(VS.85).aspx
в VCL ни одного встроенного способа не предоставляется, перекрытие же собственного метода TControl.WndProc - просто обработка. видел класс или компонент для этого в JCL/JVCL.

Приложение:
  1.  
  2.  
  3. OldWndProc := Pointer(GetWindowLong(Panele.Handle, GWL_WNDPROC));
  4.  
  5. Win32Check(Assigned(OldWndProc));
  6. SetWindowLong(Panele.Handle, GWL_WNDPROC, LongInt(@MyWndProc));
  7.  
  8.  
  9.  
  10.  
  11. function MyWndProc(hwnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
  12. begin
  13.  
  14. Result := CallWindowProc(OldWndProc, hwnd, uMsg, wParam, lParam);
  15.  
  16. Result := OldWndProc(hwnd, uMsg, wParam, lParam);
  17. end;


Ответ отправил: bugmenot (статус: 3-ий класс)
Время отправки: 31 мая 2010, 14:20


Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 31 мая 2010, 11:09; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 31 мая 2010, 09:22 [#1]:

Почему именно на API?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Евгений Eklmn

Евгений Eklmn (статус: Посетитель), 31 мая 2010, 09:47 [#2]:

Желательно на Api, но можно и без. Просто есть класс и не хочется его нагружать VCL'ом.
Генерация случайных чисел - слишком важный вопрос, чтобы оставлять его на волю случая. (Роберт Ковзю, Окриджская лаборатория)
min@y™

min@y™ (статус: Доктор наук), 31 мая 2010, 10:15 [#3]:

Цитата (Евгений Eklmn):

Просто есть класс и не хочется его нагружать VCL'ом.

Если в проекте есть формы и панели, то этот проект уже нагружен VCL'ом.
Чтобы обрабатывать сообщения, поступающие в оконный элемент, надо переписать его метод WndProc().

Из хэлпа:

Цитата:


Trapping messages

Under some circumstances, you might want your components to ignore messages. That is, you want to keep the component from dispatching the message to its handler. To trap a message, you override the virtual method WndProc.

For VCL components, the WndProc method screens messages before passing them to the Dispatch method, which in turn determines which method gets to handle the message. By overriding WndProc, your component gets a chance to filter out messages before dispatching them. An override of WndProc for a control derived from TWinControl looks like this:

procedure TMyControl.WndProc(var Message: TMessage);
begin
  { tests to determine whether to continue processing }
  inherited WndProc(Message);
end;

The TControl component defines entire ranges of mouse messages that it filters when a user is dragging and dropping controls. Overriding WndProc helps this in two ways:

  • It can filter ranges of messages instead of having to specify handlers for each one.
  • It can preclude dispatching the message at all, so the handlers are never called.

Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 31 мая 2010, 10:18 [#4]:

Посылаемое своей форме? или произвольному окну в системе?
Галочка "подтверждения прочтения" - вселенское зло.
Евгений Eklmn

Евгений Eklmn (статус: Посетитель), 31 мая 2010, 11:02 [#5]:

Посылаемое своей форме.
Чтож, можно попробывать Trapping messages.
Генерация случайных чисел - слишком важный вопрос, чтобы оставлять его на волю случая. (Роберт Ковзю, Окриджская лаборатория)
min@y™

min@y™ (статус: Доктор наук), 31 мая 2010, 11:09 [#6]:

Цитата (Евгений Eklmn):

Посылаемое своей форме. Чтож, можно попробывать Trapping messages.

Тогда проще написать обработчик сообщения как метод формы. Например:
unit Main;
 
interface
 
uses
  //...
 
type
  TMainForm = class(TForm)
    //...
  private
    //...
    procedure WmDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
  public
    //...
  end;
 
var
  MainForm: TMainForm;
 
implementation
 
{$R *.dfm}
 
procedure TMainForm.WmDropFiles(var Msg: TWMDropFiles);
begin
  // Обработчик перетаскивания файлов из проводника
  //...
end;
 
end.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:45
Выполнено за 0.02 сек.