网上有很多代码,多是在32位系统下正常,64位系统则无法隐藏系统图标,分析发现原因如下。
原因:64位系统下Explorer.exe是64位的,访问其进程时结构体数据与32位系统有所差异,导致读取数据错误。
解决:按64位系统内结构读取数据赋值,结构如下:
#define SYSTEM64
#ifdef SYSTEM64
#define TBBUTTONEX _TBBUTTON64
#else
#define TBBUTTONEX _TBBUTTON
#endif
#ifdef SYSTEM64
#define TRAYDATAEX _TRAYDATA64
#else
#define TRAYDATAEX _TRAYDATA32
#endif
typedef struct _TBBUTTON64 {
int iBitmap;
int idCommand;
BYTE fsState;
BYTE fsStyle;
BYTE bReserved[6]; // padding for alignment
PVOID64 dwData;
PVOID64 iString;
} TBBUTTON64;
struct _TRAYDATA32
{
HWND hWnd;
UINT uID;
UINT uCallbackMessage;
DWORD Reserved1[2];
HICON hIcon;
DWORD Reserved2[3];
TCHAR szExePath[MAX_PATH];
TCHAR szTip[128];
} TRAYDATA32;
struct _TRAYDATA64
{
PVOID64 hWnd; //HWND 64位 8字节
UINT uID;
UINT uCallbackMessage;
DWORD Reserved1[2];
PVOID64 hIcon; //HICON 64位 8字节
DWORD Reserved2[4];
TCHAR szExePath[MAX_PATH];
TCHAR szTip[128];
} TRAYDATA64;