Текущий архив: 2003.12.26;
Скачать: CL | DM;
Вниз
Еще один вопрос по Shell_NotifyIcon Найти похожие ветки
← →
KyRo © (2003-10-30 02:18) [0]Как я понял она получает события от мыши .Подскажите в какие
переменные она записыват данные о нажатых клавишах??
← →
Иван Шихалев © (2003-10-30 02:27) [1]Функция Shell_NotifyIcon никаких событий не получает (как это вообще?) и ни в какие переменные ничего не пишет.
При использовании этой функции указывается, какое сообщение и какому окну будет отправляться при действиях мыши на иконке.
← →
KyRo © (2003-10-30 09:08) [2]Ага понял.
← →
KyRo © (2003-10-30 09:48) [3]Тут возникает новый вопрос какой функцией ловить эти сообщения ?
← →
Игорь Шевченко © (2003-10-30 10:23) [4]оконной процедурой, как обычно
← →
Woolen (2003-10-30 10:39) [5]
> в какие
> переменные
Пишешь процедуру обработки сообщения в своей форме, например, после точки с зяпятой ставишь "message WM_твое сообщение;". Параметром функции должена быть структура ловимого сообщения (почти все такие структуры объявлены в дельфи), теле процедуры обрабатываешь то, что тебе было прислано.
← →
Woolen (2003-10-30 10:40) [6]Да, параметр должен быть переменной.
← →
KyRo © (2003-10-30 22:37) [7]function Ttray.MainWndProc(hMainWnd:HWND;Message:UINT;wParam:WPARAM;Lparam:LPARAM):LRESULT;//stdcall;
begin
Result:=0;
if Message=WM_NOTIFYICON then begin
case lParam of
WM_LBUTTONDOWN: Lclick ;
WM_RBUTTONDOWN: begin end;
end end
else Result:=DefWindowProc(hMainWnd,Message,WParam,Lparam);
end;
Я сделал вот так но поче му то функция не как не реагирует..
Что я делаю не так ??
← →
Иван Шихалев © (2003-10-30 22:42) [8]Это что за зверь? Что такое TTray? Какое окно у тебя пытается использовать эту функцию? Ты пишешь на API или на VCL?
По поводу оконной функции вообще... http://fpc.by.ru/win32/
← →
jonni © (2003-10-30 22:44) [9]const
TRAY_CALLBACK = WM_USER + 1;
TNewNotifyIconData = record
cbSize: DWORD;
Wnd: HWND;
uID: UINT;
uFlags: UINT;
uCallbackMessage: UINT;
hIcon: HICON;
//Version 5.0 is 128 chars, old ver is 64 chars
szTip: array [0..127] of Char;
dwState: DWORD; //Version 5.0
dwStateMask: DWORD; //Version 5.0
szInfo: array [0..255] of Char; //Version 5.0
uTimeOut:Integer;
szInfoTitle: array [0..63] of Char; //Version 5.0
dwInfoFlags: DWORD; //Version 5.0
end;
procedure AddSysTrayIcon;
procedure SysTrayIconMsgHandler(var Msg: TMessage); message TRAY_CALLBACK;
procedure TForm1.SysTrayIconMsgHandler(var Msg: TMessage);
begin
case Msg.lParam of
WM_MOUSEMOVE:;
WM_LBUTTONDOWN:;
WM_LBUTTONUP:;
WM_LBUTTONDBLCLK:;
WM_RBUTTONDOWN:;
WM_RBUTTONUP:;
WM_RBUTTONDBLCLK:;
end;
procedure TForm1.AddSysTrayIcon;
begin
IconData.cbSize := SizeOf(IconData);
IconData.Wnd := AllocateHWnd(SysTrayIconMsgHandler);
{SysTrayIconMsgHandler is then callback message" handler}
IconData.uID := 0;
IconData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
IconData.uCallbackMessage := TRAY_CALLBACK; //user defined callback message
IconData.hIcon := Application.Icon.Handle; //an Icon"s Handle
IconData.szTip := "Please send me email.";
if not Shell_NotifyIcon(NIM_ADD, @IconData) then
ShowMessage("add fail");
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
AddSysTrayIcon;
end;
ne zabud" toka potom udalit" iconku iz tray pri zavershenie raboti
← →
KyRo © (2003-10-30 22:51) [10]
> jonni ©
Да это все у меня уже сделано кроме обработчика событий от мыши.
> Иван Шихалев
Это компонент который я делаю.
Так а что не так в моей функции ??
← →
Иван Шихалев © (2003-10-30 23:20) [11]
> Так а что не так в моей функции ??
Это не есть оконная функция. А данный компонент не есть окно.
← →
jonni © (2003-10-31 00:12) [12]const
TRAY_CALLBACK = WM_USER + 1;
procedure SysTrayIconMsgHandler(var Msg: TMessage); message TRAY_CALLBACK;
IconData.uCallbackMessage := TRAY_CALLBACK;
procedure TForm1.SysTrayIconMsgHandler(var Msg: TMessage);
begin
case Msg.lParam of
WM_MOUSEMOVE:;
WM_LBUTTONDOWN:;
WM_LBUTTONUP:;
WM_LBUTTONDBLCLK:;
WM_RBUTTONDOWN:;
WM_RBUTTONUP:;
WM_RBUTTONDBLCLK:;
end;
a chem tebe ne ravit"sya etot obrabotchik sobitiy ot mishi??
← →
KyRo © (2003-10-31 00:49) [13]Дп нет нормальный . Щас его пробую задействовать но пока он у меня что то не рагирует.
← →
KyRo © (2003-10-31 02:32) [14]Что то снова не выходит.
Распишите алгоритм передачи этих сообщений.
Я понимаю происходит так.
Shell_NotifyIcon возвращает сообщение TMessage в форму на которую указывает индентификатор формы из той же функции.
После чего надо его обработать оконной функцией .Правильно я понял ??
Есле да то вопрос. Я ведь делаю компонент ран-тайм может он не видит Message который был послан форме ??
← →
Diamond Cat © (2003-10-31 03:19) [15]на примере
> jonni ©
хотя он несколько сгустил но тем не менее
в процедуре AddSysTrayIcon создается пакет данных, который будет передан шелу с помощью функции Shell_NotifyIcon
в этом пакете:
IconData.Wnd := AllocateHWnd(SysTrayIconMsgHandler) в какую функцию какого окна будет переданно сообщение о действии над значком
IconData.uID := 0; идентификатор
IconData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP; задаем вид (структуру иконки)
IconData.uCallbackMessage := TRAY_CALLBACK; сообщение которое будет приходить в назначенный обработчик см.выше.
IconData.hIcon := Application.Icon.Handle; откуда берется значек
IconData.szTip := "Please send me email."; подсказка к значку
if not Shell_NotifyIcon(NIM_ADD, @IconData) передача пакета
then
ShowMessage("add fail");
далее в случае прохождения курсосором над занчком или какого любого другого действия (со значком) в наш обработчик примкакивает сообщение которое мы описали а именно TRAY_CALLBACK, в этом сообщении а именно в его Lparam содержиться код действия совершенного со значком
jonni © закатал в виде кейса все сообщения от мыши только не поставил реакцию на них вот более конкретный пример
procedure TForm1.SysTrayIconMsgHandler(var Msg: TMessage);
begin
if Msg.lParam =
WM_RBUTTONUP then close;
end;
кстати при закрытии (onclose к примеру) не лишним будет прибить иконку Shell_NotifyIcon (NIM_DELETE, @nid);
Я бы сделал чуть проще и просто назначил обработчиком сообщений, обработчик самого окна IconData.Wnd := Form1.handle но сути это не меняет
← →
KyRo © (2003-10-31 09:56) [16]Да процедуры на сообщения от мыши я поставил!
У меня почему то вообще не вызывается эта функция которая рассматривает Message.
Для проверки я поставил там ShowMessage("dfdf")перед Case но она не вызывается хотя должна, а все остальное уже сделано.
← →
KyRo © (2003-10-31 10:08) [17]Все сделал я просто передавал на форму ,а не в процедуру компонента. Вобщем всем спасибо.
Страницы: 1 вся ветка
Текущий архив: 2003.12.26;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.019 c