Самопальный System Tray Tooltip как?

Тема в разделе "WASM.WIN32", создана пользователем Codeblight, 31 дек 2006.

  1. DarkAngel

    DarkAngel New Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2010
    Сообщения:
    12
    Demon666 вот почти готовое решение спустя 3 года. :derisive:

    Код (Text):
    1. .586
    2. .model flat,stdcall
    3. option casemap:none
    4. include windows.inc
    5. include user32.inc
    6. include kernel32.inc
    7. include shell32.inc
    8. includelib user32.lib
    9. includelib kernel32.lib
    10. includelib shell32.lib
    11.  
    12.  
    13. ;-------- Debug -----------
    14. include \MASM3210\include\masm32.inc
    15. includelib \MASM3210\LIB\masm32.lib
    16. include \masm3210\include\debug.inc
    17. includelib \masm3210\lib\debug.lib
    18.  
    19.  
    20. m2m     MACRO M1,M2
    21.     push M2
    22.     pop  M1
    23. ENDM
    24.  
    25. WM_SHELLNOTIFY equ WM_USER+5
    26. IDI_TRAY equ 0
    27. IDM_RESTORE equ 1000
    28. IDM_EXIT    equ 1010
    29. WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
    30.  
    31. .data
    32. ClassName     db "TrayIconWinClass",0
    33. AppName          db "TrayIcon Demo",0
    34. RestoreString    db "&Kill ToolTips",0
    35. ExitString         db "E&xit Program",0
    36. TOOLTIPS_CLASS db "tooltips_class32",0
    37. szToolTipsCaption db "Info",0
    38. szBuffer db "Можно добавить в угол иконки точку нестандартного цвета, и найти её (GetPixel). Так найдёшь координаты."
    39. szBuffer1 db "попробуйте представить - не оч быстрая затея точки перебирать ;-) Может есть какие-нибудь более простые варианты ? :) Возможно есть у кого идеи как стандартный Balloon сделать автозакрывающимся или подобные ?",0
    40.  
    41. .data?
    42. hInstance    dd ?
    43. note NOTIFYICONDATA <>
    44. hPopupMenu    dd ?
    45. hToolTips dd ?
    46. hToolBar dd ?
    47. ;szBuffer db 2048 dup (?)
    48.  
    49. .code
    50. start:
    51.     invoke GetModuleHandle, NULL
    52.     mov    hInstance,eax
    53.     invoke WinMain, hInstance,NULL,NULL, SW_SHOWDEFAULT
    54.     invoke ExitProcess,eax
    55.  
    56. WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    57.     LOCAL wc:WNDCLASSEX
    58.     LOCAL msg:MSG
    59.     LOCAL hwnd:HWND
    60.     mov   wc.cbSize,SIZEOF WNDCLASSEX
    61.     mov   wc.style, CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
    62.     mov   wc.lpfnWndProc, OFFSET WndProc
    63.     mov   wc.cbClsExtra,NULL
    64.     mov   wc.cbWndExtra,NULL
    65.     push  hInst
    66.     pop   wc.hInstance
    67.     mov   wc.hbrBackground,COLOR_APPWORKSPACE
    68.     mov   wc.lpszMenuName,NULL
    69.     mov   wc.lpszClassName,OFFSET ClassName
    70.     invoke LoadIcon,NULL,IDI_APPLICATION
    71.     mov   wc.hIcon,eax
    72.     mov   wc.hIconSm,eax
    73.     invoke LoadCursor,NULL,IDC_ARROW
    74.     mov   wc.hCursor,eax
    75.     invoke RegisterClassEx, addr wc
    76.     invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName,ADDR AppName,\
    77.            WS_OVERLAPPED+WS_CAPTION+WS_SYSMENU+WS_MINIMIZEBOX+WS_MAXIMIZEBOX+WS_VISIBLE,CW_USEDEFAULT,\
    78.            CW_USEDEFAULT,350,200,NULL,NULL,\
    79.            hInst,NULL
    80.     mov   hwnd,eax
    81.     .while TRUE
    82.         invoke GetMessage, ADDR msg,NULL,0,0
    83.         .BREAK .IF (!eax)
    84.         invoke TranslateMessage, ADDR msg
    85.         invoke DispatchMessage, ADDR msg
    86.     .endw
    87.     mov eax,msg.wParam
    88.     ret
    89. WinMain endp
    90.  
    91. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    92.     LOCAL point:POINT
    93.     LOCAL toolinfo:TOOLINFO
    94.     .if uMsg==WM_CREATE
    95.         invoke CreatePopupMenu
    96.         mov hPopupMenu,eax
    97.         invoke AppendMenu,hPopupMenu,MF_STRING,IDM_RESTORE,addr RestoreString
    98.         invoke AppendMenu,hPopupMenu,MF_STRING,IDM_EXIT,addr ExitString
    99.        
    100.         invoke SetTimer, hWnd, 0e0e0e44h, 3000, NULL
    101.        
    102.     .elseif uMsg==WM_DESTROY
    103.         invoke PostQuitMessage,NULL
    104.        
    105.     .elseif uMsg==WM_TIMER
    106.    
    107.         invoke GetCursorPos,ADDR point
    108.         invoke WindowFromPoint,point.x,point.y
    109.         .if  eax!=hToolBar
    110.             invoke SendMessage, hWnd, WM_COMMAND,IDM_RESTORE, NULL
    111.         .endif
    112.              
    113.     .elseif uMsg==WM_SIZE
    114.         .if wParam==SIZE_MINIMIZED
    115.             mov note.cbSize,sizeof NOTIFYICONDATA
    116.             push hWnd
    117.             pop note.hwnd
    118.             mov note.uID,IDI_TRAY
    119.             mov note.uFlags,NIF_ICON+NIF_MESSAGE
    120.             mov note.uCallbackMessage,WM_SHELLNOTIFY
    121.             invoke LoadIcon,NULL,IDI_WINLOGO
    122.             mov note.hIcon,eax
    123.             invoke lstrcpy,addr note.szTip,addr AppName
    124.             invoke ShowWindow,hWnd,SW_HIDE
    125.             invoke Shell_NotifyIcon,NIM_ADD,addr note
    126.         .endif
    127.     .elseif uMsg==WM_COMMAND
    128.         .if lParam==0
    129.             mov eax,wParam
    130.             .if ax==IDM_EXIT
    131.                 invoke Shell_NotifyIcon,NIM_DELETE,addr note
    132.                 invoke DestroyWindow,hWnd
    133.             .elseif ax==IDM_RESTORE
    134.                 mov toolinfo.cbSize,SIZEOF TOOLINFO
    135.                 mov toolinfo.uFlags,TTF_IDISHWND or TTF_TRACK
    136.                 m2m toolinfo.hWnd,NULL
    137.                 m2m toolinfo.uId,hToolBar
    138.                 mov toolinfo.hInst,NULL
    139.                 invoke SendMessage,hToolTips,TTM_TRACKACTIVATE,FALSE,ADDR toolinfo
    140.                 invoke DestroyWindow,hToolTips
    141.                 mov hToolTips,0
    142.             .endif
    143.         .endif
    144.     .elseif uMsg==WM_SHELLNOTIFY
    145.         .if wParam==IDI_TRAY
    146.             .if lParam==WM_RBUTTONDOWN
    147.                 invoke GetCursorPos,addr point
    148.                 invoke TrackPopupMenu,hPopupMenu,TPM_RIGHTALIGN,point.x,point.y,NULL,hWnd,NULL
    149.            
    150.             .elseif lParam==WM_MOUSEMOVE
    151.                 .if hToolTips==0
    152.                     invoke MessageBeep,10
    153.                     invoke GetCursorPos,ADDR point
    154.                     invoke WindowFromPoint,point.x,point.y
    155.                     ;это подделка для разрешения 1024*768
    156.                     ; реально нужно узнать координату y  правого нижнего угла
    157.                     ; отнять высоту панели задач и некоторое смещение для кульности,
    158.                     ; чтобы тултип рисовался не от случайной точки, а на некотором возвышении
    159.                     ; от панели задач
    160. ;Правильнее будет определять координаты (окна иконки ) иконки в трее
    161. ;тк значки в трее могут располагаться в несколько рядов или как в Windows 7  
    162.                     .if point.y > 745 && point.y < 764
    163.                         mov point.y, 745
    164.                     .endif
    165.                    
    166.                     mov hToolBar,eax
    167.                     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
    168.                     mov hToolTips,eax
    169.                     mov toolinfo.cbSize,SIZEOF TOOLINFO
    170.                     mov toolinfo.uFlags,TTF_IDISHWND or TTF_TRACK
    171.                     m2m toolinfo.hWnd,NULL
    172.                     m2m toolinfo.uId,hToolBar
    173.                     mov toolinfo.hInst,NULL
    174.                     mov toolinfo.lpszText,OFFSET szBuffer
    175.                     invoke SendMessage,hToolTips,TTM_ADDTOOL,0,ADDR toolinfo
    176.                     invoke SendMessage,hToolTips,TTM_SETMAXTIPWIDTH,0,500
    177.                     invoke SendMessage,hToolTips,TTM_SETTITLE,1,ADDR szToolTipsCaption
    178.                     mov ecx,point.y
    179.                     shl ecx,10h
    180.                     mov eax,point.x
    181.                     or ecx,eax
    182.                     invoke SendMessage,hToolTips,TTM_TRACKPOSITION,0,ecx
    183.                     invoke SendMessage,hToolTips,TTM_TRACKACTIVATE,TRUE,ADDR toolinfo
    184.                 .endif
    185.             .endif
    186.         .endif
    187.     .else
    188.         invoke DefWindowProc,hWnd,uMsg,wParam,lParam        
    189.         ret
    190.     .endif
    191.     xor eax,eax
    192.     ret
    193. WndProc endp
    194.  
    195. end start
    .