Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.02.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.02.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.012 c
14-15826
Geser
2003-01-22 03:10
2003.02.06
Убей в себе Ленина!


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


3-15414
Жук
2003-01-21 15:26
2003.02.06
Аppend


3-15461
mate
2003-01-20 13:35
2003.02.06
Int в MSSQL


14-15888
Вольный Стрелок
2003-01-16 19:36
2003.02.06
локализация интерфейса приложений





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский