PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Своя подсказка в Tray


Своя подсказка в Tray

Сообщений 1 страница 3 из 3

1

в архиве нашёл две версии, обе не работают, исправить не получилось
встроеная подсказка 64 символа, маловато это, и она по разному отображается в разных виндах
поиск даёт только подсказки для гаджетов или я не так искал

0

2

не разбирался, 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

0

3

спасибо, нашёл

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Своя подсказка в Tray