哪位高手帮忙看看这段管理系统托盘的代码为什么总是运行不正确???

fbiboss001 2005-03-04 02:26:29

HideSysTrayIcon( CString& ATrayHint)
{
HWND hTrayWnd;
DWORD dwProcessID;
HANDLE hSourceHandle;
HANDLE hTargetHandle;
LPVOID pStart;
LPVOID pBufStart;
int Result;

DWORD dwAllocSize;
const int TextBufSize = 128;

///////////////////
hTrayWnd = ::FindWindow("Shell_TrayWnd",NULL);
hTrayWnd = ::FindWindowEx(hTrayWnd,0,"TrayNotifyWnd",NULL);
hTrayWnd = ::FindWindowEx(hTrayWnd,0,"SysPager",NULL);
hTrayWnd = ::FindWindowEx(hTrayWnd,0,"ToolbarWindow32",NULL);

GetWindowThreadProcessId(hTrayWnd,&dwProcessID);

hSourceHandle = OpenProcess(PROCESS_ALL_ACCESS,false,dwProcessID);
if(hSourceHandle == NULL)
{
::MessageBox(NULL,"hSourceHandle == NULL","Alert",MB_OK);
return;
}

Result = DuplicateHandle(GetCurrentProcess(),hSourceHandle,GetCurrentProcess(),
&hTargetHandle,PROCESS_ALL_ACCESS,false,0);
if(Result == 0)
{
::MessageBox(NULL,"Result == 0","Alert",MB_OK);
return;
}

dwAllocSize = sizeof(TBBUTTONINFO);
pStart = VirtualAllocEx(hTargetHandle,NULL,dwAllocSize,MEM_COMMIT,PAGE_READWRITE);
pBufStart = VirtualAllocEx(hTargetHandle,NULL,TextBufSize,MEM_COMMIT,PAGE_READWRITE);

if(pStart == NULL || pBufStart == NULL)
{
::MessageBox(NULL,"pStart == NULL || pBufStart == NULL","Alert",MB_OK);
return;
}

int ButtonCount;
// TBBUTTONINFO *Button;
// byte *TempData;
TBBUTTONINFO tbi;
byte *TempBuf;
DWORD dwWrite,dwRead;

ButtonCount = ::SendMessage(hTrayWnd,TB_BUTTONCOUNT,0,0) + 30;//随便多加几个数


for(int i=0; i < ButtonCount; i++)
{
tbi.cbSize = dwAllocSize;
tbi.dwMask = TBIF_TEXT;
tbi.pszText = (LPTSTR)pBufStart;
WriteProcessMemory(hTargetHandle,pStart,(LPVOID)&tbi,dwAllocSize,&dwWrite);

TempBuf = new byte[TextBufSize];
ZeroMemory(TempBuf,TextBufSize);
WriteProcessMemory(hTargetHandle,pBufStart,(LPVOID)TempBuf,TextBufSize,&dwWrite);

/////////////
::SendMessage(hTrayWnd,TB_GETBUTTONINFO,i,(LPARAM)((TBBUTTONINFO*)pStart));// Button);

/////////////
// TempData = new byte[dwAllocSize];
// ReadProcessMemory(hTargetHandle,(LPCVOID)pStart,TempData,dwAllocSize,&dwRead);
// Button = (TBBUTTONINFO*)TempData;
// ....
// delete[] TempData;

ReadProcessMemory(hTargetHandle,(LPCVOID)pBufStart,(LPVOID)TempBuf,TextBufSize,&dwRead);




ATrayHint.MakeLower();
CString temp=TempBuf;
temp.MakeLower();

// if( > 0)
{
// Memo1->Lines->Add("Delete now");

//删除(图标)按钮
Result = ::SendMessage(hTrayWnd,TB_DELETEBUTTON,i,0);
if(Result)
//Memo1->Lines->Add("Succeed in deleting Icon");
::MessageBox(NULL,"Succeed in deleting Icon","Alert",MB_OK);
else
//Memo1->Lines->Add("Fail to deleting Icon");
::MessageBox(NULL,"Fail to deleting Icon","Alert",MB_OK);

delete[] TempBuf;
break;
}

delete[] TempBuf;
}

VirtualFreeEx(hTargetHandle,pStart,dwAllocSize,MEM_DECOMMIT);
VirtualFreeEx(hTargetHandle,pBufStart,TextBufSize,MEM_DECOMMIT);
CloseHandle(hTargetHandle);
CloseHandle(hSourceHandle);

}
...全文
155 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
fbiboss001 2005-03-07
  • 打赏
  • 举报
回复
顶!
开始远离编程 2005-03-04
  • 打赏
  • 举报
回复
mark
fbiboss001 2005-03-04
  • 打赏
  • 举报
回复
托盘是个工具栏,不用进程的hWnd和托盘图标的uID也能删除,
只是我不知道怎么删除指定的图标,上面的代码通过TOOLTIP删的吧?
SatanLi1982 2005-03-04
  • 打赏
  • 举报
回复
www.vckbase.com上有例子,你下来看看吧
cugblue 2005-03-04
  • 打赏
  • 举报
回复
你要删除其它程序的托盘,要获得它的进程的hWnd和托盘图标的uID.
fbiboss001 2005-03-04
  • 打赏
  • 举报
回复
是管理其它程序的托盘图标,不是自己程序的,我找了没找到,
xuzheng318 2005-03-04
  • 打赏
  • 举报
回复
托盘例子很多,楼主到网上自己下吧!
fbiboss001 2005-03-04
  • 打赏
  • 举报
回复
上面都 是管理自己程序的托盘图标,没有管理整个托盘的,

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧