Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.06;
Скачать: CL | DM;

Вниз

Клик в неактивном окне   Найти похожие ветки 

 
Delchiv   (2002-12-13 22:02) [0]

Господа, есть следующая проблема:
Главная форма, на ней лежит statusbar. Из нее запускается вторая - модальная. Нужно отслеживать щелчек мыши по statusbar в главной форме. Порекомендовали использовать wmessages и hookи, но как и что далать не сказали. Может кто подскажет?
Заранее благодарен!


 
Alex870 ©   (2002-12-14 00:13) [1]

Чтобы отловить нажатие кнопки надо просто поймать WM_LBUTTONDOWN
ну например в WindowProc :
wm_LBUTTONDOWN :
begin
А вот здесь HOOK
end;
Проще всего определить место положения курсора


 
Kirill45   (2002-12-14 02:28) [2]

Сформулируйте вопрос по понятней :)
ну кликнули на statusbar - поставте обычный обработчик
// procedure TForm1.StatusBar1Click(Sender: TObject);
// procedure TForm1.StatusBar1Mouse...
или вы не правильно спросили или ...


 
Delchiv   (2002-12-14 10:28) [3]

2 Kirill45
Просто в данный момент Form1 неактивна, а над ней модальная Form2.


 
Song ©   (2002-12-14 11:00) [4]

А как можно кликнуть по статус бару, который на форме 1 если открыта модальная форма 2 ?


 
Delchiv   (2002-12-14 11:23) [5]

2 Song
Ну, по идее можно отловить виндовое сообщение о нажатии клавиши мыши, взять форму под курсором и послать ей сообщение, но и тут не все гладко :-(
2 All
Определяем в Form1 процедуру на обработку события
procedure ProcMes(var msg: TMsg); message 12345
Схватив виндовое сообщение в тот момент когда Form2 модальна и найдя handler Form1 отправляем ей сообщение:
msg := PMouseHookStruct(lParam);
hw := WindowFromPoint(msg^.pt);
SendMessage(hw,12345,0,0);
Но оно почему-то не доходит. А если после SendMessage вставить messagedlg (например для вывода hw), то все в порядке. Почему?


 
Юрий Зотов ©   (2002-12-14 12:48) [6]

При щелчке по статусбару WindowFromPoint дает хэндл именно этого статусбара, а не формы. Соответственно, ему Вы и отправляете сообщение, а вовсе не форме. Используйте GetParent.


 
Delchiv   (2002-12-14 12:55) [7]

2 Юрий Зотов
Для формы этот кусок тоже не работает.


 
Юрий Зотов ©   (2002-12-14 13:01) [8]

Тогда приведите код хука и код его установки. А левое "12345" все же замените на нормальное WM_USER, иначе последствия могут быть непредсказуемыми.


 
Юрий Зотов ©   (2002-12-14 14:59) [9]

Все ясно. WindowFromPoint для этой задачи не годится из-за того, что первая форма в момент клика задизаблена. А в справке сказано:
"The WindowFromPoint function does not retrieve the handle of a hidden or disabled window, even if the point is within the window".

А вот работающий пример.

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FHook: HHOOK;
FWnd: HWND;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

uses
Unit2;

function MouseProc(Code, Msg: integer; Data: PMouseHookStruct): integer; stdcall;
begin
if (Msg = WM_NCLBUTTONDOWN) and (Data^.hwnd = Form1.Handle) and (GetForegroundWindow = Form1.FWnd) then
SendMessage(Form1.FWnd, WM_USER, 0, 0);
Result := CallNextHookEx(Form1.FHook, Code, Msg, Integer(Data))
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FHook := SetWindowsHookEx(WH_MOUSE, @MouseProc, 0, GetCurrentThreadID)
end;

procedure TForm1.FormClick(Sender: TObject);
begin
with TForm2.Create(nil) do
try
FWnd := Handle;
ShowModal
finally
FWnd := 0;
Free
end
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnhookWindowsHookEx(FHook)
end;

==============================

type
TForm2 = class(TForm)
private
procedure WMUser(var Message: TMessage); message WM_USER;
end;

procedure TForm2.WMUser(var Message: TMessage);
begin
ShowMessage("OK")
end;


 
Delchiv   (2002-12-14 17:18) [10]

2 Юрий Зотов
Огромное спасибо! Все получилось!


 
darkzone ©   (2002-12-19 23:14) [11]

Ну вы и звери в делфэ


 
Diamond Cat ©   (2002-12-20 00:36) [12]

Уважаемый Юрий Зотов, не совсем корректно (Data^.hwnd = Form1.Handle) and (GetForegroundWindow = Form1.FWnd) форм может быть больше двух и не обязательно следуюшим окажется Form1


 
Юрий Зотов ©   (2002-12-24 08:08) [13]

> Diamond Cat © (20.12.02 00:36)

Да хоть сто, какая разница? Оператор всего лишь проверяет, какое сообщение пришло, какой форме оно адресовано и какая форма в данный момент активна. Что здесь некорректного? И что значит "следующим"?



Страницы: 1 вся ветка

Текущий архив: 2003.02.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
1-15570
Ag2002
2003-01-28 12:48
2003.02.06
Цвета


1-15623
farhad
2003-01-29 12:38
2003.02.06
Простой вопрос...


1-15684
OlDemon
2003-01-27 13:14
2003.02.06
Запись в свой exe файл


14-15899
IronHawk
2003-01-05 20:14
2003.02.06
Помощь в плане поиска для реферата!


1-15593
Pk
2003-01-28 11:43
2003.02.06
Чего хочет компилятор?