![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Click по приложению [D2005, 2000]
azl © (2007-01-14 17:38:00)Здравствуйте, уважаемые мастера.
Подскажите, пожалуйста, как можно определить был ли произведен щелчек мышкой на моем приложении (на любом компоненте, в том числе и на кпопке в панели задач), чтобы не прописывать у каждого компонента событие OnClick? На форме много компонентов, причем у некоторых компонентов уже прописано свое значение OnClick.
Спасибо.
azl (2007-01-15 15:45:00) [1]Понял. Спасибо большое.
ors_archangel (2007-01-15 15:19:00) [2]
> azl © (15.01.07 12:20) [18]
Ну [17] должен провреять, что мышка находится на панели задач (тут вообще-то проверяется, что мышь не в work area - нужно тестировать при AutoHide панели задач, неизвестно что будет! Про lParam<>-1 в справке написано, что в случае lParam=-1 восстановление не мышкой было произведено... Вообще, что-то глючное получается :(((
azl (2007-01-15 12:20:00) [3]Спасибо огромное, все работает.
Только не пойму в чем отличие [16] от [14]. Работает и тот и тот вариант.
По поводу [17]. Есть такой глюк. Хотя я никогда не сворачивал и не восстанавливал через TaskBar.
ors_archangel (2007-01-15 01:54:00) [4]Насчёт "немешания" начинаю сомневаться: через TaskMgr сворачиваю, разворачиваю - пропадает всё, кроме Project1 и, собственно, TaskMgr, что бы это значило? (И форма как ещё по краям экрана свой Frame рисует задисабленным, вообще, чёрная магия!)
ors_archangel (2007-01-15 01:48:00) [5]
> ну по поводу 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 только фильтрует сообщения, никому не мешает вроде как!
Palladin (2007-01-15 01:09:00) [6]
> [14] ors_archangel ©
ну по поводу sc_restore не обязательно что именно по кнопке, + тогда еще нужно корректно обработать OnActivate и OnMinimize...
для решения в общем случае можно повешать хук на мышь и покопаться в недрах системы для извлечения позиции кнопки приложения на панели задач... может извлечение этой информации и просто делается, я не знаю, не сталкивался...
ors_archangel (2007-01-15 00:09:00) [7]Насчёт клика по кнопке приложения:
caseMsg.message of
WM_LBUTTONUP: caption := 'Left click!';
WM_RBUTTONUP: caption := 'Right click!';
WM_SYSCOMMAND:
ifmsg.wParam = SC_RESTORE thencaption := 'Button click!';
end;
SC_RESTORE - восстановление
ors_archangel (2007-01-15 00:04:00) [8]
> Почему так?
Потому что нет фильтра сообщений, я думаю, попробуй:
caseMsg.message of
WM_LBUTTONUP: caption := 'Left click!';
WM_RBUTTONUP: caption := 'Right click!';
end;
azl (2007-01-14 22:51:00) [9]FAskerQ
Делаю то же самое для правой кнопки мыши:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
if msg.wParam = VR_RBUTTON then
Caption:= 'Вы щелкнули по приложению (программе или как еще назвать)';
end;
Все вроде бы хорошо, только вот если подвожу курсок к заголовку Caption сразу присваивается 'Вы щелкнули по приложению (программе или как еще назвать)' до щелчка.
Почему так?
azl (2007-01-14 22:43:00) [10]По кнопке.
По иконке в трее можно отдельно прописать событие OnClick.
ors_archangel (2007-01-14 22:19:00) [11]
> FAskerQ, А как определить если щелчек был произведен по
> кнопке на панели задач?
По кнопке, или всё-таки по иконке трее? Извини, чё-то не догоняю сегодня
FAskerQ (2007-01-14 22:14:00) [12]
> azl © (14.01.07 21:54) [8]
Мне бы кто сказал... сам не знаю
azl (2007-01-14 21:54:00) [13]FAskerQ, А как определить если щелчек был произведен по кнопке на панели задач?
azl (2007-01-14 21:47:00) [14]Класс. Спасибо огромное. Вы настоящий мастер.
FAskerQ (2007-01-14 21:36:00) [15]Ошибся чуток первый раз
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;
FAskerQ (2007-01-14 21:35:00) [16]
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;
azl (2007-01-14 21:02:00) [17]Да, это работает, спасибо. А вот если по заголовку окна шелкать, то ничего не происходит. Можно ли это как-то решить?
FAskerQ (2007-01-14 20:44:00) [18]Может подойдёт это
Кидаете на форму 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 20:18:00) [19]Допустим есть Форма на ней 10 кнопок, 2 Memo, TreeView и т.д.
if Click, например, по Memo или по одной из кнопокна форме, по кнопке на панели задач (а точнее значке в tray) then
ShowMessage('Вы щелкнули по приложению (программе или как еще назвать)');
Вот что мне нужно.
Desdechado (2007-01-14 18:53:00) [20]> произведен щелчек мышкой на моем приложении
Это переключение на твое приложение с другого или вообще что ни попадя?