![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Клик в неактивном окне [D6, Win95/98, Win2k]
Delchiv © (2002-12-13 22:02:00)Господа, есть следующая проблема:
Главная форма, на ней лежит statusbar. Из нее запускается вторая - модальная. Нужно отслеживать щелчек мыши по statusbar в главной форме. Порекомендовали использовать wmessages и hookи, но как и что далать не сказали. Может кто подскажет?
Заранее благодарен!
Юрий Зотов (2002-12-24 08:08:00) [1]> Diamond Cat © (20.12.02 00:36)
Да хоть сто, какая разница? Оператор всего лишь проверяет, какое сообщение пришло, какой форме оно адресовано и какая форма в данный момент активна. Что здесь некорректного? И что значит "следующим"?
Diamond Cat (2002-12-20 00:36:00) [2]Уважаемый Юрий Зотов, не совсем корректно (Data^.hwnd = Form1.Handle) and (GetForegroundWindow = Form1.FWnd)форм может быть больше двух и не обязательно следуюшим окажется Form1
darkzone (2002-12-19 23:14:00) [3]Ну вы и звери в делфэ
Delchiv (2002-12-14 17:18:00) [4]2 Юрий Зотов
Огромное спасибо! Все получилось!
Юрий Зотов (2002-12-14 14:59:00) [5]Все ясно. 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;
Юрий Зотов (2002-12-14 13:01:00) [6]Тогда приведите код хука и код его установки. А левое "12345" все же замените на нормальное WM_USER, иначе последствия могут быть непредсказуемыми.
Delchiv (2002-12-14 12:55:00) [7]2 Юрий Зотов
Для формы этот кусок тоже не работает.
Юрий Зотов (2002-12-14 12:48:00) [8]При щелчке по статусбару WindowFromPoint дает хэндл именно этого статусбара, а не формы. Соответственно, ему Вы и отправляете сообщение, а вовсе не форме. Используйте GetParent.
Delchiv (2002-12-14 11:23:00) [9]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), то все в порядке. Почему?
Song (2002-12-14 11:00:00) [10]А как можно кликнуть по статус бару, который на форме 1 если открыта модальнаяформа 2 ?
Delchiv (2002-12-14 10:28:00) [11]2 Kirill45
Просто в данный момент Form1 неактивна, а над ней модальная Form2.
Kirill45 (2002-12-14 02:28:00) [12]Сформулируйте вопрос по понятней :)
ну кликнули на statusbar - поставте обычный обработчик
// procedure TForm1.StatusBar1Click(Sender: TObject);
// procedure TForm1.StatusBar1Mouse...
или вы не правильно спросили или ...
Alex870 (2002-12-14 00:13:00) [13]Чтобы отловить нажатие кнопки надо просто поймать WM_LBUTTONDOWN
ну например в WindowProc :
wm_LBUTTONDOWN :
begin
А вот здесь HOOK
end;
Проще всего определить место положения курсора