.data
node NOTIFYICONDATA
szExit db "&Exit", 0
hTrayMenu dd ?
IDI_TRAY = 1000
IDM_EXIT = 101
...
.code
mov [node.cbSize],sizeof.NOTIFYICONDATA
mov eax,[hwnd]
mov [node.hWnd],eax
mov [node.uID],IDI_TRAY
mov [node.uFlags],NIF_ICON+NIF_MESSAGE+NIF_TIP
invoke LoadIcon,NULL,IDI_APPLICATION
mov [node.hIcon],eax
mov dword[node.szTip],"prog"
invoke Shell_NotifyIcon, NIM_ADD,node
...
.rsrc
directory RT_ICON,icons,\
RT_GROUP_ICON,group_icons,\
RT_VERSION,versions
resource icons,\
1,LANG_NEUTRAL,icon_data,\
2,LANG_NEUTRAL,tray_icon_data
resource group_icons,\
17,LANG_NEUTRAL,main_icon,\
IDI_TRAY,LANG_NEUTRAL,tray_icon
resource versions,\
1,LANG_NEUTRAL,version
icon main_icon,icon_data,'MAH2.ico'
icon tray_icon,tray_icon_data,'DAH.ico'
трей и менюшка к иконке...
Код:
Код:
invoke LoadIcon, [wc.hInstance], 17
"mov wc.hIcon,eax"
что используешь?
"invoke LoadIcon,NULL,IDI_APPLICATION" или первый параметр всё равно нулл? (второй может быть IDI_WINLOGO).
Если параметры правильные, то попробуй заново использовать LoadIcon, может глюк в другом месте искать надо (например wc.hIcon - не глобальная переменная и не передаётся в процедуру, где делаешь Shell_NotifyIcon).
Кроме того, если .code начинается именно так и wc.hIcon не заполнялась вообще... (т.е. LoadIcon вообще не вызывалась), то я не понимаю как ты этого хочеш добиться...
Вопрос "трей и менюшка к иконке" очень подробно описан Iczelion`ом в 23 уроке (глянь на wasm.ru):
при создании окна (сообщение WM_CREATE) делаешь так:
invoke CreatePopupMenu (создаешь это меню)
mov hPopupMenu,eax (заносишь его хэндл в переменную)
invoke AppendMenu,hPopupMenu,MF_STRING,IDM_RESTORE,addr RestoreString
invoke AppendMenu,hPopupMenu,MF_STRING,IDM_EXIT,addr ExitString (заполняешь меню строчками - пунктами меню).
А после того, как получишь сообщение указанное в uCallbackMessage (пользовательское сообщение, которое Windows отошлёт указанному в поле hwnd окну, в случае, когда над иконкой произойдёт событие мыши) - ловишь это сообщение в процедуре окна, проверяешь идёт ли оно от IDI_TRAY,
после этого проверяешь какое действие сделал пользователь, к примеру ловишь WM_RBUTTONDOWN,
вызываешь GetCursorPos, чтобы узнать текущие координаты курсора мыши. После возврата из функции, структура POINT содержит абсолютные координаты курсора.
Окно, которое будет получать уведомления от меню, ДОЛЖНО быть на переднем плане, так, что вызывай SetForegroundWindow, чтобы исправить эту проблему.
Дальше Икзелион советует: "После вызова SetForegroundWindow вы обнаружите, что в первый раз всплывающее меню сработает нормально, но при последующем появлении оно будет отображаться, а затем тут же исчезать. Как написано в MSDN, это сделано "намеренно". Необходимо переключить задачу на программу, являющуюся владельцем иконки в system tray. Этого можно добиться, отправив любое сообщение окну вашей программы. Но только используйте PostMessage, а не SendMessage!"
Т.е. после SetForegroundWindow, вызываешь меню:
invoke TrackPopupMenu,hPopupMenu,TPM_RIGHTALIGN,pt.x,pt.y,NULL,hWnd,NULL, при этом pt.x,pt.y - это координаты курсора; TPM_RIGHTALIGN - указание разместить меню слева от указанной точки.
А уже после всего этого вызываешь PostMessage, можно с нулями везде (например: PostMessage,hWnd,WM_NULL,0,0).
при всём при том, в конце, при уничтожении меню\окна\проги (короче WM_DESTROY), вызываешь
"invoke DestroyMenu,hPopupMenu".
и усё)))
удачи)))))
Блин, как я долго писал, хексэдит меня обставил... я плачу)))))
Интересно бум пробывать.... пасиб....!
Цитата: un_named
Блин, как я долго писал, хексэдит меня обставил... я плачу)))))
Да не плач :)
Ты все равно намного лучше меня ответил ;)
Цитата: un_named
...Дальше Икзелион...
а я всегда думал что по русски его ник звучит как айсзелион ^)
Это зависит от того, кто как читает... а для айса на мой взгляд должна быть после первых двух еще буковка е: Icеzelion.
Мне дак всё-таки привычнее простая транскрипция без воспроизведения английской речи...
тем более этот товарищ вообще-то вроде француз:
http://win32assembly.online.fr/