в архиве нашёл две версии, обе не работают, исправить не получилось
встроеная подсказка 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