Главная страница
    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.046 c
3-1160361442
Climber
2006-10-09 06:37
2007.02.04
EDBEngineError


15-1168727245
ProgRAMmer Dimonych
2007-01-14 01:27
2007.02.04
И снова об XP и Vista


15-1168528033
iXT
2007-01-11 18:07
2007.02.04
IIS 6 Win2003 Server


2-1168700386
RealGanj
2007-01-13 17:59
2007.02.04
Алгоритм перебора всех комбинаций


2-1169106953
KyRo
2007-01-18 10:55
2007.02.04
TMediaPlayer





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