桌面图标弹出提示

之前看见过某些软件,安装完毕后会在桌面图标的旁边弹出一个提示框.然后就尝试着自己也实现一下这个效果.
先来看看最终效果:


实现方法

首先,必须知道图标在屏幕上的位置.用SPY类工具探测了一下(这里我用的是 彗星小助手),
发现"桌面"是一个ListView控件,既然是这个控件,那就可以发送 LVM_GETITEMTEXT消息来获取各个图标的名称,判断哪个是我们要找的.
然后发送 LVM_GETITEMRECT消息获取图标的位置.
最后在图标旁边创建一个提示窗口,这里我使用了 UpdateLayeredWindow
需要注意的是:在64位操作系统上, LVM_GETITEMTEXT时那个 LVITEM结构不太一样.需要判断一下操作系统是否64位的.

部分代码

BOOL CIconToolTipDlg::GetIconRect(HWND hDeskWnd,CString strIconName,LPRECT lpRect)
{
	BOOL bRet=FALSE;
	//-----------------------------
	//遍历外部进程所有图标
	DWORD PID=0;
	GetWindowThreadProcessId(hDeskWnd,&PID);
	HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
	if(!hProcess){
		TRACE(_T("获取进程句柄操作失败hWnd=%dPID=%d"),hDeskWnd,PID);
	}else{
		LVITEMA* pLVITEM=(LVITEMA*)VirtualAllocEx(hProcess,NULL,sizeof(LVITEM),MEM_COMMIT,PAGE_READWRITE);
		char* pszText=(char*)VirtualAllocEx(hProcess,NULL,512,MEM_COMMIT,PAGE_READWRITE);
		RECT* pItemRc=(RECT*)VirtualAllocEx(hProcess,NULL,sizeof(RECT),MEM_COMMIT,PAGE_READWRITE);
		RECT rc;
		if(!pItemRc || !pLVITEM){
			TRACE(_T("无法分配内存!"));
		}else{
			LVITEMA LVITEM;
			LVITEM.mask=LVIF_TEXT;
			LVITEM.cchTextMax=512;
			LVITEM.pszText=pszText;
			char ItemBuf[512];
			int nCount=::SendMessage(hDeskWnd,LVM_GETITEMCOUNT,0,0);
			for(int iItem=0;iItem<nCount;iItem++){
				LVITEM.iItem=iItem;
				LVITEM.iSubItem=0;
				//将设置好的结构插入目标进程
				WriteProcessMemory(hProcess,pLVITEM,&LVITEM,sizeof(LVITEM),NULL);
				//发送LVM_GETITEM消息
				BOOL r=(BOOL)::SendMessage(hDeskWnd,LVM_GETITEMTEXTA,iItem,(LPARAM)pLVITEM);
				//获取pszText
				ReadProcessMemory(hProcess,pszText,ItemBuf,512,NULL);
				CString str=CString(ItemBuf);
				//AfxMessageBox(str);
				if(str==strIconName){				
					::SendMessage (hDeskWnd,LVM_GETITEMRECT,iItem,(LPARAM)pItemRc);
					ReadProcessMemory(hProcess,pItemRc,&rc,sizeof(RECT),NULL);
					memcpy(lpRect,&rc,sizeof(RECT));
					bRet=TRUE;
					break;
				}

			}
			VirtualFreeEx(hProcess,pLVITEM,0,MEM_RELEASE);
			VirtualFreeEx(hProcess,pszText,0,MEM_RELEASE);
			VirtualFreeEx(hProcess,pItemRc,0,MEM_RELEASE);//释放内存
		}
		CloseHandle(hProcess);
	}
	//-----------------------------
	return bRet;
}

完整代码下载:

以下代码在VS2005、Windows7 x64、WindowsXP x86环境测试通过.如果哪位测试不行请留言说明一下操作系统.
下载地址1:http://download.csdn.net/detail/cometnet/3794378
下载地址2:http://www.codefans.net/soft/15697.shtml
下载地址3:http://www.2cto.com/kf/201111/111183.html

  • 2
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 27
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值