MASM32编程访问系统托盘区图标/07-09-29更新

简介: MASM32编程访问系统托盘区图标/07-09-29更新
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; FileName: TrayIcon.asm
;   Function: Demo the way to enum the icons in system tray
;       Author: Purple Endurer | 紫郢剑侠㊣ (​​PurpleEndurer@163.com​​​)
;     DevEnv: Win2000 pro SP4, MASM32 v8
;
;  log
; ----------------------------------------------------------------------------------
; 2007-09-29  Can run under Win XP
; 2007-09-22  Created!
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


.386

.model 
flat, 
stdcall

option 
casemap:
none


include /masm32/
include/windows.inc


include /masm32/
include/kernel32.inc

includelib /masm32/
lib/kernel32.lib


include /masm32/
include/user32.inc

includelib /masm32/
lib/user32.lib


GetSysTrayToolBarHandle 
proto

EnumSubCtl 
proto :HWND, :LPARAM

GetSysTrayIconCount 
proto

EnumSysTrayIcon 
proto


.data

g_szAppName 
db 
"EnumSysTrayIcon", 0

g_szTaskBarCls 
db 
"Shell_TrayWnd", 0

g_szSysPagerCls 
db 
"SysPager", 0    
;WinXP need!

g_szTrayNotifyWndCls 
db 
"TrayNotifyWnd", 0

g_szToolbarWindow32Cls 
db 
"ToolbarWindow32", 0

g_szFailGetSysTray 
db 
"Fail to get system tray!", 0

g_hSysTray      HANDLE ?

g_dwTrayIconCount 
dword ?

g_stTbButton TBBUTTON <>

g_szIconText 
db MAX_PATH dup (?)


.code

start:

invoke GetSysTrayToolBarHandle

test   
eax, 
eax 
; .if  eax==NULL

.if ZERO?

    
invoke MessageBox, NULL, 
addr g_szFailGetSysTray, 
addr g_szAppName, MB_ICONERROR

.else

    
mov     g_hSysTray, 
eax

    
invoke EnumSysTrayIcon

.endif

invoke ExitProcess,NULL


;

; Function: Get the handle ToolbarWindow32 of in system tray

;           Shell_TrayWnd -> TrayNotifyWnd -> (WinXP:SysPager) -> ToolbarWindow32

;    Onput: if  fail eax=NULL, else eax = handle

;/

GetSysTrayToolBarHandle 
proc

   
;--- Get the handle of task bar

   
invoke FindWindow, 
addr g_szTaskBarCls, NULL

   
cmp     
eax, NULL

   
je         @GetSysTrayToolBarHandleRet 
; fail


     
; HWND FindWindowEx(

     
;     HWND hwndParent,    // handle to parent window

     
;     HWND hwndChildAfter,    // handle to a child window 

     
;     LPCTSTR lpszClass,    // pointer to class name

     
;     LPCTSTR lpszWindow    // pointer to window name

     
; );


    
;--- Get the handle of TrayNotifyWnd in task bar

    
invoke FindWindowEx, 
eax, NULL,  
addr  g_szTrayNotifyWndCls,   NULL

    
cmp    
eax, NULL

    
je         @GetSysTrayToolBarHandleRet


    
;--- (WinXP Only) Get the handle of g_szSysPager in TrayNotifyWnd 

    
push 
eax

    
invoke FindWindowEx, 
eax, NULL,  
addr  g_szSysPagerCls, NULL

    
.if    (
eax==NULL)

        
pop 
eax

    
.else

        
pop 
edi

    
.endif


    
;--- Get the handle of ToolbarWindow32 in TrayNotifyWnd

    
invoke FindWindowEx, 
eax, NULL,  
addr  g_szToolbarWindow32Cls,   NULL


@GetSysTrayToolBarHandleRet:

    
ret

GetSysTrayToolBarHandle 
endp



;/

; Function: Enum the Child window in task bar

;/

EnumSubCtl 
proc 
proc  hWnd: HWND, lParam: LPARAM

    
invoke GetClassName, hWnd, 
addr g_szIconText, sizeof g_szIconText

    
invoke MessageBox, NULL, 
addr g_szIconText, 
addr g_szIconText, MB_OK


    
mov     
eax, 
TRUE

    
ret

EnumSubCtl 
endp



;/

; Function: Get the count of icon in system tray

;/

GetSysTrayIconCount 
proc

    
invoke SendMessage,g_hSysTray, TB_BUTTONCOUNT, 0, 0

    
mov     g_dwTrayIconCount, 
eax    

    
ret

GetSysTrayIconCount 
endp


;///

; Function: Enum the icon in system tray

;///

EnumSysTrayIcon 
proc

    
local dwProcID, dwReaded: 
dword

    
local hProcess: HANDLE

    
local pMem: 
dword


    
invoke GetSysTrayIconCount


    
invoke GetWindowThreadProcessId, g_hSysTray, 
addr dwProcID

    
invoke OpenProcess, PROCESS_VM_OPERATION 
or PROCESS_VM_READ 
or PROCESS_VM_WRITE, 
FALSE, dwProcID

    
mov    hProcess, 
eax

    
invoke VirtualAllocEx, hProcess,  NULL, 1024, MEM_RESERVE 
or MEM_COMMIT,  PAGE_READWRITE

    
mov    pMem, 
eax


    
xor      
eax, 
eax

    
.while (
eax < g_dwTrayIconCount)

        
push   
eax


        
invoke SendMessage, g_hSysTray, TB_GETBUTTON, 
eax,  pMem

        
invoke ReadProcessMemory, hProcess, pMem, 
addr g_stTbButton, sizeof g_stTbButton,  
addr dwReaded


        
invoke SendMessage, g_hSysTray, TB_GETBUTTONTEXT, g_stTbButton.idCommand,  pMem


        
inc       
eax  
; If fail, the return value is  -1

        
jz         @F   
; Fail, skip


        
invoke ReadProcessMemory, hProcess,  pMem,   
addr g_szIconText, sizeof g_szIconText, 
addr dwReaded

        
invoke MessageBox, NULL, 
addr g_szIconText, 
addr g_szAppName, NULL

@@:

        
pop      
eax

        
inc       
eax

    
.endw


    
invoke VirtualFreeEx, hProcess, pMem,  0,  MEM_RELEASE

    
invoke CloseHandle, hProcess


    
ret

EnumSysTrayIcon 
endp


end
相关文章
|
Shell 开发者 Windows
windows 10中将任意程序添加进鼠标右键菜单里面
windows 10中将任意程序添加进鼠标右键菜单的详细步骤
211 0
windows 10中将任意程序添加进鼠标右键菜单里面
Qt实用技巧:QtCreator编辑区关闭右侧不必要的警告提示
Qt实用技巧:QtCreator编辑区关闭右侧不必要的警告提示
Qt实用技巧:QtCreator编辑区关闭右侧不必要的警告提示
|
4月前
Mac系统下Qt程序图标设置方法
Mac系统下Qt程序图标设置方法
92 0
|
测试技术 Android开发
消失的Eclipse-控制台console、右侧项目导航Package Explorer、点击类不弹出内容、copy过来正确的测试单元类'废了'的解决措施、eclipse设置编译前自动保存代码
消失的Eclipse-控制台console、右侧项目导航Package Explorer、点击类不弹出内容、copy过来正确的测试单元类'废了'的解决措施、eclipse设置编译前自动保存代码
225 0
消失的Eclipse-控制台console、右侧项目导航Package Explorer、点击类不弹出内容、copy过来正确的测试单元类'废了'的解决措施、eclipse设置编译前自动保存代码
|
Windows
Win系统 - 系统双击文件总弹出属性窗口如何解决?
Win系统 - 系统双击文件总弹出属性窗口如何解决?
292 0
Win系统 - 系统双击文件总弹出属性窗口如何解决?
|
计算机视觉
Qt实用技巧:软件演示版永久提示框
Qt实用技巧:软件演示版永久提示框
Qt实用技巧:软件演示版永久提示框
|
Windows
【Windows 逆向】OD 调试器工具 ( 显示模块窗口 | 显示记录窗口 | 显示内存窗口 | 显示线程 | 显示句柄 | 显示 CPU | 多窗口界面 )(二)
【Windows 逆向】OD 调试器工具 ( 显示模块窗口 | 显示记录窗口 | 显示内存窗口 | 显示线程 | 显示句柄 | 显示 CPU | 多窗口界面 )(二)
344 0
【Windows 逆向】OD 调试器工具 ( 显示模块窗口 | 显示记录窗口 | 显示内存窗口 | 显示线程 | 显示句柄 | 显示 CPU | 多窗口界面 )(二)
|
Windows
【Windows 逆向】OD 调试器工具 ( 显示模块窗口 | 显示记录窗口 | 显示内存窗口 | 显示线程 | 显示句柄 | 显示 CPU | 多窗口界面 )(一)
【Windows 逆向】OD 调试器工具 ( 显示模块窗口 | 显示记录窗口 | 显示内存窗口 | 显示线程 | 显示句柄 | 显示 CPU | 多窗口界面 )(一)
310 0
【Windows 逆向】OD 调试器工具 ( 显示模块窗口 | 显示记录窗口 | 显示内存窗口 | 显示线程 | 显示句柄 | 显示 CPU | 多窗口界面 )(一)
Qt [GC9-4]:给我程序加上神秘的程序图标
Qt [GC9-4]:给我程序加上神秘的程序图标
105 0
Qt [GC9-4]:给我程序加上神秘的程序图标
|
Linux Windows
Qt6 防止程序多重启动,并实现双击图标显示已运行的程序
欢迎来到我的博客,希望这篇文章对你有所帮助,如果觉得不错,请点赞搜藏哈。
562 0