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

Вниз

Click по приложению   Найти похожие ветки 

 
azl ©   (2007-01-14 17:38) [0]

Здравствуйте, уважаемые мастера.
Подскажите, пожалуйста, как можно определить был ли произведен щелчек мышкой на моем приложении (на любом компоненте, в том числе и на кпопке в панели задач), чтобы не прописывать у каждого компонента событие OnClick? На форме много компонентов, причем у некоторых компонентов уже прописано свое значение OnClick.

Спасибо.


 
Desdechado ©   (2007-01-14 18:53) [1]

> произведен щелчек мышкой на моем приложении
Это переключение на твое приложение с другого или вообще что ни попадя?


 
azl ©   (2007-01-14 20:18) [2]

Допустим есть Форма на ней 10 кнопок, 2 Memo, TreeView и т.д.

if Click, например, по Memo или по одной из кнопокна форме, по кнопке на панели задач (а точнее значке в tray) then
 ShowMessage("Вы щелкнули по приложению (программе или как еще назвать)");

Вот что мне нужно.


 
FAskerQ   (2007-01-14 20:44) [3]

Может подойдёт это

Кидаете на форму ApplicationEvents

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
 var Handled: Boolean);
begin
 if  msg.wParam = VK_LBUTTON then
   Caption:= "Вы щелкнули по приложению (программе или как еще назвать)";
end;


P.S.
 ShowMessage не советую использовать


 
azl ©   (2007-01-14 21:02) [4]

Да, это работает, спасибо. А вот если по заголовку окна шелкать, то ничего не происходит. Можно ли это как-то решить?


 
FAskerQ ©   (2007-01-14 21:35) [5]

private
   { Private declarations }
   procedure WMNCLBUTTONDOWN(var msg: TMessage); message

procedure TForm1.WMNCLBUTTONDOWN(var msg: TMessage);
begin
 if msg.wParam = HTCAPTION then Caption := "Left Click!";
 inherited;
end;


 
FAskerQ ©   (2007-01-14 21:36) [6]

Ошибся чуток первый раз

private
  { Private declarations }
  procedure WMNCLBUTTONDOWN(var msg: TMessage); message WM_NCLBUTTONDOWN;

procedure TForm1.WMNCLBUTTONDOWN(var msg: TMessage);
begin
if msg.wParam = HTCAPTION then Caption := "Left Click!";
inherited;
end;


 
azl ©   (2007-01-14 21:47) [7]

Класс. Спасибо огромное. Вы настоящий мастер.


 
azl ©   (2007-01-14 21:54) [8]

FAskerQ, А как определить если щелчек был произведен по кнопке на панели задач?


 
FAskerQ ©   (2007-01-14 22:14) [9]


> azl ©   (14.01.07 21:54) [8]


Мне бы кто сказал... сам не знаю


 
ors_archangel ©   (2007-01-14 22:19) [10]


> FAskerQ, А как определить если щелчек был произведен по
> кнопке на панели задач?

По кнопке, или всё-таки по иконке трее? Извини, чё-то не догоняю сегодня


 
azl ©   (2007-01-14 22:43) [11]

По кнопке.
По иконке в трее можно отдельно прописать событие OnClick.


 
azl ©   (2007-01-14 22:51) [12]

FAskerQ
Делаю то же самое для правой кнопки мыши:

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
if  msg.wParam = VR_RBUTTON then
  Caption:= "Вы щелкнули по приложению (программе или как еще назвать)";
end;


Все вроде бы хорошо, только вот если подвожу курсок к заголовку Caption сразу присваивается "Вы щелкнули по приложению (программе или как еще назвать)" до щелчка.
Почему так?


 
ors_archangel ©   (2007-01-15 00:04) [13]


> Почему так?

Потому что нет фильтра сообщений, я думаю, попробуй:

 case Msg.message of
 WM_LBUTTONUP: caption := "Left click!";
 WM_RBUTTONUP: caption := "Right click!";
 end;


 
ors_archangel ©   (2007-01-15 00:09) [14]

Насчёт клика по кнопке приложения:

 case Msg.message of
 WM_LBUTTONUP: caption := "Left click!";
 WM_RBUTTONUP: caption := "Right click!";
 WM_SYSCOMMAND:
   if msg.wParam = SC_RESTORE then caption := "Button click!";
 end;

SC_RESTORE - восстановление


 
Palladin ©   (2007-01-15 01:09) [15]


> [14] ors_archangel ©

ну по поводу sc_restore не обязательно что именно по кнопке, + тогда еще нужно корректно обработать OnActivate и OnMinimize...
для решения в общем случае можно повешать хук на мышь и покопаться в недрах системы для извлечения позиции кнопки приложения на панели задач... может извлечение этой информации и просто делается, я не знаю, не сталкивался...


 
ors_archangel ©   (2007-01-15 01:48) [16]


> ну по поводу sc_restore не обязательно что именно по кнопке,
>  + тогда еще нужно корректно обработать OnActivate и OnMinimize.

Начсёт "не обязательно" такой код может помочь, но у меня какие-то глюки, не знаю от этого кода или вообще :)))

function CursorInWorkarea: boolean;
var
 workarea: TRect;
 cursor: TPoint;
begin
 SystemParametersInfo(SPI_GETWORKAREA, 0, @workarea, 0);
 GetCursorPos(cursor);
 result := PtInRect(workarea,cursor);
end;

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
 case Msg.message of
 WM_LBUTTONUP: caption := "Left click!";
 WM_RBUTTONUP: caption := "Right click!";
 WM_SYSCOMMAND:
   if (msg.wParam and $FFF0 = SC_RESTORE) and (hiword(msg.lParam)<>-1)
   and not CursorInWorkarea then
     caption := "Button click!";
 end;
end;

Насчёт "корректно" не понял :(  handled по умолчанию = false - следовательно AppEvents только фильтрует сообщения, никому не мешает вроде как!


 
ors_archangel ©   (2007-01-15 01:54) [17]

Насчёт "немешания" начинаю сомневаться: через TaskMgr сворачиваю, разворачиваю - пропадает всё, кроме Project1 и, собственно, TaskMgr, что бы это значило? (И форма как ещё по краям экрана свой Frame рисует задисабленным, вообще, чёрная магия!)


 
azl ©   (2007-01-15 12:20) [18]

Спасибо огромное, все работает.
Только не пойму в чем отличие [16] от [14]. Работает и тот и тот вариант.

По поводу [17]. Есть такой глюк. Хотя я никогда не сворачивал и не восстанавливал через TaskBar.


 
ors_archangel ©   (2007-01-15 15:19) [19]


> azl ©   (15.01.07 12:20) [18]

Ну [17] должен провреять, что мышка находится на панели задач (тут вообще-то проверяется, что мышь не в work area - нужно тестировать при AutoHide панели задач, неизвестно что будет! Про lParam<>-1 в справке написано, что в случае lParam=-1 восстановление не мышкой было произведено... Вообще, что-то глючное получается :(((


 
azl ©   (2007-01-15 15:45) [20]

Понял. Спасибо большое.



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

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

Наверх




Память: 0.49 MB
Время: 0.05 c
2-1169127279
Кевларвестов Семен
2007-01-18 16:34
2007.02.04
TReader не читает из TMemoryStream


15-1168954110
Black_Live
2007-01-16 16:28
2007.02.04
Что тварят, Что тварят!?


15-1168608312
kaZaNoVa
2007-01-12 16:25
2007.02.04
Идеальная защита лицензионного ПО


6-1157030488
DelphiLexx
2006-08-31 17:21
2007.02.04
Отправка SMS с помощью INDY


1-1165865929
Ihtiandr
2006-12-11 22:38
2007.02.04
Изменить расскладку клавиатуры





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский