в архиве нашёл две версии, обе не работают, исправить не получилось
встроеная подсказка 64 символа, маловато это, и она по разному отображается в разных виндах
поиск даёт только подсказки для гаджетов или я не так искал
Своя подсказка в Tray
Страница: 1
Сообщений 1 страница 3 из 3
Поделиться120.11.2020 11:00:26
Поделиться220.11.2020 14:11:56
не разбирался, exe'шники на masm'е работают. Поищи здесь:
https://www.purebasic.fr/english/search … mit=Search
Код:
.586 .model flat,stdcall option casemap:none include windows.inc include user32.inc include kernel32.inc include shell32.inc includelib user32.lib includelib kernel32.lib includelib shell32.lib m2m MACRO M1,M2 push M2 pop M1 ENDM WM_SHELLNOTIFY equ WM_USER+5 IDI_TRAY equ 0 IDM_RESTORE equ 1000 IDM_EXIT equ 1010 WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD .data ClassName db "TrayIconWinClass",0 AppName db "TrayIcon Demo",0 RestoreString db "&Kill ToolTips",0 ExitString db "E&xit Program",0 TOOLTIPS_CLASS db "tooltips_class32",0 szToolTipsCaption db "Info",0 szBuffer db "Можно добавить в угол иконки точку нестандартного цвета, и найти её (GetPixel). Так найдёшь координаты." szBuffer1 db "попробуйте представить - не оч быстрая затея точки перебирать ;-) Может есть какие-нибудь более простые варианты ? :) Возможно есть у кого идеи как стандартный Balloon сделать автозакрывающимся или подобные ?",0 .data? hInstance dd ? note NOTIFYICONDATA <> hPopupMenu dd ? hToolTips dd ? hToolBar dd ? ;szBuffer db 2048 dup (?) .code start: invoke GetModuleHandle, NULL mov hInstance,eax invoke WinMain, hInstance,NULL,NULL, SW_SHOWDEFAULT invoke ExitProcess,eax WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInst pop wc.hInstance mov wc.hbrBackground,COLOR_APPWORKSPACE mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName,ADDR AppName,\ WS_OVERLAPPED+WS_CAPTION+WS_SYSMENU+WS_MINIMIZEBOX+WS_MAXIMIZEBOX+WS_VISIBLE,CW_USEDEFAULT,\ CW_USEDEFAULT,350,200,NULL,NULL,\ hInst,NULL mov hwnd,eax .while TRUE invoke GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .endw mov eax,msg.wParam ret WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL point:POINT LOCAL toolinfo:TOOLINFO .if uMsg==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 .elseif uMsg==WM_DESTROY invoke PostQuitMessage,NULL .elseif uMsg==WM_SIZE .if wParam==SIZE_MINIMIZED mov note.cbSize,sizeof NOTIFYICONDATA push hWnd pop note.hwnd mov note.uID,IDI_TRAY mov note.uFlags,NIF_ICON+NIF_MESSAGE mov note.uCallbackMessage,WM_SHELLNOTIFY invoke LoadIcon,NULL,IDI_WINLOGO mov note.hIcon,eax invoke lstrcpy,addr note.szTip,addr AppName invoke ShowWindow,hWnd,SW_HIDE invoke Shell_NotifyIcon,NIM_ADD,addr note .endif .elseif uMsg==WM_COMMAND .if lParam==0 mov eax,wParam .if ax==IDM_EXIT invoke Shell_NotifyIcon,NIM_DELETE,addr note invoke DestroyWindow,hWnd .elseif ax==IDM_RESTORE mov toolinfo.cbSize,SIZEOF TOOLINFO mov toolinfo.uFlags,TTF_IDISHWND or TTF_TRACK m2m toolinfo.hWnd,NULL m2m toolinfo.uId,hToolBar mov toolinfo.hInst,NULL invoke SendMessage,hToolTips,TTM_TRACKACTIVATE,FALSE,ADDR toolinfo invoke DestroyWindow,hToolTips mov hToolTips,0 .endif .endif .elseif uMsg==WM_SHELLNOTIFY .if wParam==IDI_TRAY .if lParam==WM_RBUTTONDOWN invoke GetCursorPos,addr point invoke TrackPopupMenu,hPopupMenu,TPM_RIGHTALIGN,point.x,point.y,NULL,hWnd,NULL .elseif lParam==WM_MOUSEMOVE .if hToolTips==0 invoke MessageBeep,10 invoke GetCursorPos,ADDR point invoke WindowFromPoint,point.x,point.y mov hToolBar,eax invoke CreateWindowEx,WS_EX_TOPMOST,ADDR TOOLTIPS_CLASS,NULL,TTS_ALWAYSTIP or TTS_BALLOON,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hWnd,NULL,hInstance,NULL mov hToolTips,eax mov toolinfo.cbSize,SIZEOF TOOLINFO mov toolinfo.uFlags,TTF_IDISHWND or TTF_TRACK m2m toolinfo.hWnd,NULL m2m toolinfo.uId,hToolBar mov toolinfo.hInst,NULL mov toolinfo.lpszText,OFFSET szBuffer invoke SendMessage,hToolTips,TTM_ADDTOOL,0,ADDR toolinfo invoke SendMessage,hToolTips,TTM_SETMAXTIPWIDTH,0,500 invoke SendMessage,hToolTips,TTM_SETTITLE,1,ADDR szToolTipsCaption mov ecx,point.y shl ecx,10h mov eax,point.x or ecx,eax invoke SendMessage,hToolTips,TTM_TRACKPOSITION,0,ecx invoke SendMessage,hToolTips,TTM_TRACKACTIVATE,TRUE,ADDR toolinfo .endif .endif .endif .else invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .endif xor eax,eax ret WndProc endp end start .586 .model flat,stdcall option casemap:none include windows.inc include user32.inc include kernel32.inc include shell32.inc includelib user32.lib includelib kernel32.lib includelib shell32.lib ;-------- Debug ----------- include c:\masm32\include\masm32.inc includelib \MASM32\LIB\masm32.lib ;include \masm32\include\debug.inc ;includelib \masm32\lib\debug.lib m2m MACRO M1,M2 push M2 pop M1 ENDM WM_SHELLNOTIFY equ WM_USER+5 IDI_TRAY equ 0 IDM_RESTORE equ 1000 IDM_EXIT equ 1010 WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD .data ClassName db "TrayIconWinClass",0 AppName db "TrayIcon Demo",0 RestoreString db "&Kill ToolTips",0 ExitString db "E&xit Program",0 TOOLTIPS_CLASS db "tooltips_class32",0 szToolTipsCaption db "Info",0 szBuffer db "ћожно добавить в угол иконки точку нестандартного цвета, и найти еЄ (GetPixel). “ак найдЄшь координаты." szBuffer1 db "попробуйте представить - не оч быстра¤ зате¤ точки перебирать ;-) ћожет есть какие-нибудь более простые варианты ? :) ¬озможно есть у кого идеи как стандартный Balloon сделать автозакрывающимс¤ или подобные ?",0 .data? hInstance dd ? note NOTIFYICONDATA <> hPopupMenu dd ? hToolTips dd ? hToolBar dd ? ;szBuffer db 2048 dup (?) .code start: invoke GetModuleHandle, NULL mov hInstance,eax invoke WinMain, hInstance,NULL,NULL, SW_SHOWDEFAULT invoke ExitProcess,eax WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInst pop wc.hInstance mov wc.hbrBackground,COLOR_APPWORKSPACE mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName,ADDR AppName,\ WS_OVERLAPPED+WS_CAPTION+WS_SYSMENU+WS_MINIMIZEBOX+WS_MAXIMIZEBOX+WS_VISIBLE,CW_USEDEFAULT,\ CW_USEDEFAULT,350,200,NULL,NULL,\ hInst,NULL mov hwnd,eax .while TRUE invoke GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .endw mov eax,msg.wParam ret WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL point:POINT LOCAL toolinfo:TOOLINFO .if uMsg==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 invoke SetTimer, hWnd, 0e0e0e44h, 3000, NULL .elseif uMsg==WM_DESTROY invoke PostQuitMessage,NULL .elseif uMsg==WM_TIMER invoke GetCursorPos,ADDR point invoke WindowFromPoint,point.x,point.y .if eax!=hToolBar invoke SendMessage, hWnd, WM_COMMAND,IDM_RESTORE, NULL .endif .elseif uMsg==WM_SIZE .if wParam==SIZE_MINIMIZED mov note.cbSize,sizeof NOTIFYICONDATA push hWnd pop note.hwnd mov note.uID,IDI_TRAY mov note.uFlags,NIF_ICON+NIF_MESSAGE mov note.uCallbackMessage,WM_SHELLNOTIFY invoke LoadIcon,NULL,IDI_WINLOGO mov note.hIcon,eax invoke lstrcpy,addr note.szTip,addr AppName invoke ShowWindow,hWnd,SW_HIDE invoke Shell_NotifyIcon,NIM_ADD,addr note .endif .elseif uMsg==WM_COMMAND .if lParam==0 mov eax,wParam .if ax==IDM_EXIT invoke Shell_NotifyIcon,NIM_DELETE,addr note invoke DestroyWindow,hWnd .elseif ax==IDM_RESTORE mov toolinfo.cbSize,SIZEOF TOOLINFO mov toolinfo.uFlags,TTF_IDISHWND or TTF_TRACK m2m toolinfo.hWnd,NULL m2m toolinfo.uId,hToolBar mov toolinfo.hInst,NULL invoke SendMessage,hToolTips,TTM_TRACKACTIVATE,FALSE,ADDR toolinfo invoke DestroyWindow,hToolTips mov hToolTips,0 .endif .endif .elseif uMsg==WM_SHELLNOTIFY .if wParam==IDI_TRAY .if lParam==WM_RBUTTONDOWN invoke GetCursorPos,addr point invoke TrackPopupMenu,hPopupMenu,TPM_RIGHTALIGN,point.x,point.y,NULL,hWnd,NULL .elseif lParam==WM_MOUSEMOVE .if hToolTips==0 invoke MessageBeep,10 invoke GetCursorPos,ADDR point invoke WindowFromPoint,point.x,point.y ;это подделка дл¤ разрешени¤ 1024*768 ; реально нужно узнать координату y правого нижнего угла ; отн¤ть высоту панели задач и некоторое смещение дл¤ кульности, ; чтобы тултип рисовалс¤ не от случайной точки, а на некотором возвышении ; от панели задач ;ѕравильнее будет определ¤ть координаты (окна иконки ) иконки в трее ;тк значки в трее могут располагатьс¤ в несколько р¤дов или как в Windows 7 .if point.y > 745 && point.y < 764 mov point.y, 745 .endif mov hToolBar,eax invoke CreateWindowEx,WS_EX_TOPMOST,ADDR TOOLTIPS_CLASS,NULL,TTS_ALWAYSTIP or TTS_BALLOON,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hWnd,NULL,hInstance,NULL mov hToolTips,eax mov toolinfo.cbSize,SIZEOF TOOLINFO mov toolinfo.uFlags,TTF_IDISHWND or TTF_TRACK m2m toolinfo.hWnd,NULL m2m toolinfo.uId,hToolBar mov toolinfo.hInst,NULL mov toolinfo.lpszText,OFFSET szBuffer invoke SendMessage,hToolTips,TTM_ADDTOOL,0,ADDR toolinfo invoke SendMessage,hToolTips,TTM_SETMAXTIPWIDTH,0,500 invoke SendMessage,hToolTips,TTM_SETTITLE,1,ADDR szToolTipsCaption mov ecx,point.y shl ecx,10h mov eax,point.x or ecx,eax invoke SendMessage,hToolTips,TTM_TRACKPOSITION,0,ecx invoke SendMessage,hToolTips,TTM_TRACKACTIVATE,TRUE,ADDR toolinfo .endif .endif .endif .else invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .endif xor eax,eax ret WndProc endp end start
Поделиться323.11.2020 04:32:31
спасибо, нашёл
Страница: 1