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

原创 2007年09月22日 15:24:00
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; 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 flatstdcall
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   eaxeax ; .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     eaxTRUE
    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      eaxeax
    .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 start

用MASM32写的 系统托盘图标管理员 TrayIconMan 0.0.0003

功能  TrayIconMan可以列举系统托盘区中的图标,提示文本,及它们对应的程序,并控制它们的显示和隐藏状态。  有些网友反映,在windows xp 使用TrayIconMan来隐藏系统托盘图标...

使用Win32 API做个系统托盘图标

系统托盘在我们使用的程序中很普遍,下面我们来看一个很不错的例子,使用Win32 API实现,对理解系统托盘有些帮助。 转载随意,但请带上本文地址: http://www.nowamag...
  • guyue35
  • guyue35
  • 2015年05月31日 21:13
  • 429

使用Win32 API做个系统托盘图标

系统托盘在我们使用的程序中很普遍,下面我们来看一个很不错的例子,使用Win32 API实现,对理解系统托盘有些帮助。#include #define IDR_PAUSE 12 #define IDR...

使用Win32 API做个系统托盘图标

系统托盘在我们使用的程序中很普遍,下面我们来看一个很不错的例子,使用Win32 API实现,对理解系统托盘有些帮助。 001 #include ...

使用Win32 API做个系统托盘图标

系统托盘在我们使用的程序中很普遍,下面我们来看一个很不错的例子,使用Win32 API实现,对理解系统托盘有些帮助。 #include #define IDR_PAUSE 12 #de...

JFrame实现系统托盘功能缩放在任务栏,窗体图标自定义

窗体设置默认的关闭操作,在很多软件中为避免关闭按钮退出程序,会设定关闭最小化托盘的操作,JFrame同样可实现该功能;另外,自定义的窗体图标导出为jar可执行文件后,常常不显示,解决办法是将图片资源放...

C#实现WinForm程序的动态系统托盘图标

1.在主窗体中添加一个 NotifyIcon 控件-notifyIcon12.在主窗体中添加一个 ContextMenu 控件-contextMenu1,并添加菜单项3.设置 notifyIcon1 ...

实现将程序图标显示在系统托盘

长久以来,一直很好奇类似QQ等软件的图标是如何显示在系统托盘的,这次有个项目正好用到,所以就研究了一下。具体方法如下:1、首先我们需要在工具栏找到NotifyIcon这个控件,找到后将其拖到Form中...

Java swing 仿QQ实现系统托盘图标(下)

接着上次更新的java swing 仿QQ实现系统托盘图标(上),现在更新下篇,主要为托盘图标的弹出菜单添加菜单项图标。 TrayIcon只能添加PopupMenu弹出菜单,而PopupMenu弹出菜...
  • MH_ANG
  • MH_ANG
  • 2017年07月23日 13:26
  • 574
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MASM32编程访问系统托盘区图标/07-09-29更新
举报原因:
原因补充:

(最多只允许输入30个字)