uNID NotifyIconData<Type NotifyIconData,,,,,,'Это всплывающая подсказка…К.О. не дремлет!!!'>
szShell32 DB 'Shell32.dll',0
…
XOr EBX,EBX
Invoke ExtractIcon,EBX,Addr szShell32,47
Mov uNID.hIcon,EAX
Mov uNID.uFlags,NIF_Icon Or NIF_Tip
Invoke Shell_NotifyIcon,NIM_Add,Addr uNID
Mov uNID.NUI.uVersion,NotifyIcon_Version
Invoke Shell_NotifyIcon,NIM_SetVersion,Addr uNID
Invoke Shell_NotifyIcon,NIM_Delete,Addr uNID
Invoke DestroyIcon,uNID.hIcon
Shell_NotifyIcon–значок исчезает при наведении
Код:
Как исправить эту ситуацию?Может,я чего недодал в структуру?
Ещё вопрос:вызывать Shell_NotifyIcon с NIM_SetVersion надо до NIM_Add,после или пофиг?Ибо MSDN'овское "NIM_SETVERSION must be called every time a notification area icon is added (NIM_ADD)" как-то не совсем поясняет,до или после следует устанавливать версию
P.S.Здесь приведён ВЕСЬ код,относящийся к операциям с треем.Т.е. ничего не упущено–заполнения полей и всё такое
Цитата: @pixo $oft
Как исправить эту ситуацию?
Увы, придется прикручивать гуй...
Необходимо окно (uNID.hWnd, можно и скрытое), в которое пойдет сообщение (uNID.uCallbackMessage, сойдет WM_APP+1). Флаги такие: NIF_ICON | NIF_TIP | NIF_MESSAGE | NIF_SHOWTIP.
Цитата: @pixo $oft
вызывать Shell_NotifyIcon с NIM_SetVersion надо до NIM_Add,после или пофиг?
Пример из Platform SDK делает это после создания иконки, если до - терпит фейл.
Код:
#include <tchar.h>
#include <windows.h>
#include <shellapi.h>
HINSTANCE g_hInst;
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
#define uNotifyID 0
#define szNotifyTip _T("Это всплывающая подсказка…К.О. не дремлет!!!")
#define WMAPP_NOTIFYCALLBACK (WM_APP + 1)
NOTIFYICONDATA uNID = {NOTIFYICONDATA_V1_SIZE};
static HICON s_hNotifyIcon;
switch (message)
{
case WMAPP_NOTIFYCALLBACK:
// убей программу правым кликом, %username%
if (uNotifyID == wParam && WM_RBUTTONUP == lParam)
DestroyWindow(hwnd);
break;
case WM_CREATE:
s_hNotifyIcon = ExtractIcon(NULL, _T("shell32.dll"), 47);
uNID.uID = uNotifyID;
uNID.hWnd = hwnd;
uNID.uCallbackMessage = WMAPP_NOTIFYCALLBACK;
uNID.hIcon = s_hNotifyIcon;
uNID.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE | NIF_SHOWTIP;
_tcscpy_s(uNID.szTip, _countof(uNID.szTip), szNotifyTip);
Shell_NotifyIcon(NIM_ADD, &uNID);
uNID.uVersion = NOTIFYICON_VERSION;
Shell_NotifyIcon(NIM_SETVERSION, &uNID);
break;
case WM_DESTROY:
uNID.uID = uNotifyID;
Shell_NotifyIcon(NIM_DELETE, &uNID);
DestroyIcon(s_hNotifyIcon);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
#define szWindowClass _T("MyNotifyIconClass")
HWND hwnd;
MSG msg;
WNDCLASSEX wcex = {sizeof(wcex)};
g_hInst = GetModuleHandle(NULL);
wcex.lpfnWndProc = WndProc;
wcex.hInstance = g_hInst;
wcex.lpszClassName = szWindowClass;
RegisterClassEx(&wcex);
if (hwnd = CreateWindow(szWindowClass, NULL, WS_OVERLAPPEDWINDOW,
0, 0, 0, 0, NULL, NULL, g_hInst, NULL));
{
ShowWindow(hwnd, SW_HIDE);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return 0;
}
#include <windows.h>
#include <shellapi.h>
HINSTANCE g_hInst;
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
#define uNotifyID 0
#define szNotifyTip _T("Это всплывающая подсказка…К.О. не дремлет!!!")
#define WMAPP_NOTIFYCALLBACK (WM_APP + 1)
NOTIFYICONDATA uNID = {NOTIFYICONDATA_V1_SIZE};
static HICON s_hNotifyIcon;
switch (message)
{
case WMAPP_NOTIFYCALLBACK:
// убей программу правым кликом, %username%
if (uNotifyID == wParam && WM_RBUTTONUP == lParam)
DestroyWindow(hwnd);
break;
case WM_CREATE:
s_hNotifyIcon = ExtractIcon(NULL, _T("shell32.dll"), 47);
uNID.uID = uNotifyID;
uNID.hWnd = hwnd;
uNID.uCallbackMessage = WMAPP_NOTIFYCALLBACK;
uNID.hIcon = s_hNotifyIcon;
uNID.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE | NIF_SHOWTIP;
_tcscpy_s(uNID.szTip, _countof(uNID.szTip), szNotifyTip);
Shell_NotifyIcon(NIM_ADD, &uNID);
uNID.uVersion = NOTIFYICON_VERSION;
Shell_NotifyIcon(NIM_SETVERSION, &uNID);
break;
case WM_DESTROY:
uNID.uID = uNotifyID;
Shell_NotifyIcon(NIM_DELETE, &uNID);
DestroyIcon(s_hNotifyIcon);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
#define szWindowClass _T("MyNotifyIconClass")
HWND hwnd;
MSG msg;
WNDCLASSEX wcex = {sizeof(wcex)};
g_hInst = GetModuleHandle(NULL);
wcex.lpfnWndProc = WndProc;
wcex.hInstance = g_hInst;
wcex.lpszClassName = szWindowClass;
RegisterClassEx(&wcex);
if (hwnd = CreateWindow(szWindowClass, NULL, WS_OVERLAPPEDWINDOW,
0, 0, 0, 0, NULL, NULL, g_hInst, NULL));
{
ShowWindow(hwnd, SW_HIDE);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return 0;
}
Прога без гуя что мужик без …Так,о чём это я?
Да,насколько я помню,вызов NIM_SetVersion фэйл-таки терпел(сейчас нет времени затестить).Теперь буду переводить на асм,спасибо,что набрал за меня:)
И да,окна нулевого размера рулят!:D
P.S.Ну и спасибо за то,что доставил мне радости–завтра защищать курсовую,я хоть немного разрядился (=
Цитата:
И да,окна нулевого размера рулят!
Лучше всё таки скрытые. Я конечно не уверен, но Windows вполне может пытаться их отрисовать и совершать с ними другие операции, отнимая ресурсы.