谁有空将这段代码做成标准的DLL,我给500分他(她).如果代码作者在,也给500分.

fontz fontz 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
如果你用SPY++查看那个地方,你会发现那里其实是一个Toolbar控件,类名是"ToolbarWindow32"。所以要删除某一个图标,只要删除该图标对应的按钮即可,如何知道某个图标对应哪个按钮呢?OK,每一个图标都有一个Hint值,只要查询该图标的Hint值是否是你要删除的图标的Hint值,如果是,就直接删除那个图标。

技术难点:查询图标的Hint值是通过发送消息TB_GETBUTTONINFO来完成的,这个消息需要一个TBBUTTONINFO结构变量地址,如果直接采用如下方法:

TBBUTTONINFO tbi;

SendMessage(hTrayWnd,WM_GETBUTTONINFO,Index,&tbi);

你的Explorer.exe马上就死(刚开始我的Explorer.exe就死了好几次,还好我用的是Win2000,没事^_^), 因为tbi的地址只在你的进程里边有效,在Explorer.exe进程里边都不知道指向何方。所以解决方法就自然地转到如何让Explorer.exe进程能找到那个地址,唯一的办法就是把变量放到Explorer.exe进程里边,如果你对API比较熟悉,就回想到VirtualAllocEx函数,没错,就是它!!!!!!!!

下面是详细代码,已经测试过了,放心用吧*_^

--------------------------------------------
--------------------------------------------
--------------------------------------------
//删除scktsrvr.exe对应的托盘图标
HideSysTrayIcon("Borland Socket Server");

// HideSysTrayIcon("金山词霸");
// HideSysTrayIcon("天网防火墙");

--------------------------------------------

//参数是图标的Hint值的一部分,而不是程序的名称。比如你想隐藏的那个图标Hint值为
//"Borland Socket Server",金山词霸则可以输入"金山词霸",不能使用"金山词霸|(暂停)"。
void __fastcall TForm1::HideSysTrayIcon(AnsiString 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,"ToolbarWindow32",NULL);

GetWindowThreadProcessId(hTrayWnd,&dwProcessID);

hSourceHandle = OpenProcess(PROCESS_ALL_ACCESS,false,dwProcessID);
if(hSourceHandle == NULL)
{
Memo1->Lines->Add("Error Open Process. Err=" + SysErrorMessage(GetLastError()));
return;
}

Result = DuplicateHandle(GetCurrentProcess(),hSourceHandle,GetCurrentProcess(),
&hTargetHandle,PROCESS_ALL_ACCESS,false,0);
if(Result == 0)
{
Memo1->Lines->Add("Error Duplicate Process Handle. Err=" + SysErrorMessage(GetLastError()));
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)
{
Memo1->Lines->Add("Error Allocate Memory. Err=" + SysErrorMessage(GetLastError()));
return;
}

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

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

Memo1->Lines->Add("Count = " + IntToStr(ButtonCount));

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);

// Memo1->Lines->Add("ButtonText = " + AnsiString((char*)TempBuf) + " Hint= " + AnsiString(ATrayHint));

//采用模式查找,而不是等值查找,以提高灵活性
if(AnsiString((char*)TempBuf).LowerCase().Pos(ATrayHint.LowerCase()) > 0)
{
// Memo1->Lines->Add("Delete now");

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

delete[] TempBuf;
break;
}

delete[] TempBuf;
}

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





//原贴:

http://search.csdn.net/Expert/topic/929/929648.xml?temp=.3012354
...全文

相关推荐

高校及科研院所如何利用外部数据完善技术转移转化机制.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

完全复现虚拟同步发电机VSG自适应惯量阻尼控制仿真、根轨迹、调节系数对比(Simulink仿真、Matlab代码实现)

内容概要:本文档围绕“【完全复现】虚拟同步发电机VSG自适应惯量阻尼控制仿真、根轨迹、调节系数对比”这一主题,利用Simulink和Matlab平台,系统性地实现了虚拟同步发电机(VSG)的自适应惯量与阻尼控制策略的建模与仿真。内容涵盖VSG的核心控制原理、系统动态响应特性分析、根轨迹绘制以及在不同调节系数下的性能对比研究,旨在深入剖析关键控制参数对系统稳定性与动态性能的影响机制,为新能源并网系统中提升频率支撑能力和暂态稳定性的控制策略设计提供理论依据和技术支持。; 适合人群:具备扎实的电力系统分析与自动控制理论基础,熟练掌握Matlab/Simulink仿真工具,主要从事新能源发电、微电网运行、电力电子变换器控制或电力系统稳定研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①开展虚拟同步发电机(VSG)的建模与先进控制策略的深入研究;②探究自适应惯量与阻尼控制对改善电网频率响应速度和平抑功率波动的作用机理;③运用根轨迹法进行系统稳定性分析,并指导控制器参数的优化整定;④完成高水平学术论文撰写或科研项目申报所需的仿真复现实验。; 阅读建议:本资源以“完全复现”为核心目标,提供了完整的仿真模型与配套代码。使用者应在深入理解同步发电机转子运动方程、虚拟惯量及阻尼物理意义的基础上,结合电力系统暂态稳定理论,逐步操作并调试仿真模型,尤其需关注不同调节系数变化对系统动态性能指标(如超调量、调节时间)的影响,从而深化对VSG内在控制机制与稳定边界的认知。

天天程序猿

前端开发基于history.js的HTML5与HTML4浏览器兼容方案:单页应用无刷新历史状态管理技术实现-dQ4ehf7C1792158475

内容概要:本文系统介绍了如何利用history.js实现单页应用(SPA)在HTML5c与HTML4浏览器间s草错发的无缝历史状态管理。通过封装原生History API并在不支持的浏览器中自动降级为哈希路由,history.js解决了因浏览器兼容性导致的后退按钮失效、URL混乱等问题。文章详细讲解了其核心机制,包括状态对象管理、自动模式切换(HTML5 pushState vs HTML4 哈希)、状态数据持久化以及针,对Safari、IE等浏\览器的兼容性修复方案,并提供了从入门到实战的完整示例,涵盖初始化、事,件监听、页面加载及性能优化技巧。;DtPXB1792158476

2601_97196179

员工满意度数据集(11列,12000 条记录)CSV 合成

详情介绍:该 HR 员工数据集含 12,000 条 ×11 列(满意度、绩效评估、项目数、月均工时、司龄、工伤、福利包、晋升、部门、薪资),无缺失值但无离职标签列,且存在数据质量问题(141 条负绩效评估、144 条负工时、49.4% 异常高工伤率、项目数仅 0/1/2),疑似经过修改或合成,不能直接做经典的员工离职预测,适合做满意度回归、薪资三分类、晋升预测或员工聚类分析,使用前必须清洗异常值并注意数据真实性限制。

神仙别闹

科技服务机构如何通过数据服务增强市场竞争力?.docx

科技服务机构如何通过数据服务增强市场竞争力?

BIZKEEN
评论 9
收藏 已收藏
分享
返回顶部
fontz
Windows SDK/API 1,222 成员 8,135 内容