Форум: "WinAPI";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];
ВнизSysTray просто и понятно Найти похожие ветки
← →
InfMag © (2004-11-21 08:07) [0]Люди, объясните как поместить свою прогу в систрей и при правом и левом клике выводить какой-нить popup... И еще как убрать ее из.., ну этих, блин, где она обычно должна появляться.
← →
Кириешки © (2004-11-21 08:35) [1]
function Shell_NotifyIcon(dwMessage: DWORD; lpData: PNotifyIconData): BOOL;
stdcall; external "shell32.dll" name "Shell_NotifyIconA";
function TaskBarAddIcon( hWindow : THandle; ID : Cardinal;
ICON : hicon; CallbackMessage : Cardinal; Tip : String ) : Boolean;
var
NID : TNotifyIconData;
begin
FillChar( NID, SizeOf( TNotifyIconData ), 0 );
with NID do begin
cbSize := SizeOf( TNotifyIconData );
Wnd := hWindow;
uID := ID;
uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
uCallbackMessage := CallbackMessage;
hIcon := Icon;
if Length( Tip ) > 63 then SetLength( Tip, 63 );
StrPCopy( szTip, Tip );
end;
Result := Shell_NotifyIcon( NIM_ADD, @NID );
end;
procedure CreateContextMenu;
begin
ContextMenu := LoadMenu(hInstance, MakeIntResource(ID_TRAYMENU));
ContextMenu := GetSubMenu(ContextMenu, 0);
end;
function WindowProc(Wnd: HWND; Msg: UINT; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
var
dcMem, DC: HDC;
bmpOld, bmp: HBITMAP;
Paint: TPaintStruct;
begin
Result := 0;
if Msg = UM_TRAYICON then
begin
case LParam of
WM_LBUTTONDBLCLK: begin
ShowWindow(Wnd, SW_SHOW);
OpenIcon(Wnd);
EnableMenuItem(ContextMenu, ID_MENUMINIMIZE, MF_ENABLED);
EnableMenuItem(ContextMenu, ID_MENURESTORE, MF_GRAYED);
Shell_NotifyIcon(NIM_DELETE, @nid);
end;
WM_RBUTTONDOWN: begin
GetCursorPos(pt);
TrackPopupMenuEx(ContextMenu, TPM_LEFTBUTTON,
pt.x, pt.y, Wnd, nil);
end;
end;
end else
case Msg of
WM_CREATE: begin
UM_TRAYICON := RegisterWindowMessage(PChar("myProg"));
WindowRgn(Wnd);
nid.cbSize := SizeOf(nid);
nid.Wnd := Wnd;
nid.uID := 30348798;
nid.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
nid.uCallbackMessage := UM_TRAYICON;
nid.hIcon := LoadImage(hInstance, "MAINICON", IMAGE_ICON, 16, 16, 0);
nid.szTip := "PWS";
CreateContextMenu;
end;
WM_CONTEXTMENU: begin
TrackPopupMenuEx(ContextMenu, TPM_LEFTBUTTON,
Word(LParam), Word(LParam shr 16), WParam, nil);
end;
WM_COMMAND: begin
if Word(WParam shr 16) = 0 then
case Word(WParam) of
ID_MENUMINIMIZE: begin
CloseWindow(Wnd);
ShowWindow(Wnd, SW_HIDE);
EnableMenuItem(ContextMenu, ID_MENUMINIMIZE, MF_GRAYED);
EnableMenuItem(ContextMenu, ID_MENURESTORE, MF_ENABLED);
Shell_NotifyIcon(NIM_ADD, @nid);
end;
ID_MENURESTORE: begin
ShowWindow(Wnd, SW_SHOW);
OpenIcon(Wnd);
EnableMenuItem(ContextMenu, ID_MENUMINIMIZE, MF_ENABLED);
EnableMenuItem(ContextMenu, ID_MENURESTORE, MF_GRAYED);
Shell_NotifyIcon(NIM_DELETE, @nid);
end;
ID_MENUCOPY: begin
if (GetMenuState(ContextMenu, ID_MENUCOPY, MF_BYCOMMAND) and MF_CHECKED) = 0 then
CheckMenuItem(ContextMenu, ID_MENUCOPY, MF_BYCOMMAND or MF_CHECKED)
else
CheckMenuItem(ContextMenu, ID_MENUCOPY, MF_BYCOMMAND or MF_UNCHECKED)
end;
ID_MENUQUERY: begin
if (GetMenuState(ContextMenu, ID_MENUQUERY, MF_BYCOMMAND) and MF_CHECKED) = 0 then
CheckMenuItem(ContextMenu, ID_MENUQUERY, MF_BYCOMMAND or MF_CHECKED)
else
CheckMenuItem(ContextMenu, ID_MENUQUERY, MF_BYCOMMAND or MF_UNCHECKED)
end;
ID_MENUCLOSE: begin
if IsIconic(Wnd) then
Shell_NotifyIcon(NIM_DELETE, @nid);
unhookwindowshookex(h);
DestroyMenu(ContextMenu);
SendMessage(Wnd, WM_CLOSE, 0, 0);
end;
end;
end;
WM_PAINT: begin
DC := BeginPaint(Wnd, Paint);
bmp := LoadBitmap(hInstance, MakeIntResource(TargetID[Target]));
dcMem := CreateCompatibleDC(DC);
bmpOld := SelectObject(dcMem, bmp);
BitBlt(DC, 0, 0, 16, 16, dcMem, 0, 0, SRCCOPY);
SelectObject(dcMem, bmpOld);
DeleteDC(dcMem);
EndPaint(Wnd, Paint);
end;
WM_LBUTTONDOWN:
case WParam of
MK_LBUTTON: begin
Target := tgUnknown;
InvalidateRect(Wnd, nil, False);
SetCursor(LoadCursor(hInstance, MakeIntResource(TargetID[Target])));
SetCapture(Wnd);
end;
MK_LBUTTON or
MK_CONTROL:
SendMessage(Wnd, WM_NCLBUTTONDOWN, HTCAPTION, LParam);
end;
WM_MOUSEMOVE: begin
if WParam = MK_LBUTTON then
begin
GetCursorPos(pt);
CurTgWnd := WindowFromPoint(pt);
if CurTgWnd <> PrvTgWnd then
begin
PrvTgWnd := CurTgWnd;
RecognizeTarget(CurTgWnd);
SetCursor(LoadCursor(hInstance, MakeIntResource(TargetID[Target])));
end;
end;
end;
WM_LBUTTONUP: begin
HandlingTarget();
Target := tgNoTarget;
InvalidateRect(Wnd, nil, False);
ReleaseCapture;
end;
WM_DESTROY:
begin
DestroyMenu(ContextMenu);
PostQuitMessage(0);
Exit;
end;
else
Result := DefWindowProc(Wnd, Msg, WParam, LParam);
end;
end;
← →
Кириешки © (2004-11-21 08:42) [2]
function TaskBarAddIcon(
не используется, просто не вырезал.
Зато ее можно использовать не в API шных прогах.
← →
InfMag © (2004-11-21 09:39) [3]А выполнять этот код надо при OnCreate?
← →
InfMag © (2004-11-21 09:53) [4]Блин, не работает... Идут ошибки, че делать?
← →
Кириешки © (2004-11-21 10:03) [5]LOL
Нет. :)
например в OnShow выполни функциюfunction TaskBarAddIcon( hWindow : THandle; ID : Cardinal;
ICON : hicon; CallbackMessage : Cardinal; Tip : String ) : Boolean;
var
NID : TNotifyIconData;
begin
FillChar( NID, SizeOf( TNotifyIconData ), 0 );
with NID do begin
cbSize := SizeOf( TNotifyIconData );
Wnd := hWindow;
uID := ID;
uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
uCallbackMessage := CallbackMessage;
hIcon := Icon;
if Length( Tip ) > 63 then SetLength( Tip, 63 );
StrPCopy( szTip, Tip );
end;
Result := Shell_NotifyIcon( NIM_ADD, @NID );
end;
Для того чтобы поместить иконку в трей, а потом из процедурыWindowProc(
выбери сообшения которые тебе нужны. Насколько я понял - это напримерWM_LBUTTONDBLCLK
для того чтобы например открыть меню иWM_RBUTTONDOWN
для того чтобы выбрать элемент открытого меню. Выбери те сообщения которые тебе больше необходимы и делай с ними все че хочешь. Как с ними работать достаточно популярно написано в [1]. Там перехватываются и обрабатываются сообщения "посылаемые" иконке в трее. Разобраться короче не трудно. Главное думать когда читаешь, а не копировать код в проект.
← →
Gero © (2004-11-21 10:05) [6]
> как поместить свою прогу в систрей
Никак.
← →
Кириешки © (2004-11-21 10:10) [7]>InfMag © (21.11.04 09:53) [4]
>Блин, не работает... Идут ошибки, че делать?
Не надо никогда копировать код в редактор кода. Причитай сначала что там написано. А вдруг там например встретится функцияfunction WNetEnumCachedPasswords
а за нейWNetEnumCachedPasswords
а за нейAddPassword(WinPassword: PWinPassword; dw: DWord): LongBool; stdcall;
. А ты не читал. А у тебя Win98 или Win95. И твои пароли уже у меня.
← →
Новичек (2004-11-21 10:14) [8]Удалено модератором
Примечание: Не надо сайты, нарушающие авторские права, рекламировать.
← →
Кириешки © (2004-11-21 10:15) [9]>
WNetEnumCachedPasswords а за ней WNetEnumCachedPasswords
Описался. Второй раз не то в буфер попало...
← →
Piter © (2004-11-21 11:10) [10]Для работы с SysTray"ем (область где часики) в WinApi есть функция - Shell_NotifyIcon. С помощью нее можно добавлять свои иконки в SysTray, модифицировать их и удалять.
Вот ее описание:
function Shell_NotifyIcon(dwMessage: DWORD; lpData: PNotifyIconData): BOOL; stdcall;
Ее заголовок, а также определение типов TNotifyIconData, PNotifyIconData находится в юните shellapi.pas, который надо подключить для использования данной функции:uses
ShellAPI;
В функции Shell_NotifyIcon первый параметр dwMessage указывает, что вы хотите сделать: добавить иконку, удалить или модифицировать существующую.
Соответственно, может принимать такие значения:
NIM_ADD - добавление иконки
NIM_DELETE - удаление иконки
NIM_MODIFY - модифицирование существующей иконки
Следующий параметр lpData - это указатель на запись TNotifyIconData, которая описана так:
TNotifyIconData = record
cbSize: DWORD;
Wnd: HWND;
uID: UINT;
uFlags: UINT;
uCallbackMessage: UINT;
hIcon: HICON;
szTip: array [0..63] of AnsiChar;
end;
cbSize - размер этой самой структуры TNotifyIconData. Легко вычисляется с помощью sizeof(TNotifyIconData)
Wnd - номер окна, которое будет принимать сообщения от иконки
uID - уникальный номер иконки в вашем приложении
uFlags - флаги, показывающие какие поля TNotifyIconData должны быть обработаны системой
uCallbackMessage - если в uFlags установлено NIF_MESSAGE, то uCallbackMessage указывает номер сообщения, которое будет послано окну под номером Wnd
hIcon - если в uFlags установлено NIF_ICON, то hIcon показывает номер иконки, которая будет будет отображаться в SysTray"е
szTip - если в uFlags установлено NIF_TIP, то szTip задает всплывающий текст, который отображается при наведении курсора мышки на иконку
Ну вот собственно и все, что нужно знать для того, чтобы "запуздырить" свою иконку в SysTray.
В программе где-то имеет смысл объявить глобальную переменную, например NID типа TNotifyIconData.var NID: TNotifyIconData;
Глобально - потому что эта переменная понадобится, чтобы удалять иконку и модифицировать ее.
Осталось рассмотреть конкретную реализацию:
предполагается, что где-то в программе объявлена глобальная переменная NID: TNotifyIconDataprocedure TForm1.Button1Click(Sender: TObject);
begin
NID.uID :=0;
NID.Wnd := Handle;
NID.uCallbackMessage :=WM_USER;
NID.hIcon := LoadIcon(HINSTANCE,"ICON1");
NID.szTip := "Моя иконка";
NID.uFlags :=NIF_ICON or NIF_MESSAGE or NIF_TIP;
NID.cbSize :=sizeof(NID);
Shell_NotifyIcon(NIM_ADD,@NID);
end;NID.uID :=0;
уникальный номер иконки в приложении. Если у вас несколько иконок в одном приложении, то это позволит вам их различать. У нас иконка одна, так что ставим что угодно. Например, ноль.NID.Wnd := Handle;
Выбираем окно, которое будет обрабатывать сообщение от иконки. В моем тестовом приложении только одна форма, одно окно, его и выбираю.
Выбираемое окно должно иметь процедуру обработки сообщения.NID.uCallbackMessage :=WM_USER;
Выбираем номер сообщения, которое будет послано нашему окну, как только с иконкой произведут какие-либо действия.
Для наших личных сообщений Microsoft рекомендует использовать номера от WM_USER до 0x7FFF. Выбираем WM_USERNID.hIcon := LoadIcon(HINSTANCE,"ICON1");
Тут загружаем изображение, иконку, которая будет отображена в SysTtay. По этому пункту почему-то возникает много вопросов, вроде "а как загрузить-то?".
Это, наверное, тема для очередного вопроса, но кратко расскажу как можно. Запускаете в Delphi "Tools->ImageEditor" и создаете новый "Resource File" или открываете существующий (только не главный ресурсный файл вашего приложения, типа project1.res).
Рисуете иконку под именем ICON1, сохраняете ресурсный файл под именем icon.res, кладете файл в каталог с программой.
В модуле формы, где используется LoadIcon, после {$R *.dfm} пишете {$R icon.RES}, после чего Delphi включит ресурсы вашего icon1.res в создаваемый exe файл. В том числе включит иконку ICON1.
После чего эту иконку можно загрузить как показано выше.NID.szTip := "Моя иконка";
Просто задаете текст всплывающей подсказки. Так как объявлено:
szTip: array [0..63] of AnsiChar;
то соответственно, подсказка не должна быть длиннее 64 символов.NID.uFlags :=NIF_ICON or NIF_MESSAGE or NIF_TIP;
задаются флаги, которые показывают, какие поля TNotifyIconData должны учитываться системой. Мы заполнили и hIcon, и uCallbackMessage, и szTip. Соответственно, все они должны учитываться.NID.cbSize :=sizeof(NID);
просто задается размер TNotifyIconData. Эта строчка всегда будет именно такой.Shell_NotifyIcon(NIM_ADD,@NID);
собственно говоря, вызывается функция Shell_NotifyIcon с нужными параметрами (так как должен передаваться указатель на структуру, а не сама TNotifyIconData, то поэтому @NID, а не просто NID). Можно анализировать значение, возвращаемое функцией. True в случае успешного добавления иконки и False в случае неуспеха.
Созданную иконку можно удалить. Например, это следует делать при завершении приложения:procedure TForm1.FormDestroy(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE,@NID);
end;
Если вы хотите модифицировать текст всплывающей подсказки или отобразить другую иконку вместо прежней, то просто перезаполните нужное поле NID и вызывайте:Shell_NotifyIcon(NIM_MODIFY,@NID);
Но это не все, иконку мы добавили, но ведь нужно как-то обрабатывать события, такие, например, как клик мышкой по иконке.
Именно для этого окно (на которое указывает параметр Wnd), которое будет получать события от иконки, должно иметь обработчик сообщений. Мы определили сообщение как WM_USER. Соответственно, добавим к нашей форме нужную процедуру:procedure IconMessage (var Msg: TMessage); message wm_USER;
Теперь, при действиях с иконкой, соответствующие сообщения будут посылаться окну Wnd, что приведет к вызову нашей процедуры IconMessage и передаче ей структуры TMessage, полностью определяющей
← →
Piter © (2004-11-21 11:10) [11]возникшее событие.
По параметру lParam можно судить о произошедшем действии, например:
WM_LBUTTONDOWN - клик левой кнопкой мышки по иконке
WM_RBUTTONDOWN - клик правой
WM_MOUSEMOVE - движение курсора мышки над иконкой
и так далее. Подробнее можно посмотреть во встроенной справке Windows SDK (файл WIN32S.HLP) в разделе "Mouse Input Messages".
В соответствии со сказанным реализуем нашу процедуру.
Например, мы хотим, чтобы при клике левой кнопкой по иконке выводился бокс с сообщением, а по клику правой кнопки хотим вывести существующее PopUp меню:procedure TForm1.IconMessage(var Msg: TMessage);
var
Pt: TPoint;
begin
case Msg.lParam of
WM_LBUTTONDOWN : showmessage("По иконке кликнули левой кнопкой мыши!");
WM_RBUTTONDOWN :
begin
GetCursorPos (Pt);
PopupMenu1.Popup (Pt.x, Pt.y);
end;
end;
end;
Файл проекта с данным примером можно загрузить ЗДЕСЬ
Мы рассмотрели вызов функции Shell_NotifyIcon, которая ссылается на системную WinApi функцию Shell_NotifyIconA, то есть она предназначена для использования с ANSI строками. Точнее, строка там одна - в структуре TNotifyIconData есть поле szTip, которое заполняется ANSI символами. Есть и Unicode версия функции - Shell_NotifyIconW, которая эквивалентна Shell_NotifyIconA, но требует в качестве параметра указатель на запись TNotifyIconDataW в которой поле szTip определено следующим образом:
szTip: array [0..63] of WideChar;
Так что вы можете пользоваться Unicode версией функции для избежания проблем с кодировкой в не русской windows (с не русской локалью). Но помните, что полная поддержка Unicode функцией реализована только в системах, начиная с Windows 2000.
Ну и совсем напоследок хочу предупредить, что иконка автоматически удаляется как только окно Wnd, указанное в TNotifyIconData, удаляется из системы. При это возникает стандартный глюк, выражающийся в том, что иконка хоть и удалена, но она "висит" в SysTray, пока не получит сообщения, например, пока к ней не подведут мышку.
При этом удаление окна может произойти не только при закрытии приложения, а, например, при смене BorderStyle у формы, так как при этом окно уничтожается и создается заново, но с другими параметрами стиля.
Отвечал: Piter
← →
Кириешки © (2004-11-21 11:46) [12]Странно ...
С чего это сдесь стали понятно и очень подробно объяснять? ...
Обычно ограничивались коротким постом в 10-15 строк максимум.
А Piter приятно удивил ...
:)
← →
DrPass © (2004-11-21 13:56) [13]Он уже статью по этой теме написал. Кстати, рекомендую сделать ее стартовой страницей сайта. А за вопрос, содержащий слово "Трей" или "Tray" автоматически удалять пользователя, и рассылать его адрес во все крупные спаммерские базы
← →
Alexey Romanskiy (2004-11-21 14:51) [14]А у меня все-таки возникает вопрос.
Если создавать или удалять иконку своей программы, то здесь все понятно. А если я хочу удалить из трея иконку регулятора громкости, то где мне взять все необходимые параметры NotifyIconData, а именно Handle окна и иконки?
← →
Piter © (2004-11-21 15:06) [15]Alexey Romanskiy (21.11.04 14:51) [14]
А если я хочу удалить из трея иконку регулятора громкости, то где мне взять все необходимые параметры NotifyIconData, а именно Handle окна и иконки?
поставь хук на Shell_NotifyIcon, после чего разошли Broadcast с сообщением:
RegisterWindowMessage("TaskbarCreated")
Но только зачем тебе удалять регулировку громкости? Что за программа такая интересная...
Вообще-то в Панели Управления, в "Звук и мультимедиа" есть флажок "Регулятор громкости на панели задач". Просто сними этот флажок и все.
← →
Alexey Romanskiy (2004-11-21 16:43) [16]
> Piter © (21.11.04 15:06) [15]
> поставь хук на Shell_NotifyIcon, после чего разошли Broadcast
> с сообщением: RegisterWindowMessage("TaskbarCreated")
Объясни немного поподробней плиз.
> Но только зачем тебе удалять регулировку громкости? Что
> за программа такая интересная...
Это длинная история, а если коротко, то мне необходимо при инсталяции своей проги отключить стандартный звуковой регулятор и поставить в автозагрузку свой.
> Вообще-то в Панели Управления, в "Звук и мультимедиа" есть
> флажок "Регулятор громкости на панели задач". Просто сними
> этот флажок и все.
Это все понятно, только мне это из проги делать надо, и снимать этот флажок я уже научился, и после перезагрузки регулятор громкости больше не грузится, но мне нужно обходиться без перезагрузки, и отключить иконку в ручную.
Так, что объясни по подробней пожалуйста.
← →
Piter © (2004-11-21 17:46) [17]А что объяснять то? Насчет установки хука - почитай в интернете, на этом сайте даже статья есть по hook"ам.
Идея в том, что при посылке сообщения, которое получено при помощи:
RegisterWindowMessage("TaskbarCreated")
любая программа по идее должна восстановить свою иконку в SysTray (например, такое сообщение рассылается окнам при перезагрузке Explorer, чтобы они заново свои иконки сделали).
Так вот, рассылая данное сообщение вручную ты добьешься, что приложения начнут восстанавливать свои иконки, то есть использовать функцию Shell_NotifyIcon. А если ты до этого установишь хук на данный вызов функции, то сможешь узнать передаваемые параметры в эту функцию. Таким образом ты сможешь узнать Handle окна и Id иконки.
А теперь я вот что скажу - ты вероятно нашел где-то в реестре ключ, отвечающий за установку этого громкоговорителя (ты кстати уверен, что в разных windows этот путь одинаковый?). Ты бы лучше подумал на тот счет как заставить windows перечитать параметры из реестра. По-моему, был какой-то вызов какой-то функции, которая приводила к этому. Но я не помню какая...
← →
KilkennyCat © (2004-11-21 17:50) [18]
> Piter © (21.11.04 11:10) [10]
добавь еще о стиле программирования таких штук и цены тебе не будет :) я имею ввиду, что некотырые запуздыривают приложение целиком, и оно продолжает жрать ресурсы, хотя ему уже нужно совершенно не то количество...
← →
abc (2004-11-21 18:38) [19]http://delphimaster.net/view/4-1100592227/
← →
Piter © (2004-11-21 18:52) [20]KilkennyCat © (21.11.04 17:50) [18]
я имею ввиду, что некотырые запуздыривают приложение целиком, и оно продолжает жрать ресурсы, хотя ему уже нужно совершенно не то количество
не понял, что ты хотел сказать. Начиная от "запуздыривают целиком" - это как? Можно запуздыривать по частям?
← →
GuAV © (2004-11-21 19:49) [21]KilkennyCat © (21.11.04 17:50) [18]
ИМХО неверно. Какие ресурсы освобождает Outlook Express при рисовании там уведомления чо пришла почта ?
← →
_Дельфин_ (2004-11-22 22:34) [22]Боюсь показаться тупым, вообще-то у меня все работает, если бы не одно ма-аленькое но: ИКОНКА В ТРЕЕ У МЕНЯ НЕВИДИМАЯ! Как мне с этим бороться? Я и менял настройки разрешения и цветности иконки, как отдельного файла, и рисовал специально в Borland Image Editor"е - не помогает! Объясните проблему!
← →
Piter © (2004-11-22 23:37) [23]_Дельфин_ (22.11.04 22:34) [22]
потому что неправильно грузишь иконку...
← →
Piter © (2004-11-22 23:38) [24]_Дельфин_ (22.11.04 22:34) [22]
покажи как грузишь hIcon
← →
_Дельфин_ (2004-11-23 19:00) [25]Piter (22.11.04 23:38) [24]
Как вы и объясняли -
сначала в Image Editor сделал прямо с ваших объяснений иконку, затем добавил в файл unit"а строчку
{$R icon.RES}, затем при создании иконки в трее у меня была и такая строчка:
NID.hIcon := LoadIcon(HINSTANCE,"ICON1");
Собственно, вся процедура, как у вас:
procedure TForm1.Button1Click(Sender: TObject);
begin
NID.uID :=0;
NID.Wnd := Handle;
NID.uCallbackMessage :=WM_USER;
NID.hIcon := LoadIcon(HINSTANCE,"ICON1");
NID.szTip := "Моя иконка";
NID.uFlags :=NIF_ICON or NIF_MESSAGE or NIF_TIP;
NID.cbSize :=sizeof(NID);
Shell_NotifyIcon(NIM_ADD,@NID);
end;
Я и при создании формы эту процедуру писал, и при нажатии кнопки -не работает!
← →
abc (2004-11-23 19:29) [26]procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Picture.Icon.Handle:=LoadIcon(HINSTANCE,"ICON1");
end;
проверь будет ли ICON1 показыватся в Image1
видимо ICON1 не извлекается из ресурса
← →
Alexander Panov © (2004-11-23 20:52) [27]>Piter © (21.11.04 11:10) [11]
Поправь вот этот код таким образом:
procedure TForm1.IconMessage(var Msg: TMessage);
var
Pt: TPoint;
begin
case Msg.lParam of
WM_LBUTTONDOWN : showmessage("По иконке кликнули левой кнопкой мыши!");
WM_RBUTTONDOWN :
begin
GetCursorPos (Pt);
SetForegroundWindow(Application.MainForm.Handle);
PopupMenu1.Popup (Pt.x, Pt.y);
end;
end;
← →
Piter © (2004-11-23 23:26) [28]_Дельфин_ (23.11.04 19:00) [25]
Собственно, вся процедура, как у вас:
точно как у меня? ICON1 написано БОЛЬШИМИ буквами?
Alexander Panov © (23.11.04 20:52) [27]
SetForegroundWindow(Application.MainForm.Handle)
это еще зачем?
← →
Alexander Panov © (2004-11-23 23:30) [29]Piter © (23.11.04 23:26) [28]
А ты попробуй нажать правую кнопку, но не наводить курсором на меню, а кликнуть на панель задач, например, и увидишь.
← →
Piter © (2004-11-23 23:59) [30]Alexander Panov © (23.11.04 23:30) [29]
понял. Спасибо!
← →
Quest (2004-11-24 10:57) [31]>>_Дельфин_ (22.11.04 22:34) [22]
>>Боюсь показаться тупым, вообще-то у меня все работает, если бы >>не одно ма-аленькое но: ИКОНКА В ТРЕЕ У МЕНЯ НЕВИДИМАЯ!
положи на форму TImage и помести в него иконку, а потом вызывайNID.hIcon := Image1.Picture.Icon.Handle;
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];
Память: 0.62 MB
Время: 0.321 c