Форум: "Начинающим";
Текущий архив: 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]Может подойдёт это
Кидаете на форму ApplicationEventsprocedure 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