Текущий архив: 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.47 MB
Время: 0.012 c